@@ -49,7 +49,7 @@ func testJSONPath(tests []jsonpathTest, allowMissingKeys bool, t *testing.T) {
49
49
err = j .Execute (buf , test .input )
50
50
if test .expectError {
51
51
if err == nil {
52
- t .Errorf (" in %s, expected execute error" , test .name )
52
+ t .Errorf (` in %s, expected execute error, got %q` , test .name , buf )
53
53
}
54
54
continue
55
55
} else if err != nil {
@@ -108,6 +108,94 @@ func testFailJSONPath(tests []jsonpathTest, t *testing.T) {
108
108
}
109
109
}
110
110
111
+ func TestTypesInput (t * testing.T ) {
112
+ types := map [string ]interface {}{
113
+ "bools" : []bool {true , false , true , false },
114
+ "integers" : []int {1 , 2 , 3 , 4 },
115
+ "floats" : []float64 {1.0 , 2.2 , 3.3 , 4.0 },
116
+ "strings" : []string {"one" , "two" , "three" , "four" },
117
+ "interfaces" : []interface {}{true , "one" , 1 , 1.1 },
118
+ "maps" : []map [string ]interface {}{
119
+ {"name" : "one" , "value" : 1 },
120
+ {"name" : "two" , "value" : 2.02 },
121
+ {"name" : "three" , "value" : 3.03 },
122
+ {"name" : "four" , "value" : 4.04 },
123
+ },
124
+ "structs" : []struct {
125
+ Name string `json:"name"`
126
+ Value interface {} `json:"value"`
127
+ Type string `json:"type"`
128
+ }{
129
+ {Name : "one" , Value : 1 , Type : "integer" },
130
+ {Name : "two" , Value : 2.002 , Type : "float" },
131
+ {Name : "three" , Value : 3 , Type : "integer" },
132
+ {Name : "four" , Value : 4.004 , Type : "float" },
133
+ },
134
+ }
135
+
136
+ sliceTests := []jsonpathTest {
137
+ // boolean slice tests
138
+ {"boolSlice" , `{ .bools }` , types , `[true,false,true,false]` , false },
139
+ {"boolSliceIndex" , `{ .bools[0] }` , types , `true` , false },
140
+ {"boolSliceIndex" , `{ .bools[-1] }` , types , `false` , false },
141
+ {"boolSubSlice" , `{ .bools[0:2] }` , types , `true false` , false },
142
+ {"boolSubSliceFirst2" , `{ .bools[:2] }` , types , `true false` , false },
143
+ {"boolSubSliceStep2" , `{ .bools[:4:2] }` , types , `true true` , false },
144
+ // integer slice tests
145
+ {"integerSlice" , `{ .integers }` , types , `[1,2,3,4]` , false },
146
+ {"integerSliceIndex" , `{ .integers[0] }` , types , `1` , false },
147
+ {"integerSliceIndexReverse" , `{ .integers[-2] }` , types , `3` , false },
148
+ {"integerSubSliceFirst2" , `{ .integers[0:2] }` , types , `1 2` , false },
149
+ {"integerSubSliceFirst2Alt" , `{ .integers[:2] }` , types , `1 2` , false },
150
+ {"integerSubSliceStep2" , `{ .integers[:4:2] }` , types , `1 3` , false },
151
+ // float slice tests
152
+ {"floatSlice" , `{ .floats }` , types , `[1,2.2,3.3,4]` , false },
153
+ {"floatSliceIndex" , `{ .floats[0] }` , types , `1` , false },
154
+ {"floatSliceIndexReverse" , `{ .floats[-2] }` , types , `3.3` , false },
155
+ {"floatSubSliceFirst2" , `{ .floats[0:2] }` , types , `1 2.2` , false },
156
+ {"floatSubSliceFirst2Alt" , `{ .floats[:2] }` , types , `1 2.2` , false },
157
+ {"floatSubSliceStep2" , `{ .floats[:4:2] }` , types , `1 3.3` , false },
158
+ // strings slice tests
159
+ {"stringSlice" , `{ .strings }` , types , `["one","two","three","four"]` , false },
160
+ {"stringSliceIndex" , `{ .strings[0] }` , types , `one` , false },
161
+ {"stringSliceIndexReverse" , `{ .strings[-2] }` , types , `three` , false },
162
+ {"stringSubSliceFirst2" , `{ .strings[0:2] }` , types , `one two` , false },
163
+ {"stringSubSliceFirst2Alt" , `{ .strings[:2] }` , types , `one two` , false },
164
+ {"stringSubSliceStep2" , `{ .strings[:4:2] }` , types , `one three` , false },
165
+ // interfaces slice tests
166
+ {"interfaceSlice" , `{ .interfaces }` , types , `[true,"one",1,1.1]` , false },
167
+ {"interfaceSliceIndex" , `{ .interfaces[0] }` , types , `true` , false },
168
+ {"interfaceSliceIndexReverse" , `{ .interfaces[-2] }` , types , `1` , false },
169
+ {"interfaceSubSliceFirst2" , `{ .interfaces[0:2] }` , types , `true one` , false },
170
+ {"interfaceSubSliceFirst2Alt" , `{ .interfaces[:2] }` , types , `true one` , false },
171
+ {"interfaceSubSliceStep2" , `{ .interfaces[:4:2] }` , types , `true 1` , false },
172
+ // maps slice tests
173
+ {"mapSlice" , `{ .maps }` , types ,
174
+ `[{"name":"one","value":1},{"name":"two","value":2.02},{"name":"three","value":3.03},{"name":"four","value":4.04}]` , false },
175
+ {"mapSliceIndex" , `{ .maps[0] }` , types , `{"name":"one","value":1}` , false },
176
+ {"mapSliceIndexReverse" , `{ .maps[-2] }` , types , `{"name":"three","value":3.03}` , false },
177
+ {"mapSubSliceFirst2" , `{ .maps[0:2] }` , types , `{"name":"one","value":1} {"name":"two","value":2.02}` , false },
178
+ {"mapSubSliceFirst2Alt" , `{ .maps[:2] }` , types , `{"name":"one","value":1} {"name":"two","value":2.02}` , false },
179
+ {"mapSubSliceStepOdd" , `{ .maps[::2] }` , types , `{"name":"one","value":1} {"name":"three","value":3.03}` , false },
180
+ {"mapSubSliceStepEven" , `{ .maps[1::2] }` , types , `{"name":"two","value":2.02} {"name":"four","value":4.04}` , false },
181
+ // structs slice tests
182
+ {"structSlice" , `{ .structs }` , types ,
183
+ `[{"name":"one","value":1,"type":"integer"},{"name":"two","value":2.002,"type":"float"},{"name":"three","value":3,"type":"integer"},{"name":"four","value":4.004,"type":"float"}]` , false },
184
+ {"structSliceIndex" , `{ .structs[0] }` , types , `{"name":"one","value":1,"type":"integer"}` , false },
185
+ {"structSliceIndexReverse" , `{ .structs[-2] }` , types , `{"name":"three","value":3,"type":"integer"}` , false },
186
+ {"structSubSliceFirst2" , `{ .structs[0:2] }` , types ,
187
+ `{"name":"one","value":1,"type":"integer"} {"name":"two","value":2.002,"type":"float"}` , false },
188
+ {"structSubSliceFirst2Alt" , `{ .structs[:2] }` , types ,
189
+ `{"name":"one","value":1,"type":"integer"} {"name":"two","value":2.002,"type":"float"}` , false },
190
+ {"structSubSliceStepOdd" , `{ .structs[::2] }` , types ,
191
+ `{"name":"one","value":1,"type":"integer"} {"name":"three","value":3,"type":"integer"}` , false },
192
+ {"structSubSliceStepEven" , `{ .structs[1::2] }` , types ,
193
+ `{"name":"two","value":2.002,"type":"float"} {"name":"four","value":4.004,"type":"float"}` , false },
194
+ }
195
+
196
+ testJSONPath (sliceTests , false , t )
197
+ }
198
+
111
199
type book struct {
112
200
Category string
113
201
Author string
@@ -161,7 +249,7 @@ func TestStructInput(t *testing.T) {
161
249
162
250
storeTests := []jsonpathTest {
163
251
{"plain" , "hello jsonpath" , nil , "hello jsonpath" , false },
164
- {"recursive" , "{..}" , []int {1 , 2 , 3 }, "[1 2 3]" , false },
252
+ {"recursive" , "{..}" , []int {1 , 2 , 3 }, "[1,2, 3]" , false },
165
253
{"filter" , "{[?(@<5)]}" , []int {2 , 6 , 3 , 7 }, "2 3" , false },
166
254
{"quote" , `{"{"}` , nil , "{" , false },
167
255
{"union" , "{[1,3,4]}" , []int {0 , 1 , 2 , 3 , 4 }, "1 3 4" , false },
@@ -173,14 +261,19 @@ func TestStructInput(t *testing.T) {
173
261
{"dict-" , "{.Labels.k8s-app}" , storeData , "20" , false },
174
262
{"nest" , "{.Bicycle[*].Color}" , storeData , "red green" , false },
175
263
{"allarray" , "{.Book[*].Author}" , storeData , "Nigel Rees Evelyn Waugh Herman Melville" , false },
176
- {"allfileds" , "{.Bicycle.*}" , storeData , "{red 19.95 true} {green 20.01 false}" , false },
177
- {"recurfileds" , "{..Price}" , storeData , "8.95 12.99 8.99 19.95 20.01" , false },
264
+ {"allfields" , `{range .Bicycle[*]}{ "{" }{ @.* }{ "} " }{end}` , storeData , "{red 19.95 true} {green 20.01 false} " , false },
265
+ {"recurfields" , "{..Price}" , storeData , "8.95 12.99 8.99 19.95 20.01" , false },
266
+ {"allstructsSlice" , "{.Bicycle}" , storeData ,
267
+ `[{"Color":"red","Price":19.95,"IsNew":true},{"Color":"green","Price":20.01,"IsNew":false}]` , false },
268
+ {"allstructs" , `{range .Bicycle[*]}{ @ }{ " " }{end}` , storeData ,
269
+ `{"Color":"red","Price":19.95,"IsNew":true} {"Color":"green","Price":20.01,"IsNew":false} ` , false },
178
270
{"lastarray" , "{.Book[-1:]}" , storeData ,
179
- "{ Category: fiction, Author: Herman Melville, Title: Moby Dick, Price: 8.99}" , false },
271
+ `{" Category":" fiction"," Author":" Herman Melville"," Title":" Moby Dick"," Price": 8.99}` , false },
180
272
{"recurarray" , "{..Book[2]}" , storeData ,
181
- "{ Category: fiction, Author: Herman Melville, Title: Moby Dick, Price: 8.99}" , false },
182
- {"bool" , "{.Bicycle[?(@.IsNew==true)]}" , storeData , "{ red 19.95 true}" , false },
273
+ `{" Category":" fiction"," Author":" Herman Melville"," Title":" Moby Dick"," Price": 8.99}` , false },
274
+ {"bool" , "{.Bicycle[?(@.IsNew==true)]}" , storeData , `{"Color":" red","Price": 19.95,"IsNew": true}` , false },
183
275
}
276
+
184
277
testJSONPath (storeTests , false , t )
185
278
186
279
missingKeyTests := []jsonpathTest {
@@ -282,9 +375,9 @@ func TestKubernetes(t *testing.T) {
282
375
"127.0.0.1, 127.0.0.2, 127.0.0.3, " , false },
283
376
{"item name" , `{.items[*].metadata.name}` , nodesData , "127.0.0.1 127.0.0.2" , false },
284
377
{"union nodes capacity" , `{.items[*]['metadata.name', 'status.capacity']}` , nodesData ,
285
- " 127.0.0.1 127.0.0.2 map[ cpu:4] map[ cpu:8]" , false },
378
+ ` 127.0.0.1 127.0.0.2 {" cpu":"4"} {" cpu":"8"}` , false },
286
379
{"range nodes capacity" , `{range .items[*]}[{.metadata.name}, {.status.capacity}] {end}` , nodesData ,
287
- " [127.0.0.1, map[ cpu:4]] [127.0.0.2, map[ cpu:8]] " , false },
380
+ ` [127.0.0.1, {" cpu":"4"}] [127.0.0.2, {" cpu":"8"}] ` , false },
288
381
{"user password" , `{.users[?(@.name=="e2e")].user.password}` , & nodesData , "secret" , false },
289
382
{"hostname" , `{.items[0].metadata.labels.kubernetes\.io/hostname}` , & nodesData , "127.0.0.1" , false },
290
383
{"hostname filter" , `{.items[?(@.metadata.labels.kubernetes\.io/hostname=="127.0.0.1")].kind}` , & nodesData , "None" , false },
0 commit comments