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 }