github.com/mithrandie/csvq@v1.18.1/lib/json/query_test.go (about)

     1  package json
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  
     7  	"github.com/mithrandie/csvq/lib/value"
     8  
     9  	"github.com/mithrandie/go-text/json"
    10  )
    11  
    12  var loadValueTests = []struct {
    13  	Query  string
    14  	Json   string
    15  	Expect value.Primary
    16  	Error  string
    17  }{
    18  	{
    19  		Query:  "key",
    20  		Json:   "{\"key\":\"value\"}",
    21  		Expect: value.NewString("value"),
    22  	},
    23  	{
    24  		Query: "'key",
    25  		Json:  "{\"key\":\"value\"}",
    26  		Error: "column 4: string not terminated",
    27  	},
    28  	{
    29  		Query: "key",
    30  		Json:  "{\"key\":\"valu",
    31  		Error: "line 1, column 12: unexpected termination",
    32  	},
    33  }
    34  
    35  func TestLoadValue(t *testing.T) {
    36  	for _, v := range loadValueTests {
    37  		result, err := LoadValue(v.Query, v.Json)
    38  		if err != nil {
    39  			if len(v.Error) < 1 {
    40  				t.Errorf("unexpected error %q for %q, %q", err.Error(), v.Query, v.Json)
    41  			} else if err.Error() != v.Error {
    42  				t.Errorf("error %q, want error %q for %q, %q", err, v.Error, v.Query, v.Json)
    43  			}
    44  			continue
    45  		}
    46  		if 0 < len(v.Error) {
    47  			t.Errorf("no error, want error %q for %q, %q", v.Error, v.Query, v.Json)
    48  			continue
    49  		}
    50  		if !reflect.DeepEqual(result, v.Expect) {
    51  			t.Errorf("result = %#v, want %#v for %q, %q", result, v.Expect, v.Query, v.Json)
    52  		}
    53  	}
    54  }
    55  
    56  var loadRowValueTests = []struct {
    57  	Query  string
    58  	Json   string
    59  	Expect []value.Primary
    60  	Error  string
    61  }{
    62  	{
    63  		Query: "key[]",
    64  		Json:  "{\"key\":[1, 2, 3]}",
    65  		Expect: []value.Primary{
    66  			value.NewFloat(1),
    67  			value.NewFloat(2),
    68  			value.NewFloat(3),
    69  		},
    70  	},
    71  	{
    72  		Query: "notexist[]",
    73  		Json:  "{\"key\":[{\"key2\":2, \"key3\": 3}]}",
    74  		Error: "json value does not exists for \"notexist[]\"",
    75  	},
    76  	{
    77  		Query: "key[]",
    78  		Json:  "{\"key\":\"value\"}",
    79  		Error: "json value must be an array",
    80  	},
    81  }
    82  
    83  func TestLoadRowValue(t *testing.T) {
    84  	for _, v := range loadRowValueTests {
    85  		result, err := LoadArray(v.Query, v.Json)
    86  		if err != nil {
    87  			if len(v.Error) < 1 {
    88  				t.Errorf("unexpected error %q for %q, %q", err.Error(), v.Query, v.Json)
    89  			} else if err.Error() != v.Error {
    90  				t.Errorf("error %q, want error %q for %q, %q", err, v.Error, v.Query, v.Json)
    91  			}
    92  			continue
    93  		}
    94  		if 0 < len(v.Error) {
    95  			t.Errorf("no error, want error %q for %q, %q", v.Error, v.Query, v.Json)
    96  			continue
    97  		}
    98  		if !reflect.DeepEqual(result, v.Expect) {
    99  			t.Errorf("result = %#v, want %#v for %q, %q", result, v.Expect, v.Query, v.Json)
   100  		}
   101  	}
   102  }
   103  
   104  var loadTableTests = []struct {
   105  	Query        string
   106  	Json         string
   107  	ExpectHeader []string
   108  	ExpectValues [][]value.Primary
   109  	EscapeType   json.EscapeType
   110  	Error        string
   111  }{
   112  	{
   113  		Query:        "key{}",
   114  		Json:         "{\"key\":[{\"key2\":2, \"key3\": 3}, {\"key2\":4, \"key3\": 5}]}",
   115  		ExpectHeader: []string{"key2", "key3"},
   116  		ExpectValues: [][]value.Primary{
   117  			{
   118  				value.NewFloat(2),
   119  				value.NewFloat(3),
   120  			},
   121  			{
   122  				value.NewFloat(4),
   123  				value.NewFloat(5),
   124  			},
   125  		},
   126  	},
   127  	{
   128  		Query: "notexist{}",
   129  		Json:  "{\"key\":[{\"key2\":2, \"key3\": 3}]}",
   130  		Error: "json value does not exists for \"notexist{}\"",
   131  	},
   132  	{
   133  		Query: "key{}",
   134  		Json:  "{\"key\":[{\"key2\":2, \"key3\": 3}, {\"key2\":4, key3: 5}]}",
   135  		Error: "line 1, column 43: unexpected token \"key\"",
   136  	},
   137  }
   138  
   139  func TestLoadTable(t *testing.T) {
   140  	for _, v := range loadTableTests {
   141  		header, values, et, err := LoadTable(v.Query, v.Json)
   142  		if err != nil {
   143  			if len(v.Error) < 1 {
   144  				t.Errorf("unexpected error %q for %q, %q", err.Error(), v.Query, v.Json)
   145  			} else if err.Error() != v.Error {
   146  				t.Errorf("error %q, want error %q for %q, %q", err, v.Error, v.Query, v.Json)
   147  			}
   148  			continue
   149  		}
   150  		if 0 < len(v.Error) {
   151  			t.Errorf("no error, want error %q for %q, %q", v.Error, v.Query, v.Json)
   152  			continue
   153  		}
   154  		if !reflect.DeepEqual(header, v.ExpectHeader) {
   155  			t.Errorf("header = %#v, want %#v for %q, %q", header, v.ExpectHeader, v.Query, v.Json)
   156  		}
   157  		if !reflect.DeepEqual(values, v.ExpectValues) {
   158  			t.Errorf("values = %#v, want %#v for %q, %q", values, v.ExpectValues, v.Query, v.Json)
   159  		}
   160  		if et != v.EscapeType {
   161  			t.Errorf("escape type = %d, want %d for %q, %q", et, v.EscapeType, v.Query, v.Json)
   162  		}
   163  	}
   164  }
   165  
   166  var extractTests = []struct {
   167  	Query  QueryExpression
   168  	Data   json.Structure
   169  	Expect json.Structure
   170  	Error  string
   171  }{
   172  	{
   173  		Query: nil,
   174  		Data: json.Object{
   175  			Members: []json.ObjectMember{
   176  				{
   177  					Key:   "key",
   178  					Value: json.String("value"),
   179  				},
   180  				{
   181  					Key: "obj",
   182  					Value: json.Object{
   183  						Members: []json.ObjectMember{
   184  							{
   185  								Key:   "key2",
   186  								Value: json.String("value2"),
   187  							},
   188  						},
   189  					},
   190  				},
   191  			},
   192  		},
   193  		Expect: json.Object{
   194  			Members: []json.ObjectMember{
   195  				{
   196  					Key:   "key",
   197  					Value: json.String("value"),
   198  				},
   199  				{
   200  					Key: "obj",
   201  					Value: json.Object{
   202  						Members: []json.ObjectMember{
   203  							{
   204  								Key:   "key2",
   205  								Value: json.String("value2"),
   206  							},
   207  						},
   208  					},
   209  				},
   210  			},
   211  		},
   212  	},
   213  	{
   214  		Query: Element{
   215  			Label: "obj",
   216  			Child: Element{
   217  				Label: "key2",
   218  			},
   219  		},
   220  		Data: json.Object{
   221  			Members: []json.ObjectMember{
   222  				{
   223  					Key:   "key",
   224  					Value: json.String("value"),
   225  				},
   226  				{
   227  					Key: "obj",
   228  					Value: json.Object{
   229  						Members: []json.ObjectMember{
   230  							{
   231  								Key:   "key2",
   232  								Value: json.String("value2"),
   233  							},
   234  						},
   235  					},
   236  				},
   237  			},
   238  		},
   239  		Expect: json.String("value2"),
   240  	},
   241  	{
   242  		Query: Element{
   243  			Label: "notexist",
   244  		},
   245  		Data: json.Object{
   246  			Members: []json.ObjectMember{
   247  				{
   248  					Key:   "key",
   249  					Value: json.String("value"),
   250  				},
   251  			},
   252  		},
   253  		Expect: json.Null{},
   254  	},
   255  	{
   256  		Query: Element{
   257  			Label: "notexist",
   258  		},
   259  		Data:   json.String("value"),
   260  		Expect: json.Null{},
   261  	},
   262  	{
   263  		Query: ArrayItem{
   264  			Index: 1,
   265  			Child: Element{
   266  				Label: "key2",
   267  			},
   268  		},
   269  		Data: json.Array{
   270  			json.Object{
   271  				Members: []json.ObjectMember{
   272  					{
   273  						Key:   "key",
   274  						Value: json.String("value"),
   275  					},
   276  					{
   277  						Key:   "key2",
   278  						Value: json.String("value2"),
   279  					},
   280  				},
   281  			},
   282  			json.Object{
   283  				Members: []json.ObjectMember{
   284  					{
   285  						Key:   "key",
   286  						Value: json.String("value10"),
   287  					},
   288  					{
   289  						Key:   "key2",
   290  						Value: json.String("value12"),
   291  					},
   292  				},
   293  			},
   294  		},
   295  		Expect: json.String("value12"),
   296  	},
   297  	{
   298  		Query: ArrayItem{
   299  			Index: 0,
   300  		},
   301  		Data: json.Array{
   302  			json.String("value1"),
   303  			json.String("value2"),
   304  		},
   305  		Expect: json.String("value1"),
   306  	},
   307  	{
   308  		Query: ArrayItem{
   309  			Index: 3,
   310  		},
   311  		Data: json.Array{
   312  			json.String("value1"),
   313  			json.String("value2"),
   314  		},
   315  		Expect: json.Null{},
   316  	},
   317  	{
   318  		Query: ArrayItem{
   319  			Index: 3,
   320  		},
   321  		Data:   json.String("value1"),
   322  		Expect: json.Null{},
   323  	},
   324  	{
   325  		Query: RowValueExpr{},
   326  		Data: json.Array{
   327  			json.String("value1"),
   328  			json.String("value2"),
   329  		},
   330  		Expect: json.Array{
   331  			json.String("value1"),
   332  			json.String("value2"),
   333  		},
   334  	},
   335  	{
   336  		Query: RowValueExpr{
   337  			Child: Element{Label: "key"},
   338  		},
   339  		Data: json.Array{
   340  			json.Object{
   341  				Members: []json.ObjectMember{
   342  					{
   343  						Key:   "key",
   344  						Value: json.String("value"),
   345  					},
   346  					{
   347  						Key:   "key2",
   348  						Value: json.String("value2"),
   349  					},
   350  				},
   351  			},
   352  			json.Object{
   353  				Members: []json.ObjectMember{
   354  					{
   355  						Key:   "key",
   356  						Value: json.String("value10"),
   357  					},
   358  					{
   359  						Key:   "key2",
   360  						Value: json.String("value12"),
   361  					},
   362  				},
   363  			},
   364  		},
   365  		Expect: json.Array{
   366  			json.String("value"),
   367  			json.String("value10"),
   368  		},
   369  	},
   370  	{
   371  		Query: RowValueExpr{},
   372  		Data:  json.String("value1"),
   373  		Error: "json value must be an array",
   374  	},
   375  	{
   376  		Query: RowValueExpr{
   377  			Child: RowValueExpr{},
   378  		},
   379  		Data: json.Array{
   380  			json.String("value1"),
   381  			json.String("value2"),
   382  		},
   383  		Error: "json value must be an array",
   384  	},
   385  	{
   386  		Query: TableExpr{},
   387  		Data: json.Object{
   388  			Members: []json.ObjectMember{
   389  				{
   390  					Key:   "key",
   391  					Value: json.String("value"),
   392  				},
   393  				{
   394  					Key:   "key2",
   395  					Value: json.String("value2"),
   396  				},
   397  			},
   398  		},
   399  		Expect: json.Array{
   400  			json.Object{
   401  				Members: []json.ObjectMember{
   402  					{
   403  						Key:   "key",
   404  						Value: json.String("value"),
   405  					},
   406  					{
   407  						Key:   "key2",
   408  						Value: json.String("value2"),
   409  					},
   410  				},
   411  			},
   412  		},
   413  	},
   414  	{
   415  		Query: TableExpr{
   416  			Fields: []FieldExpr{
   417  				{
   418  					Element: Element{
   419  						Label: "key2",
   420  						Child: Element{Label: "key3"},
   421  					},
   422  					Alias: "key3",
   423  				},
   424  				{
   425  					Element: Element{Label: "key"},
   426  				},
   427  			},
   428  		},
   429  		Data: json.Object{
   430  			Members: []json.ObjectMember{
   431  				{
   432  					Key:   "key",
   433  					Value: json.String("value"),
   434  				},
   435  				{
   436  					Key: "key2",
   437  					Value: json.Object{
   438  						Members: []json.ObjectMember{
   439  							{
   440  								Key:   "key3",
   441  								Value: json.String("value3"),
   442  							},
   443  							{
   444  								Key:   "key4",
   445  								Value: json.String("value4"),
   446  							},
   447  						},
   448  					},
   449  				},
   450  			},
   451  		},
   452  		Expect: json.Array{
   453  			json.Object{
   454  				Members: []json.ObjectMember{
   455  					{
   456  						Key:   "key3",
   457  						Value: json.String("value3"),
   458  					},
   459  					{
   460  						Key:   "key",
   461  						Value: json.String("value"),
   462  					},
   463  				},
   464  			},
   465  		},
   466  	},
   467  	{
   468  		Query: TableExpr{},
   469  		Data: json.Array{
   470  			json.Object{
   471  				Members: []json.ObjectMember{
   472  					{
   473  						Key: "key2",
   474  						Value: json.Object{
   475  							Members: []json.ObjectMember{
   476  								{
   477  									Key:   "key3",
   478  									Value: json.String("value3"),
   479  								},
   480  								{
   481  									Key:   "key4",
   482  									Value: json.String("value4"),
   483  								},
   484  							},
   485  						},
   486  					},
   487  				},
   488  			},
   489  			json.Object{
   490  				Members: []json.ObjectMember{
   491  					{
   492  						Key:   "key",
   493  						Value: json.String("value11"),
   494  					},
   495  					{
   496  						Key: "key2",
   497  						Value: json.Object{
   498  							Members: []json.ObjectMember{
   499  								{
   500  									Key:   "key3",
   501  									Value: json.String("value13"),
   502  								},
   503  								{
   504  									Key:   "key4",
   505  									Value: json.String("value14"),
   506  								},
   507  							},
   508  						},
   509  					},
   510  					{
   511  						Key:   "key9",
   512  						Value: json.String("value19"),
   513  					},
   514  				},
   515  			},
   516  		},
   517  		Expect: json.Array{
   518  			json.Object{
   519  				Members: []json.ObjectMember{
   520  					{
   521  						Key: "key2",
   522  						Value: json.Object{
   523  							Members: []json.ObjectMember{
   524  								{
   525  									Key:   "key3",
   526  									Value: json.String("value3"),
   527  								},
   528  								{
   529  									Key:   "key4",
   530  									Value: json.String("value4"),
   531  								},
   532  							},
   533  						},
   534  					},
   535  					{
   536  						Key:   "key",
   537  						Value: json.Null{},
   538  					},
   539  					{
   540  						Key:   "key9",
   541  						Value: json.Null{},
   542  					},
   543  				},
   544  			},
   545  			json.Object{
   546  				Members: []json.ObjectMember{
   547  					{
   548  						Key: "key2",
   549  						Value: json.Object{
   550  							Members: []json.ObjectMember{
   551  								{
   552  									Key:   "key3",
   553  									Value: json.String("value13"),
   554  								},
   555  								{
   556  									Key:   "key4",
   557  									Value: json.String("value14"),
   558  								},
   559  							},
   560  						},
   561  					},
   562  					{
   563  						Key:   "key",
   564  						Value: json.String("value11"),
   565  					},
   566  					{
   567  						Key:   "key9",
   568  						Value: json.String("value19"),
   569  					},
   570  				},
   571  			},
   572  		},
   573  	},
   574  	{
   575  		Query: TableExpr{
   576  			Fields: []FieldExpr{
   577  				{
   578  					Element: Element{
   579  						Label: "key2",
   580  						Child: Element{Label: "key3"},
   581  					},
   582  					Alias: "key3",
   583  				},
   584  				{
   585  					Element: Element{Label: "key"},
   586  				},
   587  				{
   588  					Element: Element{Label: "key5"},
   589  				},
   590  			},
   591  		},
   592  		Data: json.Array{
   593  			json.Object{
   594  				Members: []json.ObjectMember{
   595  					{
   596  						Key: "key2",
   597  						Value: json.Object{
   598  							Members: []json.ObjectMember{
   599  								{
   600  									Key:   "key3",
   601  									Value: json.String("value3"),
   602  								},
   603  								{
   604  									Key:   "key4",
   605  									Value: json.String("value4"),
   606  								},
   607  							},
   608  						},
   609  					},
   610  				},
   611  			},
   612  			json.Object{
   613  				Members: []json.ObjectMember{
   614  					{
   615  						Key:   "key",
   616  						Value: json.String("value11"),
   617  					},
   618  					{
   619  						Key: "key2",
   620  						Value: json.Object{
   621  							Members: []json.ObjectMember{
   622  								{
   623  									Key:   "key3",
   624  									Value: json.String("value13"),
   625  								},
   626  								{
   627  									Key:   "key4",
   628  									Value: json.String("value14"),
   629  								},
   630  							},
   631  						},
   632  					},
   633  					{
   634  						Key:   "key9",
   635  						Value: json.String("value19"),
   636  					},
   637  				},
   638  			},
   639  		},
   640  		Expect: json.Array{
   641  			json.Object{
   642  				Members: []json.ObjectMember{
   643  					{
   644  						Key:   "key3",
   645  						Value: json.String("value3"),
   646  					},
   647  					{
   648  						Key:   "key",
   649  						Value: json.Null{},
   650  					},
   651  					{
   652  						Key:   "key5",
   653  						Value: json.Null{},
   654  					},
   655  				},
   656  			},
   657  			json.Object{
   658  				Members: []json.ObjectMember{
   659  					{
   660  						Key:   "key3",
   661  						Value: json.String("value13"),
   662  					},
   663  					{
   664  						Key:   "key",
   665  						Value: json.String("value11"),
   666  					},
   667  					{
   668  						Key:   "key5",
   669  						Value: json.Null{},
   670  					},
   671  				},
   672  			},
   673  		},
   674  	},
   675  	{
   676  		Query: TableExpr{},
   677  		Data: json.Array{
   678  			json.String("value1"),
   679  			json.String("value2"),
   680  		},
   681  		Error: "all elements in array must be objects",
   682  	},
   683  	{
   684  		Query: TableExpr{
   685  			Fields: []FieldExpr{
   686  				{
   687  					Element: Element{
   688  						Label: "key2",
   689  						Child: RowValueExpr{},
   690  					},
   691  				},
   692  				{
   693  					Element: Element{Label: "key"},
   694  				},
   695  			},
   696  		},
   697  		Data: json.Array{
   698  			json.Object{
   699  				Members: []json.ObjectMember{
   700  					{
   701  						Key: "key2",
   702  						Value: json.Object{
   703  							Members: []json.ObjectMember{
   704  								{
   705  									Key:   "key3",
   706  									Value: json.String("value3"),
   707  								},
   708  								{
   709  									Key:   "key4",
   710  									Value: json.String("value4"),
   711  								},
   712  							},
   713  						},
   714  					},
   715  				},
   716  			},
   717  			json.Object{
   718  				Members: []json.ObjectMember{
   719  					{
   720  						Key:   "key",
   721  						Value: json.String("value11"),
   722  					},
   723  					{
   724  						Key: "key2",
   725  						Value: json.Object{
   726  							Members: []json.ObjectMember{
   727  								{
   728  									Key:   "key3",
   729  									Value: json.String("value13"),
   730  								},
   731  								{
   732  									Key:   "key4",
   733  									Value: json.String("value14"),
   734  								},
   735  							},
   736  						},
   737  					},
   738  					{
   739  						Key:   "key9",
   740  						Value: json.String("value19"),
   741  					},
   742  				},
   743  			},
   744  		},
   745  		Error: "json value must be an array",
   746  	},
   747  	{
   748  		Query: TableExpr{
   749  			Fields: []FieldExpr{
   750  				{
   751  					Element: Element{
   752  						Label: "key2",
   753  						Child: RowValueExpr{},
   754  					},
   755  				},
   756  				{
   757  					Element: Element{Label: "key"},
   758  				},
   759  			},
   760  		},
   761  		Data: json.Object{
   762  			Members: []json.ObjectMember{
   763  				{
   764  					Key: "key2",
   765  					Value: json.Object{
   766  						Members: []json.ObjectMember{
   767  							{
   768  								Key:   "key3",
   769  								Value: json.String("value3"),
   770  							},
   771  							{
   772  								Key:   "key4",
   773  								Value: json.String("value4"),
   774  							},
   775  						},
   776  					},
   777  				},
   778  			},
   779  		},
   780  		Error: "json value must be an array",
   781  	},
   782  	{
   783  		Query: TableExpr{},
   784  		Data:  json.String("value1"),
   785  		Error: "json value must be an array or object",
   786  	},
   787  	{
   788  		Query: FieldExpr{},
   789  		Data:  json.String("value1"),
   790  		Error: "invalid expression",
   791  	},
   792  }
   793  
   794  func TestExtract(t *testing.T) {
   795  	for _, v := range extractTests {
   796  		result, err := Extract(v.Query, v.Data)
   797  		if err != nil {
   798  			if len(v.Error) < 1 {
   799  				t.Errorf("unexpected error %q for %q, %q", err.Error(), v.Query, v.Data)
   800  			} else if err.Error() != v.Error {
   801  				t.Errorf("error %q, want error %q for %q, %q", err, v.Error, v.Query, v.Data)
   802  			}
   803  			continue
   804  		}
   805  		if 0 < len(v.Error) {
   806  			t.Errorf("no error, want error %q for %q, %q", v.Error, v.Query, v.Data)
   807  			continue
   808  		}
   809  		if !reflect.DeepEqual(result, v.Expect) {
   810  			t.Errorf("result = %#v, want %#v for %q, %q", result, v.Expect, v.Query, v.Data)
   811  		}
   812  	}
   813  }