1
2
3
4 package resid
5
6 import (
7 "testing"
8 )
9
10 var resIdStringTests = []struct {
11 x ResId
12 s string
13 }{
14 {
15 ResId{
16 Namespace: "ns",
17 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
18 Name: "nm",
19 },
20 "k.v.g/nm.ns",
21 },
22 {
23 ResId{
24 Namespace: "ns",
25 Gvk: Gvk{Version: "v", Kind: "k"},
26 Name: "nm",
27 },
28 "k.v.[noGrp]/nm.ns",
29 },
30 {
31 ResId{
32 Namespace: "ns",
33 Gvk: Gvk{Kind: "k"},
34 Name: "nm",
35 },
36 "k.[noVer].[noGrp]/nm.ns",
37 },
38 {
39 ResId{
40 Namespace: "ns",
41 Gvk: Gvk{},
42 Name: "nm",
43 },
44 "[noKind].[noVer].[noGrp]/nm.ns",
45 },
46 {
47 ResId{
48 Gvk: Gvk{},
49 Name: "nm",
50 },
51 "[noKind].[noVer].[noGrp]/nm.[noNs]",
52 },
53 {
54 ResId{
55 Gvk: Gvk{},
56 },
57 "[noKind].[noVer].[noGrp]/[noName].[noNs]",
58 },
59 {
60 ResId{},
61 "[noKind].[noVer].[noGrp]/[noName].[noNs]",
62 },
63 }
64
65 func TestResIdString(t *testing.T) {
66 for _, hey := range resIdStringTests {
67 if hey.x.String() != hey.s {
68 t.Fatalf("Actual: %v, Expected: '%s'", hey.x, hey.s)
69 }
70 }
71 }
72
73 func TestResIdEquals(t *testing.T) {
74 var GvknEqualsTest = []struct {
75 id1 ResId
76 id2 ResId
77 gVknResult bool
78 nsEquals bool
79 equals bool
80 }{
81 {
82 id1: ResId{
83 Namespace: "X",
84 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
85 Name: "nm",
86 },
87 id2: ResId{
88 Namespace: "X",
89 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
90 Name: "nm",
91 },
92 gVknResult: true,
93 nsEquals: true,
94 equals: true,
95 },
96 {
97 id1: ResId{
98 Namespace: "X",
99 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
100 Name: "nm",
101 },
102 id2: ResId{
103 Namespace: "Z",
104 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
105 Name: "nm",
106 },
107 gVknResult: true,
108 nsEquals: false,
109 equals: false,
110 },
111 {
112 id1: ResId{
113 Namespace: "X",
114 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
115 Name: "nm",
116 },
117 id2: ResId{
118 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
119 Name: "nm",
120 },
121 gVknResult: true,
122 nsEquals: false,
123 equals: false,
124 },
125 {
126 id1: ResId{
127 Namespace: "X",
128 Gvk: Gvk{Version: "v", Kind: "k"},
129 Name: "nm",
130 },
131 id2: ResId{
132 Namespace: "Z",
133 Gvk: Gvk{Version: "v", Kind: "k"},
134 Name: "nm",
135 },
136 gVknResult: true,
137 nsEquals: false,
138 equals: false,
139 },
140 {
141 id1: ResId{
142 Namespace: "X",
143 Gvk: Gvk{Kind: "k"},
144 Name: "nm",
145 },
146 id2: ResId{
147 Namespace: "Z",
148 Gvk: Gvk{Kind: "k"},
149 Name: "nm",
150 },
151 gVknResult: true,
152 nsEquals: false,
153 equals: false,
154 },
155 {
156 id1: ResId{
157 Gvk: Gvk{Kind: "k"},
158 Name: "nm",
159 },
160 id2: ResId{
161 Gvk: Gvk{Kind: "k"},
162 Name: "nm2",
163 },
164 gVknResult: false,
165 nsEquals: true,
166 equals: false,
167 },
168 {
169 id1: ResId{
170 Gvk: Gvk{Kind: "k"},
171 Name: "nm",
172 },
173 id2: ResId{
174 Gvk: Gvk{Kind: "Node"},
175 Name: "nm",
176 },
177 gVknResult: false,
178 nsEquals: true,
179 equals: false,
180 },
181 {
182 id1: ResId{
183 Gvk: Gvk{Kind: "Node"},
184 Name: "nm1",
185 },
186 id2: ResId{
187 Gvk: Gvk{Kind: "Node"},
188 Name: "nm2",
189 },
190 gVknResult: false,
191 nsEquals: true,
192 equals: false,
193 },
194 {
195 id1: ResId{
196 Namespace: "default",
197 Gvk: Gvk{Kind: "k"},
198 Name: "nm1",
199 },
200 id2: ResId{
201 Gvk: Gvk{Kind: "k"},
202 Name: "nm2",
203 },
204 gVknResult: false,
205 nsEquals: true,
206 equals: false,
207 },
208 {
209 id1: ResId{
210 Namespace: "X",
211 Name: "nm",
212 },
213 id2: ResId{
214 Namespace: "Z",
215 Name: "nm",
216 },
217 gVknResult: true,
218 nsEquals: false,
219 equals: false,
220 },
221 }
222
223 for _, tst := range GvknEqualsTest {
224 if tst.id1.GvknEquals(tst.id2) != tst.gVknResult {
225 t.Fatalf("GvknEquals(\n%v,\n%v\n) should be %v",
226 tst.id1, tst.id2, tst.gVknResult)
227 }
228 if tst.id1.IsNsEquals(tst.id2) != tst.nsEquals {
229 t.Fatalf("IsNsEquals(\n%v,\n%v\n) should be %v",
230 tst.id1, tst.id2, tst.equals)
231 }
232 if tst.id1.Equals(tst.id2) != tst.equals {
233 t.Fatalf("Equals(\n%v,\n%v\n) should be %v",
234 tst.id1, tst.id2, tst.equals)
235 }
236 }
237 }
238
239 var ids = []ResId{
240 {
241 Namespace: "ns",
242 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
243 Name: "nm",
244 },
245 {
246 Namespace: "ns",
247 Gvk: Gvk{Version: "v", Kind: "k"},
248 Name: "nm",
249 },
250 {
251 Namespace: "ns",
252 Gvk: Gvk{Kind: "k"},
253 Name: "nm",
254 },
255 {
256 Namespace: "ns",
257 Gvk: Gvk{},
258 Name: "nm",
259 },
260 {
261 Gvk: Gvk{},
262 Name: "nm",
263 },
264 {
265 Gvk: Gvk{},
266 Name: "nm",
267 },
268 {
269 Gvk: Gvk{},
270 },
271 {
272 Gvk: Gvk{
273 Group: "rbac.authorization.k8s.io",
274 Version: "v1",
275 Kind: "ClusterRole",
276 isClusterScoped: true,
277 },
278 Name: "nm",
279 },
280 {
281 Gvk: Gvk{
282 Group: "rbac.authorization.k8s.io",
283 Version: "v1",
284 Kind: "ClusterRole",
285 isClusterScoped: true,
286 },
287 Name: "my.name",
288 },
289 }
290
291 func TestResIdIsSelected(t *testing.T) {
292 type selectable struct {
293 id ResId
294 expectSelected bool
295 }
296 var testCases = []struct {
297 selector ResId
298 selectables []selectable
299 }{
300 {
301 selector: ResId{
302 Namespace: "X",
303 Name: "nm",
304 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
305 },
306 selectables: []selectable{
307 {
308 id: ResId{
309 Namespace: "X",
310 Name: "nm",
311 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
312 },
313 expectSelected: true,
314 },
315 {
316 id: ResId{
317 Namespace: "x",
318 Name: "nm",
319 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
320 },
321 expectSelected: false,
322 },
323 {
324 id: ResId{
325 Name: "nm",
326 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
327 },
328 expectSelected: false,
329 },
330 },
331 },
332 {
333 selector: ResId{
334
335 Name: "nm",
336 Gvk: Gvk{Group: "g" , Kind: "k"},
337 },
338 selectables: []selectable{
339 {
340 id: ResId{
341 Namespace: "X",
342 Name: "nm",
343 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
344 },
345 expectSelected: true,
346 },
347 {
348 id: ResId{
349 Namespace: "x",
350 Name: "nm",
351 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
352 },
353 expectSelected: true,
354 },
355 {
356 id: ResId{
357 Name: "nm",
358 Gvk: Gvk{Group: "g", Version: "VVV", Kind: "k"},
359 },
360 expectSelected: true,
361 },
362 },
363 },
364 }
365
366 for _, tst := range testCases {
367 for _, pair := range tst.selectables {
368 if pair.id.IsSelectedBy(tst.selector) {
369 if !pair.expectSelected {
370 t.Fatalf(
371 "expected id %s to NOT be selected by %s",
372 pair.id, tst.selector)
373 }
374 } else {
375 if pair.expectSelected {
376 t.Fatalf(
377 "expected id %s to be selected by %s",
378 pair.id, tst.selector)
379 }
380 }
381 }
382 }
383 }
384
385 func TestFromString(t *testing.T) {
386 for _, id := range ids {
387 newId := FromString(id.String())
388 if newId != id {
389 t.Fatalf("Actual: %v, Expected: '%s'", newId, id)
390 }
391 }
392 }
393
394 func TestEffectiveNamespace(t *testing.T) {
395 var testCases = map[string]struct {
396 id ResId
397 expected string
398 }{
399 "tst1": {
400 id: ResId{
401 Gvk: NewGvk("", "v1", "Node"),
402 Name: "nm",
403 },
404 expected: TotallyNotANamespace,
405 },
406 "tst2": {
407 id: ResId{
408 Namespace: "foo",
409 Gvk: NewGvk("", "v1", "Node"),
410 Name: "nm",
411 },
412 expected: TotallyNotANamespace,
413 },
414 "tst3": {
415 id: ResId{
416 Namespace: "foo",
417 Gvk: NewGvk("g", "v", "k"),
418 Name: "nm",
419 },
420 expected: "foo",
421 },
422 "tst4": {
423 id: ResId{
424 Namespace: "",
425 Gvk: NewGvk("g", "v", "k"),
426 Name: "nm",
427 },
428 expected: DefaultNamespace,
429 },
430 "tst5": {
431 id: ResId{
432 Gvk: Gvk{Group: "g", Version: "v", Kind: "k"},
433 Name: "nm",
434 },
435 expected: DefaultNamespace,
436 },
437 }
438
439 for n, tst := range testCases {
440 t.Run(n, func(t *testing.T) {
441 if actual := tst.id.EffectiveNamespace(); actual != tst.expected {
442 t.Fatalf("EffectiveNamespace was %s, expected %s",
443 actual, tst.expected)
444 }
445 })
446 }
447 }
448
View as plain text