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

     1  package json
     2  
     3  import (
     4  	"context"
     5  	"reflect"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/mithrandie/csvq/lib/value"
    10  	"github.com/mithrandie/go-text/json"
    11  	"github.com/mithrandie/ternary"
    12  )
    13  
    14  var location, _ = time.LoadLocation("UTC")
    15  
    16  var convertToValueTests = []struct {
    17  	Input  json.Structure
    18  	Expect value.Primary
    19  }{
    20  	{
    21  		Input:  json.Number(-2.34),
    22  		Expect: value.NewFloat(-2.34),
    23  	},
    24  	{
    25  		Input:  json.Number(234),
    26  		Expect: value.NewFloat(234),
    27  	},
    28  	{
    29  		Input:  json.String("abc"),
    30  		Expect: value.NewString("abc"),
    31  	},
    32  	{
    33  		Input:  json.Boolean(false),
    34  		Expect: value.NewBoolean(false),
    35  	},
    36  	{
    37  		Input:  json.Null{},
    38  		Expect: value.NewNull(),
    39  	},
    40  	{
    41  		Input: json.Array{
    42  			json.String("abc"),
    43  			json.String("def"),
    44  		},
    45  		Expect: value.NewString("[\"abc\",\"def\"]"),
    46  	},
    47  	{
    48  		Input: json.Object{
    49  			Members: []json.ObjectMember{
    50  				{
    51  					Key:   "key1",
    52  					Value: json.String("value1"),
    53  				},
    54  				{
    55  					Key:   "key2",
    56  					Value: json.String("value2"),
    57  				},
    58  			},
    59  		},
    60  		Expect: value.NewString("{\"key1\":\"value1\",\"key2\":\"value2\"}"),
    61  	},
    62  }
    63  
    64  func TestConvertToValue(t *testing.T) {
    65  	for _, v := range convertToValueTests {
    66  		result := ConvertToValue(v.Input)
    67  		if !reflect.DeepEqual(result, v.Expect) {
    68  			t.Errorf("result = %#v, want %#v for %#v", result, v.Expect, v.Input)
    69  		}
    70  	}
    71  }
    72  
    73  var convertToArrayTests = []struct {
    74  	Input  json.Array
    75  	Expect []value.Primary
    76  }{
    77  	{
    78  		Input: json.Array{
    79  			json.String("elem1"),
    80  			json.String("elem2"),
    81  		},
    82  		Expect: []value.Primary{
    83  			value.NewString("elem1"),
    84  			value.NewString("elem2"),
    85  		},
    86  	},
    87  }
    88  
    89  func TestConvertToArray(t *testing.T) {
    90  	for _, v := range convertToArrayTests {
    91  		rowValue := ConvertToArray(v.Input)
    92  		if !reflect.DeepEqual(rowValue, v.Expect) {
    93  			t.Errorf("result = %#v, want %#v for %q", rowValue, v.Expect, v.Input)
    94  		}
    95  	}
    96  }
    97  
    98  var convertToTableValueTests = []struct {
    99  	Input        json.Array
   100  	ExpectHeader []string
   101  	ExpectRows   [][]value.Primary
   102  	Error        string
   103  }{
   104  	{
   105  		Input: json.Array{
   106  			json.Object{
   107  				Members: []json.ObjectMember{
   108  					{
   109  						Key:   "key1",
   110  						Value: json.Number(1),
   111  					},
   112  					{
   113  						Key:   "key2",
   114  						Value: json.Number(2),
   115  					},
   116  					{
   117  						Key:   "key3",
   118  						Value: json.Number(3),
   119  					},
   120  				},
   121  			},
   122  			json.Object{
   123  				Members: []json.ObjectMember{
   124  					{
   125  						Key:   "key2",
   126  						Value: json.Number(22),
   127  					},
   128  					{
   129  						Key:   "key3",
   130  						Value: json.Number(23),
   131  					},
   132  					{
   133  						Key:   "key2",
   134  						Value: json.Number(24),
   135  					},
   136  				},
   137  			},
   138  		},
   139  		ExpectHeader: []string{
   140  			"key1",
   141  			"key2",
   142  			"key3",
   143  		},
   144  		ExpectRows: [][]value.Primary{
   145  			{
   146  				value.NewFloat(1),
   147  				value.NewFloat(2),
   148  				value.NewFloat(3),
   149  			},
   150  			{
   151  				value.NewNull(),
   152  				value.NewFloat(22),
   153  				value.NewFloat(23),
   154  			},
   155  		},
   156  	},
   157  	{
   158  		Input: json.Array{
   159  			json.Object{
   160  				Members: []json.ObjectMember{
   161  					{
   162  						Key:   "key1",
   163  						Value: json.Number(1),
   164  					},
   165  					{
   166  						Key:   "key2",
   167  						Value: json.Number(2),
   168  					},
   169  					{
   170  						Key:   "key3",
   171  						Value: json.Number(3),
   172  					},
   173  				},
   174  			},
   175  			json.String("abc"),
   176  		},
   177  		Error: "rows loaded from json must be objects",
   178  	},
   179  }
   180  
   181  func TestConvertToTableValue(t *testing.T) {
   182  	for _, v := range convertToTableValueTests {
   183  		header, rows, err := ConvertToTableValue(v.Input)
   184  		if err != nil {
   185  			if len(v.Error) < 1 {
   186  				t.Errorf("unexpected error %q for %q", err.Error(), v.Input)
   187  			} else if err.Error() != v.Error {
   188  				t.Errorf("error %q, want error %q for %q", err, v.Error, v.Input)
   189  			}
   190  			continue
   191  		}
   192  		if 0 < len(v.Error) {
   193  			t.Errorf("no error, want error %q for %q", v.Error, v.Input)
   194  			continue
   195  		}
   196  		if !reflect.DeepEqual(header, v.ExpectHeader) {
   197  			t.Errorf("header = %#v, want %#v for %q", header, v.ExpectHeader, v.Input)
   198  		}
   199  		if !reflect.DeepEqual(rows, v.ExpectRows) {
   200  			t.Errorf("rows = %#v, want %#v for %q", rows, v.ExpectRows, v.Input)
   201  		}
   202  	}
   203  }
   204  
   205  var convertTableValueToJsonStructureTests = []struct {
   206  	Fields []string
   207  	Rows   [][]value.Primary
   208  	Expect json.Structure
   209  	Error  string
   210  }{
   211  	{
   212  		Fields: []string{
   213  			"column1",
   214  			"column2",
   215  		},
   216  		Rows: [][]value.Primary{
   217  			{
   218  				value.NewString("a"),
   219  				value.NewInteger(1),
   220  			},
   221  			{
   222  				value.NewString("b"),
   223  				value.NewFloat(0.2),
   224  			},
   225  		},
   226  		Expect: json.Array{
   227  			json.Object{
   228  				Members: []json.ObjectMember{
   229  					{
   230  						Key:   "column1",
   231  						Value: json.String("a"),
   232  					},
   233  					{
   234  						Key:   "column2",
   235  						Value: json.Integer(1),
   236  					},
   237  				},
   238  			},
   239  			json.Object{
   240  				Members: []json.ObjectMember{
   241  					{
   242  						Key:   "column1",
   243  						Value: json.String("b"),
   244  					},
   245  					{
   246  						Key:   "column2",
   247  						Value: json.Float(0.2),
   248  					},
   249  				},
   250  			},
   251  		},
   252  	},
   253  	{
   254  		Fields: []string{
   255  			"column1",
   256  			"column2.child1.child11",
   257  			"column2.child2.child22",
   258  		},
   259  		Rows: [][]value.Primary{
   260  			{
   261  				value.NewString("a"),
   262  				value.NewInteger(1),
   263  				value.NewInteger(11),
   264  			},
   265  			{
   266  				value.NewString("b"),
   267  				value.NewInteger(2),
   268  				value.NewInteger(22),
   269  			},
   270  		},
   271  		Expect: json.Array{
   272  			json.Object{
   273  				Members: []json.ObjectMember{
   274  					{
   275  						Key:   "column1",
   276  						Value: json.String("a"),
   277  					},
   278  					{
   279  						Key: "column2",
   280  						Value: json.Object{
   281  							Members: []json.ObjectMember{
   282  								{
   283  									Key: "child1",
   284  									Value: json.Object{
   285  										Members: []json.ObjectMember{
   286  											{
   287  												Key:   "child11",
   288  												Value: json.Integer(1),
   289  											},
   290  										},
   291  									},
   292  								},
   293  								{
   294  									Key: "child2",
   295  									Value: json.Object{
   296  										Members: []json.ObjectMember{
   297  											{
   298  												Key:   "child22",
   299  												Value: json.Integer(11),
   300  											},
   301  										},
   302  									},
   303  								},
   304  							},
   305  						},
   306  					},
   307  				},
   308  			},
   309  			json.Object{
   310  				Members: []json.ObjectMember{
   311  					{
   312  						Key:   "column1",
   313  						Value: json.String("b"),
   314  					},
   315  					{
   316  						Key: "column2",
   317  						Value: json.Object{
   318  							Members: []json.ObjectMember{
   319  								{
   320  									Key: "child1",
   321  									Value: json.Object{
   322  										Members: []json.ObjectMember{
   323  											{
   324  												Key:   "child11",
   325  												Value: json.Integer(2),
   326  											},
   327  										},
   328  									},
   329  								},
   330  								{
   331  									Key: "child2",
   332  									Value: json.Object{
   333  										Members: []json.ObjectMember{
   334  											{
   335  												Key:   "child22",
   336  												Value: json.Integer(22),
   337  											},
   338  										},
   339  									},
   340  								},
   341  							},
   342  						},
   343  					},
   344  				},
   345  			},
   346  		},
   347  	},
   348  	{
   349  		Fields: []string{
   350  			"string",
   351  			"integer",
   352  			"float",
   353  			"boolean",
   354  			"ternary",
   355  			"ternary2",
   356  			"datetime",
   357  			"null",
   358  		},
   359  		Rows: [][]value.Primary{
   360  			{
   361  				value.NewString("abc"),
   362  				value.NewInteger(1),
   363  				value.NewFloat(1.1),
   364  				value.NewBoolean(false),
   365  				value.NewTernary(ternary.TRUE),
   366  				value.NewTernary(ternary.UNKNOWN),
   367  				value.NewDatetimeFromString("2012-02-02 22:22:22 -07:00", nil, location),
   368  				value.NewNull(),
   369  			},
   370  		},
   371  		Expect: json.Array{
   372  			json.Object{
   373  				Members: []json.ObjectMember{
   374  					{
   375  						Key:   "string",
   376  						Value: json.String("abc"),
   377  					},
   378  					{
   379  						Key:   "integer",
   380  						Value: json.Integer(1),
   381  					},
   382  					{
   383  						Key:   "float",
   384  						Value: json.Float(1.1),
   385  					},
   386  					{
   387  						Key:   "boolean",
   388  						Value: json.Boolean(false),
   389  					},
   390  					{
   391  						Key:   "ternary",
   392  						Value: json.Boolean(true),
   393  					},
   394  					{
   395  						Key:   "ternary2",
   396  						Value: json.Null{},
   397  					},
   398  					{
   399  						Key:   "datetime",
   400  						Value: json.String("2012-02-02T22:22:22-07:00"),
   401  					},
   402  					{
   403  						Key:   "null",
   404  						Value: json.Null{},
   405  					},
   406  				},
   407  			},
   408  		},
   409  	},
   410  	{
   411  		Fields: []string{
   412  			"column1",
   413  			"",
   414  		},
   415  		Rows: [][]value.Primary{
   416  			{
   417  				value.NewString("a"),
   418  				value.NewInteger(1),
   419  			},
   420  			{
   421  				value.NewString("b"),
   422  				value.NewFloat(0.2),
   423  			},
   424  		},
   425  		Expect: json.Array{
   426  			json.Object{
   427  				Members: []json.ObjectMember{
   428  					{
   429  						Key:   "column1",
   430  						Value: json.String("a"),
   431  					},
   432  					{
   433  						Key:   "",
   434  						Value: json.Integer(1),
   435  					},
   436  				},
   437  			},
   438  			json.Object{
   439  				Members: []json.ObjectMember{
   440  					{
   441  						Key:   "column1",
   442  						Value: json.String("b"),
   443  					},
   444  					{
   445  						Key:   "",
   446  						Value: json.Float(0.2),
   447  					},
   448  				},
   449  			},
   450  		},
   451  	},
   452  	{
   453  		Fields: []string{
   454  			"column1",
   455  			"column2",
   456  		},
   457  		Rows: [][]value.Primary{
   458  			{
   459  				value.NewString("a"),
   460  				value.NewInteger(1),
   461  			},
   462  			{
   463  				value.NewString("b"),
   464  			},
   465  		},
   466  		Error: "field length does not match",
   467  	},
   468  	{
   469  		Fields: []string{
   470  			"column1",
   471  			"column2..",
   472  		},
   473  		Rows: [][]value.Primary{
   474  			{
   475  				value.NewString("a"),
   476  				value.NewInteger(1),
   477  			},
   478  			{
   479  				value.NewString("b"),
   480  				value.NewInteger(2),
   481  			},
   482  		},
   483  		Error: "unexpected token \".\" at column 9 in \"column2..\"",
   484  	},
   485  }
   486  
   487  func TestConvertTableValueToJsonStructure(t *testing.T) {
   488  	ctx := context.Background()
   489  	for _, v := range convertTableValueToJsonStructureTests {
   490  		result, err := ConvertTableValueToJsonStructure(ctx, v.Fields, v.Rows)
   491  		if err != nil {
   492  			if len(v.Error) < 1 {
   493  				t.Errorf("unexpected error %q for %s, %s", err.Error(), v.Fields, v.Rows)
   494  			} else if err.Error() != v.Error {
   495  				t.Errorf("error %q, want error %q for %s, %s", err.Error(), v.Error, v.Fields, v.Rows)
   496  			}
   497  			continue
   498  		}
   499  		if 0 < len(v.Error) {
   500  			t.Errorf("no error, want error %q for %s, %s", v.Error, v.Fields, v.Rows)
   501  			continue
   502  		}
   503  		if !reflect.DeepEqual(result, v.Expect) {
   504  			t.Errorf("result = %#v, want %#v for %s, %s", result, v.Expect, v.Fields, v.Rows)
   505  		}
   506  	}
   507  }