kubelatte-ce

Форк
2
Форк от sbertech/kubelatte-ce
/
pods_mutation_test.go 
822 строки · 20.7 Кб
1
package mutation
2

3
import (
4
	"context"
5
	"gitverse.ru/synapse/kubelatte/pkg/api/v1alpha1"
6
	"gitverse.ru/synapse/kubelatte/pkg/observability/logger/lib"
7
	"gitverse.ru/synapse/kubelatte/pkg/util"
8
	baseMatch "gitverse.ru/synapse/kubelatte/pkg/util/match"
9
	"go.uber.org/zap"
10
	"reflect"
11
	"testing"
12
)
13

14
var templateWithAContainer = v1alpha1.Template{
15
	Spec: v1alpha1.TemplateSpec{Data: `spec:
16
  containers:
17
    - name: container_mutated
18
      image: imagemut
19
      env:
20
        - name: env_name_mutated
21
          value: '_mutated'
22
        - name: ENV_10_mutated
23
          value: '_mutated'
24
      resources:
25
        limits:
26
          cpu: '55_mutated'
27
          memory: '55_mutated'
28
        requests:
29
          cpu: 55_mutated
30
          memory: 55_mutated
31
      args:
32
        - arg1mut
33
      securityContext:
34
        capabilities:
35
          drop:
36
            - ALL_mutated`,
37
	},
38
}
39

40
var templateWithContainers = v1alpha1.Template{
41
	Spec: v1alpha1.TemplateSpec{
42
		Data: `spec:
43
      containers:
44
        - name: container_mutated
45
          image: image-1
46
          env:
47
            - name: ENV_1_ADD
48
              value: 'false'
49
            - name: ENV_2
50
              value: 'false'
51
        - name: some-other-container
52
          image: image-2
53
          resources:
54
            limits:
55
              cpu: '51m'
56
              memory: '51Mi'
57
            requests:
58
              cpu: 50m
59
              memory: 50Mi`,
60
	},
61
}
62

63
var templateWithContainersWithIntersections = v1alpha1.Template{
64
	Spec: v1alpha1.TemplateSpec{
65
		Data: `spec:
66
      containers:
67
        - name: container_mutated
68
          image: image-1
69
          env:
70
            - name: ENV_1_ADD
71
              value: 'false'
72
            - name: ENV_2
73
              value: 'false'
74
        - name: some-other-container
75
          image: image-2
76
          resources:
77
            limits:
78
              cpu: '51m'
79
              memory: '51Mi'
80
            requests:
81
              cpu: 50m
82
              memory: 50Mi
83
        - name: container_mutated
84
          image: image-1-REPLACED
85
          env:
86
            - name: ENV_1_ADD-REPLACED
87
              value: 'false-REPLACED'
88
            - name: ENV_2-REPLACED
89
              value: 'false-REPLACED'
90
`,
91
	},
92
}
93

94
var templateWithAVolume = v1alpha1.Template{
95
	Spec: v1alpha1.TemplateSpec{
96
		Data: `spec:
97
      volumes:
98
        - name: volume_mutated1
99
          configMap:
100
            name: istio`,
101
	},
102
}
103

104
var templateWithAVolumeWithIntersection = v1alpha1.Template{
105
	Spec: v1alpha1.TemplateSpec{
106
		Data: `spec:
107
      volumes:
108
        - name: volume_mutated1
109
          configMap:
110
            name: istio
111
        - name: volume_mutated1
112
          configMap:
113
            name: istio-REPLACED`,
114
	},
115
}
116

117
var templateWithVolumes = v1alpha1.Template{
118
	Spec: v1alpha1.TemplateSpec{
119
		Data: `spec:
120
      volumes:
121
        - name: volume_mutated1
122
          configMap:
123
            name: istio
124
        - name: volume_mutated2
125
          hostPath:
126
            path: /data
127
            type: Directory
128
        - name: volume_mutated3
129
          secret:
130
            secretName: mysecret
131
            optional: true`,
132
	},
133
}
134

