@@ -139,7 +139,7 @@ func managerFactoryMocks(
139139	return  rmf , rd 
140140}
141141
142- func  TestReconcilerCreate_CheckReferencesResolveTwice (t  * testing.T ) {
142+ func  TestReconcilerCreate_UnManagedResource_CheckReferencesResolveTwice (t  * testing.T ) {
143143	require  :=  require .New (t )
144144
145145	ctx  :=  context .TODO ()
@@ -183,6 +183,8 @@ func TestReconcilerCreate_CheckReferencesResolveTwice(t *testing.T) {
183183	rmf , rd  :=  managedResourceManagerFactoryMocks (desired , latest )
184184
185185	rm .On ("LateInitialize" , ctx , latest ).Return (latest , nil )
186+ 	// Mark the resource as NotManaged before the Create call 
187+ 	rd .On ("IsManaged" , desired ).Return (false ).Once ()
186188	rd .On ("IsManaged" , desired ).Return (true )
187189	rd .On ("Delta" , desired , latest ).Return (ackcompare .NewDelta ())
188190	rd .On ("Delta" , latest , latest ).Return (ackcompare .NewDelta ())
@@ -214,6 +216,81 @@ func TestReconcilerCreate_CheckReferencesResolveTwice(t *testing.T) {
214216	rm .AssertCalled (t , "IsSynced" , ctx , latest )
215217}
216218
219+ func  TestReconcilerCreate_ManagedResource_CheckReferencesResolveOnce (t  * testing.T ) {
220+ 	require  :=  require .New (t )
221+ 
222+ 	ctx  :=  context .TODO ()
223+ 	arn  :=  ackv1alpha1 .AWSResourceName ("mybook-arn" )
224+ 
225+ 	desired , _ , _  :=  resourceMocks ()
226+ 	desired .On ("ReplaceConditions" , []* ackv1alpha1.Condition {}).Return ()
227+ 
228+ 	ids  :=  & ackmocks.AWSResourceIdentifiers {}
229+ 	ids .On ("ARN" ).Return (& arn )
230+ 
231+ 	latest , latestRTObj , _  :=  resourceMocks ()
232+ 	latest .On ("Identifiers" ).Return (ids )
233+ 
234+ 	latest .On ("Conditions" ).Return ([]* ackv1alpha1.Condition {})
235+ 	latest .On (
236+ 		"ReplaceConditions" ,
237+ 		mock .AnythingOfType ("[]*v1alpha1.Condition" ),
238+ 	).Return ().Run (func (args  mock.Arguments ) {
239+ 		conditions  :=  args .Get (0 ).([]* ackv1alpha1.Condition )
240+ 		assert .Equal (t , 1 , len (conditions ))
241+ 		cond  :=  conditions [0 ]
242+ 		assert .Equal (t , ackv1alpha1 .ConditionTypeResourceSynced , cond .Type )
243+ 		assert .Equal (t , corev1 .ConditionTrue , cond .Status )
244+ 	})
245+ 
246+ 	rm  :=  & ackmocks.AWSResourceManager {}
247+ 	rm .On ("ResolveReferences" , ctx , nil , desired ).Return (
248+ 		desired , nil ,
249+ 	).Once ()
250+ 	rm .On ("ReadOne" , ctx , desired ).Return (
251+ 		latest , ackerr .NotFound ,
252+ 	).Once ()
253+ 	rm .On ("ReadOne" , ctx , latest ).Return (
254+ 		latest , nil ,
255+ 	)
256+ 	rm .On ("Create" , ctx , desired ).Return (
257+ 		latest , nil ,
258+ 	)
259+ 	rm .On ("IsSynced" , ctx , latest ).Return (true , nil )
260+ 	rmf , rd  :=  managedResourceManagerFactoryMocks (desired , latest )
261+ 
262+ 	rm .On ("LateInitialize" , ctx , latest ).Return (latest , nil )
263+ 	rd .On ("IsManaged" , desired ).Return (true )
264+ 	rd .On ("Delta" , desired , latest ).Return (ackcompare .NewDelta ())
265+ 	rd .On ("Delta" , latest , latest ).Return (ackcompare .NewDelta ())
266+ 
267+ 	r , kc  :=  reconcilerMocks (rmf )
268+ 
269+ 	// pointers returned from "client.MergeFrom" fails the equality check during 
270+ 	// assertion even when parameters inside two objects are same. 
271+ 	// hence we use mock.AnythingOfType parameter to assert patch call 
272+ 	kc .On ("Patch" , ctx , latestRTObj , mock .AnythingOfType ("*client.mergeFromPatch" )).Return (nil )
273+ 
274+ 	// With the above mocks and below assertions, we check that if we got a 
275+ 	// NotFound error return from `AWSResourceManager.ReadOne()` that we end 
276+ 	// up calling the AWSResourceManager.Create() call in the Reconciler.Sync() 
277+ 	// method, 
278+ 	_ , err  :=  r .Sync (ctx , rm , desired )
279+ 	require .Nil (err )
280+ 	// Make sure references are resolved once for the resource creation when 
281+ 	// the resource is already managed 
282+ 	rm .AssertNumberOfCalls (t , "ResolveReferences" , 1 )
283+ 	rm .AssertCalled (t , "ResolveReferences" , ctx , nil , desired )
284+ 	rm .AssertCalled (t , "ReadOne" , ctx , desired )
285+ 	rm .AssertCalled (t , "Create" , ctx , desired )
286+ 	// No changes to metadata or spec so Patch on the object shouldn't be done 
287+ 	kc .AssertNotCalled (t , "Patch" , ctx , latestRTObj , mock .AnythingOfType ("*client.mergeFromPatch" ))
288+ 	// Only the HandleReconcilerError wrapper function ever calls patchResourceStatus 
289+ 	kc .AssertNotCalled (t , "Status" )
290+ 	rm .AssertCalled (t , "LateInitialize" , ctx , latest )
291+ 	rm .AssertCalled (t , "IsSynced" , ctx , latest )
292+ }
293+ 
217294func  TestReconcilerUpdate (t  * testing.T ) {
218295	require  :=  require .New (t )
219296
0 commit comments