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 }