135
var templateWithVolumesWithIntersections = v1alpha1.Template{
136
	Spec: v1alpha1.TemplateSpec{
137
		Data: `spec:
138
      volumes:
139
        - name: volume_mutated1
140
          configMap:
141
            name: istio
142
        - name: volume_mutated2
143
          hostPath:
144
            path: /data
145
            type: Directory
146
        - name: volume_mutated1
147
          configMap:
148
            name: istio-REPLACED
149
          secret:
150
            secretName: mysecret
151
            optional: true`,
152
	},
153
}
154

155
var templateWithAnAnnotation = v1alpha1.Template{
156
	Spec: v1alpha1.TemplateSpec{
157
		Data: `metadata:
158
  annotations:
159
    annotation_mutated1: val-after-mutation`,
160
	},
161
}
162

163
var templateWithAnnotations = v1alpha1.Template{
164
	Spec: v1alpha1.TemplateSpec{
165
		Data: `metadata:
166
  annotations:
167
    annotation_mutated1: val-after-mutation
168
    annotation_mutated2: another-val-after-mutation`,
169
	},
170
}
171

172
func TestMutateController_getRendersOldLogic(t *testing.T) {
173
	type args struct {
174
		obj    map[string]interface{}
175
		config v1alpha1.MutationConfig
176
	}
177
	tests := []struct {
178
		name string
179
		args args
180

181
		templates map[string]v1alpha1.Template
182

183
		want []util.RenderItem
184
	}{
185
		{
186
			name: "merge_mutation_with_a_container",
187
			args: args{
188
				config: v1alpha1.MutationConfig{
189
					Name:           "mutation cfg",
190
					UpdateStrategy: string(MergeStrategy),
191
					Containers:     []string{"some-ns/some-templ/container_mutated"},
192
				},
193
			},
194
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAContainer},
195
			want: []util.RenderItem{{Render: `spec:
196
  containers:
197
  - args:
198
    - arg1mut
199
    env:
200
    - name: env_name_mutated
201
      value: _mutated
202
    - name: ENV_10_mutated
203
      value: _mutated
204
    image: imagemut
205
    name: container_mutated
206
    resources:
207
      limits:
208
        cpu: 55_mutated
209
        memory: 55_mutated
210
      requests:
211
        cpu: 55_mutated
212
        memory: 55_mutated
213
    securityContext:
214
      capabilities:
215
        drop:
216
        - ALL_mutated
217
`}},
218
		},
219
		{
220
			name: "merge_mutation_with_containers",
221
			args: args{
222
				config: v1alpha1.MutationConfig{
223
					Name:           "mutation cfg",
224
					UpdateStrategy: string(MergeStrategy),
225
					Containers: []string{"some-ns/some-templ/container_mutated",
226
						"some-ns/some-templ/some-other-container"},
227
				},
228
			},
229
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithContainers},
230
			want: []util.RenderItem{{
231
				Render: `spec:
232
  containers:
233
  - env:
234
    - name: ENV_1_ADD
235
      value: "false"
236
    - name: ENV_2
237
      value: "false"
238
    image: image-1
239
    name: container_mutated
240
`},
241
				{Render: `spec:
242
  containers:
243
  - image: image-2
244
    name: some-other-container
245
    resources:
246
      limits:
247
        cpu: 51m
248
        memory: 51Mi
249
      requests:
250
        cpu: 50m
251
        memory: 50Mi
252
`}},
253
		},
254
		{
255
			name: "merge_mutation_with_containers_with_intersections",
256
			args: args{
257
				config: v1alpha1.MutationConfig{
258
					Name:           "mutation cfg",
259
					UpdateStrategy: string(MergeStrategy),
260
					Containers: []string{"some-ns/some-templ/container_mutated",
261
						"some-ns/some-templ/some-other-container"},
262
				},
263
			},
264
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithContainersWithIntersections},
265
			want: []util.RenderItem{{
266
				Render: `spec:
267
  containers:
268
  - env:
269
    - name: ENV_1_ADD
270
      value: "false"
271
    - name: ENV_2
272
      value: "false"
273
    image: image-1
274
    name: container_mutated
275
`},
276
				{Render: `spec:
277
  containers:
278
  - env:
279
    - name: ENV_1_ADD-REPLACED
280
      value: false-REPLACED
281
    - name: ENV_2-REPLACED
282
      value: false-REPLACED
283
    image: image-1-REPLACED
284
    name: container_mutated
285
`},
286
				{Render: `spec:
287
  containers:
288
  - image: image-2
289
    name: some-other-container
290
    resources:
291
      limits:
292
        cpu: 51m
293
        memory: 51Mi
294
      requests:
295
        cpu: 50m
296
        memory: 50Mi
297
`}},
298
		},
