@@ -169,3 +169,112 @@ func TestFixImages(t *testing.T) {
169169 })
170170 }
171171}
172+
173+ // mockImageMetaClient is a test double for configclient.ImageMetaClient.
174+ type mockImageMetaClient struct {
175+ alterFunc func (component , image string ) (string , error )
176+ }
177+
178+ func (m * mockImageMetaClient ) AlterImage (component , image string ) (string , error ) {
179+ return m .alterFunc (component , image )
180+ }
181+
182+ func TestAlterImage (t * testing.T ) {
183+ tests := []struct {
184+ name string
185+ component string
186+ image string
187+ mockFunc func (component , image string ) (string , error )
188+ want string
189+ wantErr bool
190+ }{
191+ {
192+ name : "canonical image with override applies override" ,
193+ component : "cluster-api" ,
194+ image : "example.com/controller:v1.0.0" ,
195+ mockFunc : func (component , image string ) (string , error ) {
196+ return "example.com/custom:v2.0.0" , nil
197+ },
198+ want : "example.com/custom:v2.0.0" ,
199+ wantErr : false ,
200+ },
201+ {
202+ name : "non-canonical image returns original on canonical error" ,
203+ component : "cluster-api" ,
204+ image : "example.com/controller:v1.0.0" ,
205+ mockFunc : func (component , image string ) (string , error ) {
206+ return "" , fmt .Errorf ("couldn't parse image name: repository name must be canonical" )
207+ },
208+ want : "example.com/controller:v1.0.0" ,
209+ wantErr : false ,
210+ },
211+ {
212+ name : "other errors are propagated" ,
213+ component : "cluster-api" ,
214+ image : "example.com/controller:v1.0.0" ,
215+ mockFunc : func (component , image string ) (string , error ) {
216+ return "" , fmt .Errorf ("test" )
217+ },
218+ want : "" ,
219+ wantErr : true ,
220+ },
221+ }
222+
223+ for _ , tt := range tests {
224+ t .Run (tt .name , func (t * testing.T ) {
225+ g := NewWithT (t )
226+
227+ mock := & mockImageMetaClient {alterFunc : tt .mockFunc }
228+ result , err := alterImage (tt .component , tt .image , mock )
229+
230+ if tt .wantErr {
231+ g .Expect (err ).To (HaveOccurred ())
232+ return
233+ }
234+
235+ g .Expect (err ).ToNot (HaveOccurred ())
236+ g .Expect (result ).To (Equal (tt .want ))
237+ })
238+ }
239+ }
240+
241+ func TestIsCanonicalError (t * testing.T ) {
242+ tests := []struct {
243+ name string
244+ err error
245+ want bool
246+ }{
247+ {
248+ name : "nil error returns false" ,
249+ err : nil ,
250+ want : false ,
251+ },
252+ {
253+ name : "canonical error with 'repository name must be canonical'" ,
254+ err : fmt .Errorf ("repository name must be canonical" ),
255+ want : true ,
256+ },
257+ {
258+ name : "canonical error with 'couldn't parse image name'" ,
259+ err : fmt .Errorf ("couldn't parse image name: invalid format" ),
260+ want : true ,
261+ },
262+ {
263+ name : "other error returns false" ,
264+ err : fmt .Errorf ("test" ),
265+ want : false ,
266+ },
267+ {
268+ name : "empty error message returns false" ,
269+ err : fmt .Errorf ("" ),
270+ want : false ,
271+ },
272+ }
273+
274+ for _ , tt := range tests {
275+ t .Run (tt .name , func (t * testing.T ) {
276+ g := NewWithT (t )
277+ g .Expect (isCanonicalError (tt .err )).To (Equal (tt .want ))
278+ })
279+ }
280+ }
0 commit comments