@@ -252,3 +252,244 @@ func TestAtomicToGranularSchemaChanges(t *testing.T) {
252252 })
253253 }
254254}
255+
256+ var associativeListParserOld = func () * typed.Parser {
257+ oldParser , err := typed .NewParser (`types:
258+ - name: v1
259+ map:
260+ fields:
261+ - name: list
262+ type:
263+ namedType: associativeList
264+ - name: associativeList
265+ list:
266+ elementType:
267+ namedType: myElement
268+ elementRelationship: associative
269+ keys:
270+ - name
271+ - name: myElement
272+ map:
273+ fields:
274+ - name: name
275+ type:
276+ scalar: string
277+ - name: id
278+ type:
279+ scalar: numeric
280+ - name: value
281+ type:
282+ scalar: numeric
283+ ` )
284+ if err != nil {
285+ panic (err )
286+ }
287+ return oldParser
288+ }()
289+
290+ var associativeListParserNewOptionalKey = func () * typed.Parser {
291+ newParser , err := typed .NewParser (`types:
292+ - name: v1
293+ map:
294+ fields:
295+ - name: list
296+ type:
297+ namedType: associativeList
298+ - name: associativeList
299+ list:
300+ elementType:
301+ namedType: myElement
302+ elementRelationship: associative
303+ keys:
304+ - name
305+ - id
306+ - name: myElement
307+ map:
308+ fields:
309+ - name: name
310+ type:
311+ scalar: string
312+ - name: id
313+ type:
314+ scalar: numeric
315+ - name: value
316+ type:
317+ scalar: numeric
318+ ` )
319+ if err != nil {
320+ panic (err )
321+ }
322+ return newParser
323+ }()
324+
325+ var associativeListParserNewKeyWithDefault = func () * typed.Parser {
326+ newParser , err := typed .NewParser (`types:
327+ - name: v1
328+ map:
329+ fields:
330+ - name: list
331+ type:
332+ namedType: associativeList
333+ - name: associativeList
334+ list:
335+ elementType:
336+ namedType: myElement
337+ elementRelationship: associative
338+ keys:
339+ - name
340+ - id
341+ - name: myElement
342+ map:
343+ fields:
344+ - name: name
345+ type:
346+ scalar: string
347+ - name: id
348+ type:
349+ scalar: numeric
350+ default: 1
351+ - name: value
352+ type:
353+ scalar: numeric
354+ ` )
355+ if err != nil {
356+ panic (err )
357+ }
358+ return newParser
359+ }()
360+
361+ func TestAssociativeListSchemaChanges (t * testing.T ) {
362+ tests := map [string ]TestCase {
363+ "new required key with default" : {
364+ Ops : []Operation {
365+ Apply {
366+ Manager : "one" ,
367+ Object : `
368+ list:
369+ - name: a
370+ value: 1
371+ - name: b
372+ value: 1
373+ - name: c
374+ value: 1
375+ ` ,
376+ APIVersion : "v1" ,
377+ },
378+ ChangeParser {Parser : associativeListParserNewKeyWithDefault },
379+ Apply {
380+ Manager : "one" ,
381+ Object : `
382+ list:
383+ - name: a
384+ value: 2
385+ - name: b
386+ id: 1
387+ value: 2
388+ - name: c
389+ value: 1
390+ - name: c
391+ id: 2
392+ value: 2
393+ - name: c
394+ id: 3
395+ value: 3
396+ ` ,
397+ APIVersion : "v1" ,
398+ },
399+ },
400+ Object : `
401+ list:
402+ - name: a
403+ value: 2
404+ - name: b
405+ id: 1
406+ value: 2
407+ - name: c
408+ value: 1
409+ - name: c
410+ id: 2
411+ value: 2
412+ - name: c
413+ id: 3
414+ value: 3
415+ ` ,
416+ APIVersion : "v1" ,
417+ Managed : fieldpath.ManagedFields {
418+ "one" : fieldpath .NewVersionedSet (_NS (
419+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 ))),
420+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "name" ),
421+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "value" ),
422+ _P ("list" , _KBF ("name" , "b" , "id" , float64 (1 ))),
423+ _P ("list" , _KBF ("name" , "b" , "id" , float64 (1 )), "name" ),
424+ _P ("list" , _KBF ("name" , "b" , "id" , float64 (1 )), "id" ),
425+ _P ("list" , _KBF ("name" , "b" , "id" , float64 (1 )), "value" ),
426+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (1 ))),
427+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (1 )), "name" ),
428+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (1 )), "value" ),
429+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (2 ))),
430+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (2 )), "name" ),
431+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (2 )), "id" ),
432+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (2 )), "value" ),
433+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (3 ))),
434+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (3 )), "name" ),
435+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (3 )), "id" ),
436+ _P ("list" , _KBF ("name" , "c" , "id" , float64 (3 )), "value" ),
437+ ), "v1" , true ),
438+ },
439+ },
440+ "new optional key" : {
441+ Ops : []Operation {
442+ Apply {
443+ Manager : "one" ,
444+ Object : `
445+ list:
446+ - name: a
447+ value: 1
448+ ` ,
449+ APIVersion : "v1" ,
450+ },
451+ ChangeParser {Parser : associativeListParserNewOptionalKey },
452+ Apply {
453+ Manager : "one" ,
454+ Object : `
455+ list:
456+ - name: a
457+ value: 2
458+ - name: a
459+ id: 1
460+ value: 1
461+ ` ,
462+ APIVersion : "v1" ,
463+ },
464+ },
465+ Object : `
466+ list:
467+ - name: a
468+ value: 2
469+ - name: a
470+ id: 1
471+ value: 1
472+ ` ,
473+ APIVersion : "v1" ,
474+ Managed : fieldpath.ManagedFields {
475+ "one" : fieldpath .NewVersionedSet (_NS (
476+ _P ("list" , _KBF ("name" , "a" )),
477+ _P ("list" , _KBF ("name" , "a" ), "name" ),
478+ _P ("list" , _KBF ("name" , "a" ), "value" ),
479+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 ))),
480+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "name" ),
481+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "id" ),
482+ _P ("list" , _KBF ("name" , "a" , "id" , float64 (1 )), "value" ),
483+ ), "v1" , true ),
484+ },
485+ },
486+ }
487+
488+ for name , test := range tests {
489+ t .Run (name , func (t * testing.T ) {
490+ if err := test .Test (associativeListParserOld ); err != nil {
491+ t .Fatal (err )
492+ }
493+ })
494+ }
495+ }
0 commit comments