299
		{
300
			name: "merge_mutation_with_a_volume",
301
			args: args{
302
				config: v1alpha1.MutationConfig{
303
					Name:           "mutation volume",
304
					UpdateStrategy: string(MergeStrategy),
305
					Volumes:        []string{"some-ns/some-templ/volume_mutated1"},
306
				},
307
			},
308
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAVolume},
309
			want: []util.RenderItem{{
310
				Render: `spec:
311
  volumes:
312
  - configMap:
313
      name: istio
314
    name: volume_mutated1
315
`}},
316
		},
317
		{
318
			name: "merge_mutation_with_volumes",
319
			args: args{
320
				config: v1alpha1.MutationConfig{
321
					Name:           "mutation volume",
322
					UpdateStrategy: string(MergeStrategy),
323
					Volumes:        []string{"some-ns/some-templ/volume_mutated1", "some-ns/some-templ/volume_mutated2", "some-ns/some-templ/volume_mutated3"},
324
				},
325
			},
326
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithVolumes},
327
			want: []util.RenderItem{{
328
				Render: `spec:
329
  volumes:
330
  - configMap:
331
      name: istio
332
    name: volume_mutated1
333
`}, {
334
				Render: `spec:
335
  volumes:
336
  - hostPath:
337
      path: /data
338
      type: Directory
339
    name: volume_mutated2
340
`}, {
341
				Render: `spec:
342
  volumes:
343
  - name: volume_mutated3
344
    secret:
345
      optional: true
346
      secretName: mysecret
347
`}},
348
		},
349
		{
350
			name: "merge_mutation_with_volumes_with_intersections",
351
			args: args{
352
				config: v1alpha1.MutationConfig{
353
					Name:           "mutation volume",
354
					UpdateStrategy: string(MergeStrategy),
355
					Volumes:        []string{"some-ns/some-templ/volume_mutated1", "some-ns/some-templ/volume_mutated2"},
356
				},
357
			},
358
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithVolumesWithIntersections},
359
			want: []util.RenderItem{{
360
				Render: `spec:
361
  volumes:
362
  - configMap:
363
      name: istio
364
    name: volume_mutated1
365
`}, {
366
				Render: `spec:
367
  volumes:
368
  - configMap:
369
      name: istio-REPLACED
370
    name: volume_mutated1
371
    secret:
372
      optional: true
373
      secretName: mysecret
374
`}, {
375
				Render: `spec:
376
  volumes:
377
  - hostPath:
378
      path: /data
379
      type: Directory
380
    name: volume_mutated2
381
`}},
382
		},
383
		{
384
			name: "merge_mutation_with_an_annotation",
385
			args: args{
386
				config: v1alpha1.MutationConfig{
387
					Name:           "mutation annot",
388
					UpdateStrategy: string(MergeStrategy),
389
					Annotations:    []string{"some-ns/some-templ/annotation_mutated1"},
390
				},
391
			},
392
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAnAnnotation},
393
			want: []util.RenderItem{{
394
				Render: `metadata:
395
  annotations:
396
    annotation_mutated1: val-after-mutation
397
`}},
398
		},
399
		{
400
			name: "replace_mutation_with_an_annotation",
401
			args: args{
402
				config: v1alpha1.MutationConfig{
403
					Name:           "mutation annot",
404
					UpdateStrategy: string(ReplaceStrategy),
405
					Annotations:    []string{"some-ns/some-templ/annotation_mutated1"},
406
				},
407
			},
408
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAnAnnotation},
409
			want: []util.RenderItem{{
410
				Render: `metadata:
411
  annotations:
412
    annotation_mutated1: val-after-mutation
413
`}},
414
		},
