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