1 package merge_test
2
3 import (
4 "testing"
5
6 "sigs.k8s.io/structured-merge-diff/v4/fieldpath"
7 "sigs.k8s.io/structured-merge-diff/v4/internal/fixture"
8 "sigs.k8s.io/structured-merge-diff/v4/merge"
9 "sigs.k8s.io/structured-merge-diff/v4/typed"
10 )
11
12 func TestFieldLevelOverrides(t *testing.T) {
13 var overrideStructTypeParser = func() fixture.Parser {
14 parser, err := typed.NewParser(`
15 types:
16 - name: type
17 map:
18 fields:
19 - name: associativeListReference
20 type:
21 namedType: associativeList
22 elementRelationship: atomic
23 - name: separableInlineList
24 type:
25 list:
26 elementType:
27 scalar: numeric
28 elementRelationship: atomic
29 elementRelationship: associative
30 - name: separableMapReference
31 type:
32 namedType: atomicMap
33 elementRelationship: separable
34 - name: atomicMapReference
35 type:
36 namedType: unspecifiedMap
37 elementRelationship: atomic
38
39 - name: associativeList
40 list:
41 elementType:
42 namedType: unspecifiedMap
43 elementRelationship: atomic
44 elementRelationship: associative
45 keys:
46 - name
47 - name: unspecifiedMap
48 map:
49 fields:
50 - name: name
51 type:
52 scalar: string
53 - name: value
54 type:
55 scalar: numeric
56 - name: atomicMap
57 map:
58 elementRelationship: atomic
59 fields:
60 - name: name
61 type:
62 scalar: string
63 - name: value
64 type:
65 scalar: numeric
66 `)
67 if err != nil {
68 panic(err)
69 }
70 return fixture.SameVersionParser{T: parser.Type("type")}
71 }()
72
73 tests := map[string]fixture.TestCase{
74 "test_override_atomic_map_with_separable": {
75
76
77 Ops: []fixture.Operation{
78 fixture.Apply{
79 Manager: "apply_one",
80 Object: `
81 separableMapReference:
82 name: a
83 `,
84 APIVersion: "v1",
85 },
86 fixture.Apply{
87 Manager: "apply_two",
88 Object: `
89 separableMapReference:
90 value: 2
91 `,
92 APIVersion: "v1",
93 },
94 },
95 Object: `
96 separableMapReference:
97 name: a
98 value: 2
99 `,
100 APIVersion: "v1",
101 Managed: fieldpath.ManagedFields{
102 "apply_one": fieldpath.NewVersionedSet(
103 _NS(
104 _P("separableMapReference", "name"),
105 ),
106 "v1",
107 false,
108 ),
109 "apply_two": fieldpath.NewVersionedSet(
110 _NS(
111 _P("separableMapReference", "value"),
112 ),
113 "v1",
114 false,
115 ),
116 },
117 },
118 "test_override_unspecified_map_with_atomic": {
119
120
121 Ops: []fixture.Operation{
122 fixture.Apply{
123 Manager: "apply_one",
124 Object: `
125 atomicMapReference:
126 name: a
127 `,
128 APIVersion: "v1",
129 },
130 fixture.Apply{
131 Manager: "apply_two",
132 Object: `
133 atomicMapReference:
134 value: 2
135 `,
136 APIVersion: "v1",
137 Conflicts: merge.Conflicts{
138 merge.Conflict{Manager: "apply_one", Path: _P("atomicMapReference")},
139 },
140 },
141 fixture.Apply{
142 Manager: "apply_one",
143 Object: `
144 atomicMapReference:
145 name: b
146 value: 2
147 `,
148 APIVersion: "v1",
149 },
150 },
151 Object: `
152 atomicMapReference:
153 name: b
154 value: 2
155 `,
156 APIVersion: "v1",
157 Managed: fieldpath.ManagedFields{
158 "apply_one": fieldpath.NewVersionedSet(
159 _NS(
160 _P("atomicMapReference"),
161 ),
162 "v1",
163 false,
164 ),
165 },
166 },
167 "test_override_associative_list_with_atomic": {
168
169
170 Ops: []fixture.Operation{
171 fixture.Apply{
172 Manager: "apply_one",
173 Object: `
174 associativeListReference:
175 - name: a
176 value: 1
177 `,
178 APIVersion: "v1",
179 },
180 fixture.Apply{
181 Manager: "apply_two",
182 Object: `
183 associativeListReference:
184 - name: b
185 value: 2
186 `,
187 APIVersion: "v1",
188 Conflicts: merge.Conflicts{
189 merge.Conflict{Manager: "apply_one", Path: _P("associativeListReference")},
190 },
191 },
192 },
193 Object: `
194 associativeListReference:
195 - name: a
196 value: 1
197 `,
198 APIVersion: "v1",
199 Managed: fieldpath.ManagedFields{
200 "apply_one": fieldpath.NewVersionedSet(
201 _NS(
202 _P("associativeListReference"),
203 ),
204 "v1",
205 false,
206 ),
207 },
208 },
209 "test_override_inline_atomic_list_with_associative": {
210
211
212 Ops: []fixture.Operation{
213 fixture.Apply{
214 Manager: "apply_one",
215 Object: `
216 separableInlineList:
217 - 1
218 `,
219 APIVersion: "v1",
220 },
221 fixture.Apply{
222 Manager: "apply_two",
223 Object: `
224 separableInlineList:
225 - 2
226 `,
227 APIVersion: "v1",
228 },
229 },
230 Object: `
231 separableInlineList:
232 - 1
233 - 2
234 `,
235 APIVersion: "v1",
236 Managed: fieldpath.ManagedFields{
237 "apply_one": fieldpath.NewVersionedSet(
238 _NS(
239 _P("separableInlineList", _V(1)),
240 ),
241 "v1",
242 true,
243 ),
244 "apply_two": fieldpath.NewVersionedSet(
245 _NS(
246 _P("separableInlineList", _V(2)),
247 ),
248 "v1",
249 true,
250 ),
251 },
252 },
253 }
254
255 for name, test := range tests {
256 t.Run(name, func(t *testing.T) {
257 if err := test.Test(overrideStructTypeParser); err != nil {
258 t.Fatal(err)
259 }
260 })
261 }
262 }
263
View as plain text