415
		{
416
			name: "merge_mutation_with_annotations",
417
			args: args{
418
				config: v1alpha1.MutationConfig{
419
					Name:           "mutation annot",
420
					UpdateStrategy: string(MergeStrategy),
421
					Annotations: []string{"some-ns/some-templ/annotation_mutated1",
422
						"some-ns/some-templ/annotation_mutated2"},
423
				},
424
			},
425
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAnnotations},
426
			want: []util.RenderItem{
427
				{Render: `metadata:
428
  annotations:
429
    annotation_mutated1: val-after-mutation
430
`},
431
				{Render: `metadata:
432
  annotations:
433
    annotation_mutated2: another-val-after-mutation
434
`}},
435
		},
436
		{
437
			name: "merge_mutation_with_annotations",
438
			args: args{
439
				config: v1alpha1.MutationConfig{
440
					Name:           "mutation annot",
441
					UpdateStrategy: string(ReplaceStrategy),
442
					Annotations: []string{"some-ns/some-templ/annotation_mutated1",
443
						"some-ns/some-templ/annotation_mutated2"},
444
				},
445
			},
446
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAnnotations},
447
			want: []util.RenderItem{
448
				{Render: `metadata:
449
  annotations:
450
    annotation_mutated1: val-after-mutation
451
`},
452
				{Render: `metadata:
453
  annotations:
454
    annotation_mutated2: another-val-after-mutation
455
`}},
456
		},
457
		{
458
			name: "merge_mutation_with_annotations_with_adding",
459
			args: args{
460
				obj: map[string]interface{}{"metadata": map[string]interface{}{
461
					"annotations": map[string]interface{}{
462
						"annotation_mutated1": "val-after-mutation",
463
						"annot2":              "value2",
464
					},
465
				}},
466
				config: v1alpha1.MutationConfig{
467
					Name:           "mutation annot",
468
					UpdateStrategy: string(ReplaceStrategy),
469
					Annotations: []string{"some-ns/some-templ/annotation_mutated1",
470
						"some-ns/some-templ/annotation_mutated2"},
471
				},
472
			},
473
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAnnotations},
474
			want: []util.RenderItem{
475
				{Render: `metadata:
476
  annotations:
477
    annotation_mutated1: val-after-mutation
478
`},
479
				{Render: `metadata:
480
  annotations:
481
    annotation_mutated2: another-val-after-mutation
482
`}},
483
		},
484
		{
485
			name: "replace_mutation_adding_container", // replaced container not in obj
486
			args: args{
487
				obj: map[string]interface{}{"spec": map[string]interface{}{
488
					"containers": []interface{}{
489
						map[string]interface{}{
490
							"name":  "orig_to-test-latte",
491
							"image": "orig_img",
492
							"resources": map[string]interface{}{
493
								"limits":   map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
494
								"requests": map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
495
							},
496
						},
497
					},
498
				}},
499
				config: v1alpha1.MutationConfig{
500
					Name:           "mutation cfg",
501
					UpdateStrategy: string(ReplaceStrategy),
502
					Containers:     []string{"some-ns/some-templ/container_mutated"},
503
				},
504
			},
505
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAContainer},
506
			want: []util.RenderItem{{Render: `spec:
507
  containers:
508
  - image: orig_img
509
    name: orig_to-test-latte
510
    resources:
511
      limits:
512
        cpu: orig_100m
513
        memory: orig_100Mi
514
      requests:
515
        cpu: orig_100m
516
        memory: orig_100Mi
517
  - args:
518
    - arg1mut
519
    env:
520
    - name: env_name_mutated
521
      value: _mutated
522
    - name: ENV_10_mutated
523
      value: _mutated
524
    image: imagemut
525
    name: container_mutated
526
    resources:
527
      limits:
528
        cpu: 55_mutated
529
        memory: 55_mutated
530
      requests:
531
        cpu: 55_mutated
532
        memory: 55_mutated
533
    securityContext:
534
      capabilities:
535
        drop:
536
        - ALL_mutated
537
`}},
538
		},
