@@ -234,7 +234,7 @@ func TestUnmarshalExtJSONWithUndefinedField(t *testing.T) {
234
234
// When unmarshalling extJSON, fields that are undefined in the destination struct are skipped.
235
235
// This process must not skip other, defined fields and must not raise errors.
236
236
type expectedResponse struct {
237
- DefinedField string
237
+ DefinedField interface {}
238
238
}
239
239
240
240
unmarshalExpectedResponse := func (t * testing.T , extJSON string ) * expectedResponse {
@@ -246,98 +246,128 @@ func TestUnmarshalExtJSONWithUndefinedField(t *testing.T) {
246
246
}
247
247
248
248
testCases := []struct {
249
- name string
250
- testJSON string
249
+ name string
250
+ testJSON string
251
+ expectedValue interface {}
251
252
}{
252
253
{
253
254
"no array" ,
254
255
`{
255
256
"UndefinedField": {"key": 1},
256
257
"DefinedField": "value"
257
258
}` ,
259
+ "value" ,
258
260
},
259
261
{
260
262
"outer array" ,
261
263
`{
262
264
"UndefinedField": [{"key": 1}],
263
265
"DefinedField": "value"
264
266
}` ,
267
+ "value" ,
265
268
},
266
269
{
267
270
"embedded array" ,
268
271
`{
269
272
"UndefinedField": {"keys": [2]},
270
273
"DefinedField": "value"
271
274
}` ,
275
+ "value" ,
272
276
},
273
277
{
274
278
"outer array and embedded array" ,
275
279
`{
276
280
"UndefinedField": [{"keys": [2]}],
277
281
"DefinedField": "value"
278
282
}` ,
283
+ "value" ,
279
284
},
280
285
{
281
286
"embedded document" ,
282
287
`{
283
288
"UndefinedField": {"key": {"one": "two"}},
284
289
"DefinedField": "value"
285
290
}` ,
291
+ "value" ,
286
292
},
287
293
{
288
294
"doubly embedded document" ,
289
295
`{
290
296
"UndefinedField": {"key": {"one": {"two": "three"}}},
291
297
"DefinedField": "value"
292
298
}` ,
299
+ "value" ,
293
300
},
294
301
{
295
302
"embedded document and embedded array" ,
296
303
`{
297
304
"UndefinedField": {"key": {"one": {"two": [3]}}},
298
305
"DefinedField": "value"
299
306
}` ,
307
+ "value" ,
300
308
},
301
309
{
302
310
"embedded document and embedded array in outer array" ,
303
311
`{
304
312
"UndefinedField": [{"key": {"one": [3]}}],
305
313
"DefinedField": "value"
306
314
}` ,
315
+ "value" ,
307
316
},
308
317
{
309
318
"code with scope" ,
310
319
`{
311
320
"UndefinedField": {"logic": {"$code": "foo", "$scope": {"bar": 1}}},
312
321
"DefinedField": "value"
313
322
}` ,
323
+ "value" ,
314
324
},
315
325
{
316
326
"embedded array of code with scope" ,
317
327
`{
318
328
"UndefinedField": {"logic": [{"$code": "foo", "$scope": {"bar": 1}}]},
319
329
"DefinedField": "value"
320
330
}` ,
331
+ "value" ,
321
332
},
322
333
{
323
334
"type definition embedded document" ,
324
335
`{
325
336
"UndefinedField": {"myDouble": {"$numberDouble": "1.24"}},
326
337
"DefinedField": "value"
327
338
}` ,
339
+ "value" ,
328
340
},
329
341
{
330
342
"empty embedded document" ,
331
343
`{
332
- "UndefinedField": {"empty": {}},
344
+ "UndefinedField": {"empty": {}, "key": 1 },
333
345
"DefinedField": "value"
334
346
}` ,
347
+ "value" ,
348
+ },
349
+ {
350
+ "empty object before" ,
351
+ `{
352
+ "UndefinedField": {},
353
+ "DefinedField": {"value": "a"}
354
+ }` ,
355
+ D {{"value" , "a" }},
356
+ },
357
+ {
358
+ "empty object after" ,
359
+ `{
360
+ "DefinedField": {"value": "a"},
361
+ "UndefinedField": {}
362
+ }` ,
363
+ D {{"value" , "a" }},
335
364
},
336
365
}
337
366
for _ , tc := range testCases {
338
367
t .Run (tc .name , func (t * testing.T ) {
339
368
responseDoc := unmarshalExpectedResponse (t , tc .testJSON )
340
- assert .Equal (t , "value" , responseDoc .DefinedField , "expected DefinedField to be 'value', got %q" , responseDoc .DefinedField )
369
+ assert .Equal (t , tc .expectedValue , responseDoc .DefinedField , "expected DefinedField to be %v, got %q" ,
370
+ tc .expectedValue , responseDoc .DefinedField )
341
371
})
342
372
}
343
373
}
0 commit comments