1
2
3
4 package object
5
6 import (
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 "k8s.io/apimachinery/pkg/runtime/schema"
11 )
12
13 var objMeta1 = ObjMetadata{
14 GroupKind: schema.GroupKind{
15 Group: "apps",
16 Kind: "Deployment",
17 },
18 Name: "dep",
19 Namespace: "default",
20 }
21
22 var objMeta2 = ObjMetadata{
23 GroupKind: schema.GroupKind{
24 Group: "apps",
25 Kind: "StatefulSet",
26 },
27 Name: "dep",
28 Namespace: "default",
29 }
30
31 var objMeta3 = ObjMetadata{
32 GroupKind: schema.GroupKind{
33 Group: "",
34 Kind: "Pod",
35 },
36 Name: "pod-a",
37 Namespace: "default",
38 }
39
40 var objMeta4 = ObjMetadata{
41 GroupKind: schema.GroupKind{
42 Group: "",
43 Kind: "Pod",
44 },
45 Name: "pod-b",
46 Namespace: "default",
47 }
48
49 func TestObjMetadataSetEquals(t *testing.T) {
50 testCases := map[string]struct {
51 setA ObjMetadataSet
52 setB ObjMetadataSet
53 isEqual bool
54 }{
55 "Empty sets results in empty union": {
56 setA: ObjMetadataSet{},
57 setB: ObjMetadataSet{},
58 isEqual: true,
59 },
60 "Empty second set results in same set": {
61 setA: ObjMetadataSet{objMeta1, objMeta3},
62 setB: ObjMetadataSet{},
63 isEqual: false,
64 },
65 "Empty initial set results in empty diff": {
66 setA: ObjMetadataSet{},
67 setB: ObjMetadataSet{objMeta1, objMeta3},
68 isEqual: false,
69 },
70 "Different ordering are equal sets": {
71 setA: ObjMetadataSet{objMeta2, objMeta1},
72 setB: ObjMetadataSet{objMeta1, objMeta2},
73 isEqual: true,
74 },
75 "One item overlap": {
76 setA: ObjMetadataSet{objMeta2, objMeta1},
77 setB: ObjMetadataSet{objMeta1, objMeta3},
78 isEqual: false,
79 },
80 "Disjoint sets results in larger set": {
81 setA: ObjMetadataSet{objMeta1, objMeta2},
82 setB: ObjMetadataSet{objMeta3, objMeta4},
83 isEqual: false,
84 },
85 }
86
87 for name, tc := range testCases {
88 t.Run(name, func(t *testing.T) {
89 actual := tc.setA.Equal(tc.setB)
90 if tc.isEqual != actual {
91 t.Errorf("Equal expected (%t), got (%t)", tc.isEqual, actual)
92 }
93 })
94 }
95 }
96
97 func TestObjMetadataSetUnion(t *testing.T) {
98 testCases := map[string]struct {
99 setA ObjMetadataSet
100 setB ObjMetadataSet
101 expected ObjMetadataSet
102 }{
103 "Empty sets results in empty union": {
104 setA: ObjMetadataSet{},
105 setB: ObjMetadataSet{},
106 expected: ObjMetadataSet{},
107 },
108 "Empty second set results in same set": {
109 setA: ObjMetadataSet{objMeta1, objMeta3},
110 setB: ObjMetadataSet{},
111 expected: ObjMetadataSet{objMeta1, objMeta3},
112 },
113 "Empty initial set results in empty diff": {
114 setA: ObjMetadataSet{},
115 setB: ObjMetadataSet{objMeta1, objMeta3},
116 expected: ObjMetadataSet{objMeta1, objMeta3},
117 },
118 "Same sets in different order results in same set": {
119 setA: ObjMetadataSet{objMeta2, objMeta1},
120 setB: ObjMetadataSet{objMeta1, objMeta2},
121 expected: ObjMetadataSet{objMeta1, objMeta2},
122 },
123 "One item overlap": {
124 setA: ObjMetadataSet{objMeta2, objMeta1},
125 setB: ObjMetadataSet{objMeta1, objMeta3},
126 expected: ObjMetadataSet{objMeta1, objMeta2, objMeta3},
127 },
128 "Disjoint sets results in larger set": {
129 setA: ObjMetadataSet{objMeta1, objMeta2},
130 setB: ObjMetadataSet{objMeta3, objMeta4},
131 expected: ObjMetadataSet{objMeta1, objMeta2, objMeta3, objMeta4},
132 },
133 }
134
135 for name, tc := range testCases {
136 t.Run(name, func(t *testing.T) {
137 actual := tc.setA.Union(tc.setB)
138 if !tc.expected.Equal(actual) {
139 t.Errorf("Union expected set (%s), got (%s)", tc.expected, actual)
140 }
141 })
142 }
143 }
144
145 func TestObjMetadataSetDiff(t *testing.T) {
146 testCases := map[string]struct {
147 setA ObjMetadataSet
148 setB ObjMetadataSet
149 expected ObjMetadataSet
150 }{
151 "Empty sets results in empty diff": {
152 setA: ObjMetadataSet{},
153 setB: ObjMetadataSet{},
154 expected: ObjMetadataSet{},
155 },
156 "Empty subtraction set results in same set": {
157 setA: ObjMetadataSet{objMeta1, objMeta3},
158 setB: ObjMetadataSet{},
159 expected: ObjMetadataSet{objMeta1, objMeta3},
160 },
161 "Empty initial set results in empty diff": {
162 setA: ObjMetadataSet{},
163 setB: ObjMetadataSet{objMeta1, objMeta3},
164 expected: ObjMetadataSet{},
165 },
166 "Sets equal results in empty diff": {
167 setA: ObjMetadataSet{objMeta2, objMeta1},
168 setB: ObjMetadataSet{objMeta1, objMeta2},
169 expected: ObjMetadataSet{},
170 },
171 "Basic diff": {
172 setA: ObjMetadataSet{objMeta2, objMeta1},
173 setB: ObjMetadataSet{objMeta1},
174 expected: ObjMetadataSet{objMeta2},
175 },
176 "Subtract non-elements results in no change": {
177 setA: ObjMetadataSet{objMeta1},
178 setB: ObjMetadataSet{objMeta3, objMeta4},
179 expected: ObjMetadataSet{objMeta1},
180 },
181 }
182
183 for name, tc := range testCases {
184 t.Run(name, func(t *testing.T) {
185 actual := tc.setA.Diff(tc.setB)
186 if !tc.expected.Equal(actual) {
187 t.Errorf("Diff expected set (%s), got (%s)", tc.expected, actual)
188 }
189 })
190 }
191 }
192
193 func TestObjMetadataSetHash(t *testing.T) {
194 tests := map[string]struct {
195 objs ObjMetadataSet
196 expected string
197 }{
198 "No objects gives valid hash": {
199 objs: ObjMetadataSet{},
200 expected: "811c9dc5",
201 },
202 "Single object gives valid hash": {
203 objs: ObjMetadataSet{objMeta1},
204 expected: "3715cd95",
205 },
206 "Multiple objects gives valid hash": {
207 objs: ObjMetadataSet{objMeta1, objMeta2, objMeta3},
208 expected: "d69d726a",
209 },
210 "Different ordering gives same hash": {
211 objs: ObjMetadataSet{objMeta2, objMeta3, objMeta1},
212 expected: "d69d726a",
213 },
214 }
215
216 for name, tc := range tests {
217 t.Run(name, func(t *testing.T) {
218 actual := tc.objs.Hash()
219 assert.Equal(t, tc.expected, actual)
220 })
221 }
222 }
223
View as plain text