539
		{
540
			name: "replace_mutation_replacing_container", // replaced container in obj
541
			args: args{
542
				obj: map[string]interface{}{"spec": map[string]interface{}{
543
					"containers": []interface{}{
544
						map[string]interface{}{
545
							"name":  "container_mutated",
546
							"image": "orig_img",
547
							"resources": map[string]interface{}{
548
								"limits":   map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
549
								"requests": map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
550
							},
551
						},
552
					},
553
				}},
554
				config: v1alpha1.MutationConfig{
555
					Name:           "mutation cfg",
556
					UpdateStrategy: string(ReplaceStrategy),
557
					Containers:     []string{"some-ns/some-templ/container_mutated"},
558
				},
559
			},
560
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAContainer},
561
			want: []util.RenderItem{{Render: `spec:
562
  containers:
563
  - args:
564
    - arg1mut
565
    env:
566
    - name: env_name_mutated
567
      value: _mutated
568
    - name: ENV_10_mutated
569
      value: _mutated
570
    image: imagemut
571
    name: container_mutated
572
    resources:
573
      limits:
574
        cpu: 55_mutated
575
        memory: 55_mutated
576
      requests:
577
        cpu: 55_mutated
578
        memory: 55_mutated
579
    securityContext:
580
      capabilities:
581
        drop:
582
        - ALL_mutated
583
`}},
584
		},
585
		{
586
			name: "replace_mutation_intersection_container", // replaced container in obj
587
			args: args{
588
				obj: map[string]interface{}{"spec": map[string]interface{}{
589
					"containers": []interface{}{
590
						map[string]interface{}{
591
							"name":  "container_mutated",
592
							"image": "orig_img",
593
							"resources": map[string]interface{}{
594
								"limits":   map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
595
								"requests": map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
596
							},
597
						},
598
					},
599
				}},
600
				config: v1alpha1.MutationConfig{
601
					Name:           "mutation cfg",
602
					UpdateStrategy: string(ReplaceStrategy),
603
					Containers: []string{"some-ns/some-templ/container_mutated",
604
						"some-ns/some-templ/some-other-container"},
605
				},
606
			},
607
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithContainersWithIntersections},
608
			want: []util.RenderItem{{
609
				Render: `spec:
610
  containers:
611
  - env:
612
    - name: ENV_1_ADD
613
      value: "false"
614
    - name: ENV_2
615
      value: "false"
616
    image: image-1
617
    name: container_mutated
618
`}, {Render: `spec:
619
  containers:
620
  - env:
621
    - name: ENV_1_ADD-REPLACED
622
      value: false-REPLACED
623
    - name: ENV_2-REPLACED
624
      value: false-REPLACED
625
    image: image-1-REPLACED
626
    name: container_mutated
627
`}, {Render: `spec:
628
  containers:
629
  - env:
630
    - name: ENV_1_ADD-REPLACED
631
      value: false-REPLACED
632
    - name: ENV_2-REPLACED
633
      value: false-REPLACED
634
    image: image-1-REPLACED
635
    name: container_mutated
636
  - image: image-2
637
    name: some-other-container
638
    resources:
639
      limits:
640
        cpu: 51m
641
        memory: 51Mi
642
      requests:
643
        cpu: 50m
644
        memory: 50Mi
645
`}},
646
		},
647
		{
648
			name: "replace_mutation_with_a_volume_adding_vol",
649
			args: args{
650
				obj: map[string]interface{}{"spec": map[string]interface{}{
651
					"volumes": []interface{}{
652
						map[string]interface{}{
653
							"name":  "volume_mutated",
654
							"image": "orig_img",
655
							"resources": map[string]interface{}{
656
								"limits":   map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
657
								"requests": map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
658
							},
659
						},
660
					},
661
				}},
662

663
				config: v1alpha1.MutationConfig{
664
					Name:           "mutation volume",
665
					UpdateStrategy: string(ReplaceStrategy),
666
					Volumes:        []string{"some-ns/some-templ/volume_mutated1"},
667
				},
668
			},
669
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAVolume},
670
			want: []util.RenderItem{{
671
				Render: `spec:
672
  volumes:
673
  - image: orig_img
674
    name: volume_mutated
675
    resources:
676
      limits:
677
        cpu: orig_100m
678
        memory: orig_100Mi
679
      requests:
680
        cpu: orig_100m
681
        memory: orig_100Mi
682
  - configMap:
683
      name: istio
684
    name: volume_mutated1
685
`}},
686
		},
