@@ -132,3 +132,130 @@ func TestTargetGroupBindingReconciler_Delete_Stuck(t *testing.T) {
132132 assert .Equal (t , "cleanup failed due to AWS error" , condition .Message )
133133 }
134134}
135+
136+ func TestTargetGroupBindingReconciler_Reconcile_FailedReconcile (t * testing.T ) {
137+ scheme := runtime .NewScheme ()
138+ clientgoscheme .AddToScheme (scheme )
139+ elbv2api .AddToScheme (scheme )
140+
141+ tgb := & elbv2api.TargetGroupBinding {
142+ ObjectMeta : metav1.ObjectMeta {
143+ Name : "test-tgb" ,
144+ Namespace : "default" ,
145+ },
146+ Spec : elbv2api.TargetGroupBindingSpec {
147+ TargetGroupARN : "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/test/123" ,
148+ },
149+ }
150+
151+ k8sClient := testclient .NewClientBuilder ().WithScheme (scheme ).WithStatusSubresource (tgb ).WithRuntimeObjects (tgb ).Build ()
152+
153+ // Setup Mocks
154+ ctrl := gomock .NewController (t )
155+ defer ctrl .Finish ()
156+
157+ mockFinalizerManager := k8s .NewMockFinalizerManager (ctrl )
158+ mockFinalizerManager .EXPECT ().AddFinalizers (gomock .Any (), gomock .Any (), gomock .Any ()).Return (nil )
159+
160+ mockResMgr := targetgroupbinding .NewMockResourceManager (ctrl )
161+ mockResMgr .EXPECT ().Reconcile (gomock .Any (), gomock .Any ()).Return (false , errors .New ("target group not found" ))
162+
163+ fakeRecorder := record .NewFakeRecorder (10 )
164+
165+ reconciler := & targetGroupBindingReconciler {
166+ k8sClient : k8sClient ,
167+ eventRecorder : fakeRecorder ,
168+ finalizerManager : mockFinalizerManager ,
169+ tgbResourceManager : mockResMgr ,
170+ deferredTargetGroupBindingReconciler : & mockDeferredReconciler {},
171+ logger : log .Log .WithName ("controllers" ).WithName ("TargetGroupBinding" ),
172+ metricsCollector : & mockMetricCollector {},
173+ reconcileCounters : metricsutil .NewReconcileCounters (),
174+ }
175+
176+ req := reconcile.Request {
177+ NamespacedName : client.ObjectKey {
178+ Namespace : "default" ,
179+ Name : "test-tgb" ,
180+ },
181+ }
182+
183+ // EXECUTE
184+ _ , err := reconciler .Reconcile (context .Background (), req )
185+
186+ // VERIFY
187+ assert .Error (t , err )
188+ assert .Contains (t , err .Error (), "target group not found" )
189+
190+ // Verify FailedReconcile event was emitted
191+ select {
192+ case event := <- fakeRecorder .Events :
193+ assert .Contains (t , event , "FailedReconcile" )
194+ assert .Contains (t , event , "target group not found" )
195+ default :
196+ t .Fatal ("expected FailedReconcile event but none was emitted" )
197+ }
198+ }
199+
200+ func TestTargetGroupBindingReconciler_Reconcile_Success (t * testing.T ) {
201+ scheme := runtime .NewScheme ()
202+ clientgoscheme .AddToScheme (scheme )
203+ elbv2api .AddToScheme (scheme )
204+
205+ tgb := & elbv2api.TargetGroupBinding {
206+ ObjectMeta : metav1.ObjectMeta {
207+ Name : "test-tgb" ,
208+ Namespace : "default" ,
209+ },
210+ Spec : elbv2api.TargetGroupBindingSpec {
211+ TargetGroupARN : "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/test/123" ,
212+ },
213+ }
214+
215+ k8sClient := testclient .NewClientBuilder ().WithScheme (scheme ).WithStatusSubresource (tgb ).WithRuntimeObjects (tgb ).Build ()
216+
217+ // Setup Mocks
218+ ctrl := gomock .NewController (t )
219+ defer ctrl .Finish ()
220+
221+ mockFinalizerManager := k8s .NewMockFinalizerManager (ctrl )
222+ mockFinalizerManager .EXPECT ().AddFinalizers (gomock .Any (), gomock .Any (), gomock .Any ()).Return (nil )
223+
224+ mockResMgr := targetgroupbinding .NewMockResourceManager (ctrl )
225+ mockResMgr .EXPECT ().Reconcile (gomock .Any (), gomock .Any ()).Return (false , nil )
226+
227+ fakeRecorder := record .NewFakeRecorder (10 )
228+
229+ reconciler := & targetGroupBindingReconciler {
230+ k8sClient : k8sClient ,
231+ eventRecorder : fakeRecorder ,
232+ finalizerManager : mockFinalizerManager ,
233+ tgbResourceManager : mockResMgr ,
234+ deferredTargetGroupBindingReconciler : & mockDeferredReconciler {},
235+ logger : log .Log .WithName ("controllers" ).WithName ("TargetGroupBinding" ),
236+ metricsCollector : & mockMetricCollector {},
237+ reconcileCounters : metricsutil .NewReconcileCounters (),
238+ }
239+
240+ req := reconcile.Request {
241+ NamespacedName : client.ObjectKey {
242+ Namespace : "default" ,
243+ Name : "test-tgb" ,
244+ },
245+ }
246+
247+ // EXECUTE
248+ _ , err := reconciler .Reconcile (context .Background (), req )
249+
250+ // VERIFY
251+ assert .NoError (t , err )
252+
253+ // Verify SuccessfullyReconciled event was emitted
254+ select {
255+ case event := <- fakeRecorder .Events :
256+ assert .Contains (t , event , "SuccessfullyReconciled" )
257+ assert .Contains (t , event , "Successfully reconciled" )
258+ default :
259+ t .Fatal ("expected SuccessfullyReconciled event but none was emitted" )
260+ }
261+ }
0 commit comments