@@ -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