687
		{
688
			name: "replace_mutation_with_a_volume_replace_vol",
689
			args: args{
690
				obj: map[string]interface{}{"spec": map[string]interface{}{
691
					"volumes": []interface{}{
692
						map[string]interface{}{
693
							"name":  "volume_mutated1",
694
							"image": "orig_img",
695
							"resources": map[string]interface{}{
696
								"limits":   map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
697
								"requests": map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
698
							},
699
						},
700
					},
701
				}},
702

703
				config: v1alpha1.MutationConfig{
704
					Name:           "mutation volume",
705
					UpdateStrategy: string(ReplaceStrategy),
706
					Volumes:        []string{"some-ns/some-templ/volume_mutated1"},
707
				},
708
			},
709
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAVolume},
710
			want: []util.RenderItem{{
711
				Render: `spec:
712
  volumes:
713
  - configMap:
714
      name: istio
715
    name: volume_mutated1
716
`}},
717
		},
718
		{
719
			name: "replace_mutation_with_a_volume_replace_vol",
720
			args: args{
721
				obj: map[string]interface{}{"spec": map[string]interface{}{
722
					"volumes": []interface{}{
723
						map[string]interface{}{
724
							"name":  "volume_mutated1",
725
							"image": "orig_img",
726
							"resources": map[string]interface{}{
727
								"limits":   map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
728
								"requests": map[string]interface{}{"cpu": "orig_100m", "memory": "orig_100Mi"},
729
							},
730
						},
731
					},
732
				}},
733

734
				config: v1alpha1.MutationConfig{
735
					Name:           "mutation volume",
736
					UpdateStrategy: string(ReplaceStrategy),
737
					Volumes:        []string{"some-ns/some-templ/volume_mutated1"},
738
				},
739
			},
740
			templates: map[string]v1alpha1.Template{"some-ns/some-templ": templateWithAVolumeWithIntersection},
741
			want: []util.RenderItem{{
742
				Render: `spec:
743
  volumes:
744
  - configMap:
745
      name: istio
746
    name: volume_mutated1
747
`}, {Render: `spec:
748
  volumes:
749
  - configMap:
750
      name: istio-REPLACED
751
    name: volume_mutated1
752
`}},
753
		},
754
	}
755
	for _, tt := range tests {
756
		t.Run(tt.name, func(t *testing.T) {
757
			lib.ZapLogger = zap.NewNop()
758

759
			rI := NewMutRenderer(baseMatch.NewMatcher(), nil)
760
			r := rI.(*MutRenderer)
761
			got := r.getRendersForPod(context.Background(), tt.templates, tt.args.obj, tt.args.config)
762

763
			if len(got) != len(tt.want) {
764
				t.Fatalf("len got = %v, len want = %v.\ngot: %v\n",
765
					len(got), len(tt.want), got)
766
			}
767

768
			for i := range got {
769
				if !reflect.DeepEqual(got[i].Render, tt.want[i].Render) {
770
					t.Errorf("getRendersForPod()[%v].Render = \n%+v, want \n%+v", i, got[i].Render, tt.want[i].Render)
771
				}
772
			}
773
		})
774
	}
775
}
776

777
func Test_convert(t *testing.T) {
778
	type args struct {
779
		i interface{}
780
	}
781
	tests := []struct {
782
		name string
783
		args args
784
		want interface{}
785
	}{
786
		{
787
			name: "map string interface",
788
			args: args{
789
				i: map[string]interface{}{
790
					"metadata": map[string]interface{}{
791
						"test": "value",
792
					},
793
				},
794
			},
795
			want: map[string]interface{}{
796
				"metadata": map[string]interface{}{
797
					"test": "value",
798
				},
799
			},
800
		},
801
		{
802
			name: "map slice of interfaces",
803
			args: args{
804
				i: []interface{}{
805
					map[string]string{
806
						"test": "value",
807
					},
808
				},
809
			},
810
			want: []interface{}{
811
				map[string]string{"test": "value"},
812
			},
813
		},
814
	}
815
	for _, tt := range tests {
816
		t.Run(tt.name, func(t *testing.T) {
817
			if got := convert(tt.args.i); !reflect.DeepEqual(got, tt.want) {
818
				t.Errorf("convert() = %v, want %v", got, tt.want)
819
			}
820
		})
821
	}
822
}
823

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.