Skip to content

Commit 2657e81

Browse files
committed
Add associative list key schema evolution changes
1 parent cd2b883 commit 2657e81

File tree

1 file changed

+241
-0
lines changed

1 file changed

+241
-0
lines changed

merge/schema_change_test.go

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)