@@ -123,3 +123,115 @@ func TestExtractTargetRefs(t *testing.T) {
123123 })
124124 }
125125}
126+
127+ func TestMergeAncestorsForExtensionServerPolicies (t * testing.T ) {
128+ tests := []struct {
129+ aggStatus * gwapiv1.PolicyStatus
130+ newStatus * gwapiv1.PolicyStatus
131+ noStatus bool
132+ }{
133+ {
134+ aggStatus : & gwapiv1.PolicyStatus {
135+ Ancestors : []gwapiv1.PolicyAncestorStatus {
136+ {
137+ AncestorRef : gwapiv1.ParentReference {
138+ Name : "gateway-1" ,
139+ },
140+ },
141+ },
142+ },
143+ newStatus : & gwapiv1.PolicyStatus {
144+ Ancestors : []gwapiv1.PolicyAncestorStatus {
145+ {
146+ AncestorRef : gwapiv1.ParentReference {
147+ Name : "gateway-2" ,
148+ },
149+ },
150+ },
151+ },
152+ },
153+ {
154+ aggStatus : & gwapiv1.PolicyStatus {},
155+ newStatus : & gwapiv1.PolicyStatus {
156+ Ancestors : []gwapiv1.PolicyAncestorStatus {
157+ {
158+ AncestorRef : gwapiv1.ParentReference {
159+ Name : "gateway-2" ,
160+ },
161+ },
162+ },
163+ },
164+ },
165+ {
166+ aggStatus : & gwapiv1.PolicyStatus {
167+ Ancestors : []gwapiv1.PolicyAncestorStatus {
168+ {
169+ AncestorRef : gwapiv1.ParentReference {
170+ Name : "gateway-1" ,
171+ },
172+ },
173+ },
174+ },
175+ newStatus : & gwapiv1.PolicyStatus {},
176+ },
177+ {
178+ aggStatus : & gwapiv1.PolicyStatus {},
179+ newStatus : & gwapiv1.PolicyStatus {},
180+ },
181+ {
182+ aggStatus : nil ,
183+ newStatus : & gwapiv1.PolicyStatus {
184+ Ancestors : []gwapiv1.PolicyAncestorStatus {
185+ {
186+ AncestorRef : gwapiv1.ParentReference {
187+ Name : "gateway-1" ,
188+ },
189+ },
190+ },
191+ },
192+ },
193+ {
194+ aggStatus : & gwapiv1.PolicyStatus {
195+ Ancestors : []gwapiv1.PolicyAncestorStatus {
196+ {
197+ AncestorRef : gwapiv1.ParentReference {
198+ Name : "gateway-1" ,
199+ },
200+ },
201+ },
202+ },
203+ newStatus : nil ,
204+ },
205+ {
206+ aggStatus : nil ,
207+ newStatus : nil ,
208+ },
209+ }
210+
211+ for _ , test := range tests {
212+ aggPolicy := unstructured.Unstructured {Object : make (map [string ]interface {})}
213+ newPolicy := unstructured.Unstructured {Object : make (map [string ]interface {})}
214+ desiredMergedStatus := gwapiv1.PolicyStatus {}
215+
216+ // aggStatus == nil, means simulate not setting status at all within the policy.
217+ if test .aggStatus != nil {
218+ aggPolicy .Object ["status" ] = PolicyStatusToUnstructured (* test .aggStatus )
219+ desiredMergedStatus .Ancestors = append (desiredMergedStatus .Ancestors , test .aggStatus .Ancestors ... )
220+ }
221+
222+ // newStatus == nil, means simulate not setting status at all within the policy.
223+ if test .newStatus != nil {
224+ newPolicy .Object ["status" ] = PolicyStatusToUnstructured (* test .newStatus )
225+ desiredMergedStatus .Ancestors = append (desiredMergedStatus .Ancestors , test .newStatus .Ancestors ... )
226+ }
227+
228+ MergeAncestorsForExtensionServerPolicies (& aggPolicy , & newPolicy )
229+
230+ // The product object will always have an existing `status`, even if with 0 ancestors.
231+ newAggPolicy := ExtServerPolicyStatusAsPolicyStatus (& aggPolicy )
232+ require .Len (t , newAggPolicy .Ancestors , len (desiredMergedStatus .Ancestors ))
233+ for i := range newAggPolicy .Ancestors {
234+ require .Equal (t , desiredMergedStatus .Ancestors [i ].AncestorRef .Name , newAggPolicy .Ancestors [i ].AncestorRef .Name )
235+ }
236+ }
237+ }
0 commit comments