github.com/goccy/go-json@v0.10.3-0.20240509105655-5e2ae3f23c1d/query_test.go (about) 1 package json_test 2 3 import ( 4 "context" 5 "reflect" 6 "testing" 7 8 "github.com/goccy/go-json" 9 ) 10 11 type queryTestX struct { 12 XA int 13 XB string 14 XC *queryTestY 15 XD bool 16 XE float32 17 } 18 19 type queryTestY struct { 20 YA int 21 YB string 22 YC *queryTestZ 23 YD bool 24 YE float32 25 } 26 27 type queryTestZ struct { 28 ZA string 29 ZB bool 30 ZC int 31 } 32 33 func (z *queryTestZ) MarshalJSON(ctx context.Context) ([]byte, error) { 34 type _queryTestZ queryTestZ 35 return json.MarshalContext(ctx, (*_queryTestZ)(z)) 36 } 37 38 func TestFieldQuery(t *testing.T) { 39 query, err := json.BuildFieldQuery( 40 "XA", 41 "XB", 42 json.BuildSubFieldQuery("XC").Fields( 43 "YA", 44 "YB", 45 json.BuildSubFieldQuery("YC").Fields( 46 "ZA", 47 "ZB", 48 ), 49 ), 50 ) 51 if err != nil { 52 t.Fatal(err) 53 } 54 if !reflect.DeepEqual(query, &json.FieldQuery{ 55 Fields: []*json.FieldQuery{ 56 { 57 Name: "XA", 58 }, 59 { 60 Name: "XB", 61 }, 62 { 63 Name: "XC", 64 Fields: []*json.FieldQuery{ 65 { 66 Name: "YA", 67 }, 68 { 69 Name: "YB", 70 }, 71 { 72 Name: "YC", 73 Fields: []*json.FieldQuery{ 74 { 75 Name: "ZA", 76 }, 77 { 78 Name: "ZB", 79 }, 80 }, 81 }, 82 }, 83 }, 84 }, 85 }) { 86 t.Fatal("cannot get query") 87 } 88 queryStr, err := query.QueryString() 89 if err != nil { 90 t.Fatal(err) 91 } 92 if queryStr != `["XA","XB",{"XC":["YA","YB",{"YC":["ZA","ZB"]}]}]` { 93 t.Fatalf("failed to create query string. %s", queryStr) 94 } 95 ctx := json.SetFieldQueryToContext(context.Background(), query) 96 b, err := json.MarshalContext(ctx, &queryTestX{ 97 XA: 1, 98 XB: "xb", 99 XC: &queryTestY{ 100 YA: 2, 101 YB: "yb", 102 YC: &queryTestZ{ 103 ZA: "za", 104 ZB: true, 105 ZC: 3, 106 }, 107 YD: true, 108 YE: 4, 109 }, 110 XD: true, 111 XE: 5, 112 }) 113 if err != nil { 114 t.Fatal(err) 115 } 116 expected := `{"XA":1,"XB":"xb","XC":{"YA":2,"YB":"yb","YC":{"ZA":"za","ZB":true}}}` 117 got := string(b) 118 if expected != got { 119 t.Fatalf("failed to encode with field query: expected %q but got %q", expected, got) 120 } 121 }