1
2
3
4 package event
5
6 import (
7 "fmt"
8 "testing"
9
10 "github.com/stretchr/testify/assert"
11 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
12 "k8s.io/apimachinery/pkg/runtime/schema"
13 "sigs.k8s.io/cli-utils/pkg/kstatus/status"
14 "sigs.k8s.io/cli-utils/pkg/object"
15 )
16
17 func TestDeepEqual(t *testing.T) {
18 testCases := map[string]struct {
19 actual ResourceStatus
20 expected ResourceStatus
21 equal bool
22 }{
23 "same resource should be equal": {
24 actual: ResourceStatus{
25 Identifier: object.ObjMetadata{
26 GroupKind: schema.GroupKind{
27 Group: "apps",
28 Kind: "Deployment",
29 },
30 Namespace: "default",
31 Name: "Foo",
32 },
33 Resource: &unstructured.Unstructured{
34 Object: map[string]interface{}{
35 "metadata": map[string]interface{}{
36 "generation": int64(1),
37 },
38 },
39 },
40 Status: status.UnknownStatus,
41 Message: "Some message",
42 },
43 expected: ResourceStatus{
44 Identifier: object.ObjMetadata{
45 GroupKind: schema.GroupKind{
46 Group: "apps",
47 Kind: "Deployment",
48 },
49 Namespace: "default",
50 Name: "Foo",
51 },
52 Resource: &unstructured.Unstructured{
53 Object: map[string]interface{}{
54 "metadata": map[string]interface{}{
55 "generation": int64(2),
56 },
57 },
58 },
59 Status: status.UnknownStatus,
60 Message: "Some message",
61 },
62 equal: false,
63 },
64 "different resources with only name different": {
65 actual: ResourceStatus{
66 Identifier: object.ObjMetadata{
67 GroupKind: schema.GroupKind{
68 Group: "apps",
69 Kind: "Deployment",
70 },
71 Namespace: "default",
72 Name: "Foo",
73 },
74 Status: status.CurrentStatus,
75 },
76 expected: ResourceStatus{
77 Identifier: object.ObjMetadata{
78 GroupKind: schema.GroupKind{
79 Group: "apps",
80 Kind: "Deployment",
81 },
82 Namespace: "default",
83 Name: "Bar",
84 },
85 Status: status.CurrentStatus,
86 },
87 equal: false,
88 },
89 "different GroupKind otherwise same": {
90 actual: ResourceStatus{
91 Identifier: object.ObjMetadata{
92 GroupKind: schema.GroupKind{
93 Group: "apps",
94 Kind: "Deployment",
95 },
96 Namespace: "default",
97 Name: "Bar",
98 },
99 Status: status.CurrentStatus,
100 },
101 expected: ResourceStatus{
102 Identifier: object.ObjMetadata{
103 GroupKind: schema.GroupKind{
104 Group: "custom.io",
105 Kind: "Deployment",
106 },
107 Namespace: "default",
108 Name: "Bar",
109 },
110 Status: status.CurrentStatus,
111 },
112 equal: false,
113 },
114 "same resource with same error": {
115 actual: ResourceStatus{
116 Identifier: object.ObjMetadata{
117 GroupKind: schema.GroupKind{
118 Group: "apps",
119 Kind: "Deployment",
120 },
121 Namespace: "default",
122 Name: "Bar",
123 },
124 Status: status.UnknownStatus,
125 Error: fmt.Errorf("this is a test"),
126 },
127 expected: ResourceStatus{
128 Identifier: object.ObjMetadata{
129 GroupKind: schema.GroupKind{
130 Group: "apps",
131 Kind: "Deployment",
132 },
133 Namespace: "default",
134 Name: "Bar",
135 },
136 Status: status.UnknownStatus,
137 Error: fmt.Errorf("this is a test"),
138 },
139 equal: true,
140 },
141 "same resource with different error": {
142 actual: ResourceStatus{
143 Identifier: object.ObjMetadata{
144 GroupKind: schema.GroupKind{
145 Group: "apps",
146 Kind: "Deployment",
147 },
148 Namespace: "default",
149 Name: "Bar",
150 },
151 Status: status.UnknownStatus,
152 Error: fmt.Errorf("this is a test"),
153 },
154 expected: ResourceStatus{
155 Identifier: object.ObjMetadata{
156 GroupKind: schema.GroupKind{
157 Group: "apps",
158 Kind: "Deployment",
159 },
160 Namespace: "default",
161 Name: "Bar",
162 },
163 Status: status.UnknownStatus,
164 Error: fmt.Errorf("this is a different error"),
165 },
166 equal: false,
167 },
168 "same resource different status": {
169 actual: ResourceStatus{
170 Identifier: object.ObjMetadata{
171 GroupKind: schema.GroupKind{
172 Group: "apps",
173 Kind: "Deployment",
174 },
175 Namespace: "default",
176 Name: "Bar",
177 },
178 Status: status.CurrentStatus,
179 },
180 expected: ResourceStatus{
181 Identifier: object.ObjMetadata{
182 GroupKind: schema.GroupKind{
183 Group: "apps",
184 Kind: "Deployment",
185 },
186 Namespace: "default",
187 Name: "Bar",
188 },
189 Status: status.InProgressStatus,
190 },
191 equal: false,
192 },
193 "same resource with different number of generated resources": {
194 actual: ResourceStatus{
195 Identifier: object.ObjMetadata{
196 GroupKind: schema.GroupKind{
197 Group: "apps",
198 Kind: "Deployment",
199 },
200 Namespace: "default",
201 Name: "Bar",
202 },
203 Status: status.InProgressStatus,
204 GeneratedResources: []*ResourceStatus{
205 {
206 Identifier: object.ObjMetadata{
207 GroupKind: schema.GroupKind{
208 Group: "apps",
209 Kind: "ReplicaSet",
210 },
211 Namespace: "default",
212 Name: "Bar-123",
213 },
214 Status: status.InProgressStatus,
215 },
216 },
217 },
218 expected: ResourceStatus{
219 Identifier: object.ObjMetadata{
220 GroupKind: schema.GroupKind{
221 Group: "apps",
222 Kind: "Deployment",
223 },
224 Namespace: "default",
225 Name: "Bar",
226 },
227 Status: status.InProgressStatus,
228 },
229 equal: false,
230 },
231 "same resource with different status on generated resources": {
232 actual: ResourceStatus{
233 Identifier: object.ObjMetadata{
234 GroupKind: schema.GroupKind{
235 Group: "apps",
236 Kind: "Deployment",
237 },
238 Namespace: "default",
239 Name: "Bar",
240 },
241 Status: status.InProgressStatus,
242 GeneratedResources: []*ResourceStatus{
243 {
244 Identifier: object.ObjMetadata{
245 GroupKind: schema.GroupKind{
246 Group: "apps",
247 Kind: "ReplicaSet",
248 },
249 Namespace: "default",
250 Name: "Bar-123",
251 },
252 Status: status.InProgressStatus,
253 },
254 },
255 },
256 expected: ResourceStatus{
257 Identifier: object.ObjMetadata{
258 GroupKind: schema.GroupKind{
259 Group: "apps",
260 Kind: "Deployment",
261 },
262 Namespace: "default",
263 Name: "Bar",
264 },
265 Status: status.InProgressStatus,
266 GeneratedResources: []*ResourceStatus{
267 {
268 Identifier: object.ObjMetadata{
269 GroupKind: schema.GroupKind{
270 Group: "apps",
271 Kind: "ReplicaSet",
272 },
273 Namespace: "default",
274 Name: "Bar-123",
275 },
276 Status: status.CurrentStatus,
277 },
278 },
279 },
280 equal: false,
281 },
282 }
283
284 for tn, tc := range testCases {
285 t.Run(tn, func(t *testing.T) {
286 res := ResourceStatusEqual(&tc.actual, &tc.expected)
287
288 assert.Equal(t, tc.equal, res)
289 })
290 }
291 }
292
View as plain text