github.com/wuhuizuo/gomplate@v3.5.0+incompatible/coll/jsonpath_test.go (about) 1 package coll 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 ) 8 9 type m = map[string]interface{} 10 type ar = []interface{} 11 12 func TestJSONPath(t *testing.T) { 13 in := m{ 14 "store": m{ 15 "book": ar{ 16 m{ 17 "category": "reference", 18 "author": "Nigel Rees", 19 "title": "Sayings of the Century", 20 "price": 8.95, 21 }, 22 m{ 23 "category": "fiction", 24 "author": "Evelyn Waugh", 25 "title": "Sword of Honour", 26 "price": 12.99, 27 }, 28 m{ 29 "category": "fiction", 30 "author": "Herman Melville", 31 "title": "Moby Dick", 32 "isbn": "0-553-21311-3", 33 "price": 8.99, 34 }, 35 m{ 36 "category": "fiction", 37 "author": "J. R. R. Tolkien", 38 "title": "The Lord of the Rings", 39 "isbn": "0-395-19395-8", 40 "price": 22.99, 41 }, 42 }, 43 "bicycle": m{ 44 "color": "red", 45 "price": 19.95, 46 }, 47 }, 48 } 49 out, err := JSONPath(".store.bicycle.color", in) 50 assert.NoError(t, err) 51 assert.Equal(t, "red", out) 52 53 out, err = JSONPath(".store.bicycle.price", in) 54 assert.NoError(t, err) 55 assert.Equal(t, 19.95, out) 56 57 _, err = JSONPath(".store.bogus", in) 58 assert.Error(t, err) 59 60 _, err = JSONPath("{.store.unclosed", in) 61 assert.Error(t, err) 62 63 out, err = JSONPath(".store", in) 64 assert.NoError(t, err) 65 assert.EqualValues(t, in["store"], out) 66 67 out, err = JSONPath("$.store.book[*].author", in) 68 assert.NoError(t, err) 69 assert.Len(t, out, 4) 70 assert.Contains(t, out, "Nigel Rees") 71 assert.Contains(t, out, "Evelyn Waugh") 72 assert.Contains(t, out, "Herman Melville") 73 assert.Contains(t, out, "J. R. R. Tolkien") 74 75 out, err = JSONPath("$..book[?( @.price < 10.0 )]", in) 76 assert.NoError(t, err) 77 expected := ar{ 78 m{ 79 "category": "reference", 80 "author": "Nigel Rees", 81 "title": "Sayings of the Century", 82 "price": 8.95, 83 }, 84 m{ 85 "category": "fiction", 86 "author": "Herman Melville", 87 "title": "Moby Dick", 88 "isbn": "0-553-21311-3", 89 "price": 8.99, 90 }, 91 } 92 assert.EqualValues(t, expected, out) 93 94 in = m{ 95 "a": m{ 96 "aa": m{ 97 "foo": m{ 98 "aaa": m{ 99 "aaaa": m{ 100 "bar": 1234, 101 }, 102 }, 103 }, 104 }, 105 "ab": m{ 106 "aba": m{ 107 "foo": m{ 108 "abaa": true, 109 "abab": "baz", 110 }, 111 }, 112 }, 113 }, 114 } 115 out, err = JSONPath("..foo.*", in) 116 assert.NoError(t, err) 117 assert.Len(t, out, 3) 118 assert.Contains(t, out, m{"aaaa": m{"bar": 1234}}) 119 assert.Contains(t, out, true) 120 assert.Contains(t, out, "baz") 121 122 type bicycleType struct { 123 Color string 124 } 125 type storeType struct { 126 Bicycle *bicycleType 127 safe interface{} 128 } 129 130 structIn := &storeType{ 131 Bicycle: &bicycleType{ 132 Color: "red", 133 }, 134 safe: "hidden", 135 } 136 137 out, err = JSONPath(".Bicycle.Color", structIn) 138 assert.NoError(t, err) 139 assert.Equal(t, "red", out) 140 141 _, err = JSONPath(".safe", structIn) 142 assert.Error(t, err) 143 144 _, err = JSONPath(".*", structIn) 145 assert.Error(t, err) 146 }