@@ -283,6 +283,93 @@ func Test_gitHubRepository_getVersions(t *testing.T) {
283
283
}
284
284
}
285
285
286
+ func Test_gitHubRepository_getLatestContractRelease (t * testing.T ) {
287
+ client , mux , teardown := test .NewFakeGitHub ()
288
+ defer teardown ()
289
+
290
+ // setup an handler for returning 3 fake releases
291
+ mux .HandleFunc ("/repos/o/r1/releases" , func (w http.ResponseWriter , r * http.Request ) {
292
+ testMethod (t , r , "GET" )
293
+ fmt .Fprint (w , `[` )
294
+ fmt .Fprint (w , `{"id":1, "tag_name": "v0.4.0", "assets": [{"id": 1, "name": "metadata.yaml"}]},` )
295
+ fmt .Fprint (w , `{"id":2, "tag_name": "v0.3.2", "assets": [{"id": 1, "name": "metadata.yaml"}]},` )
296
+ fmt .Fprint (w , `{"id":3, "tag_name": "v0.3.1", "assets": [{"id": 1, "name": "metadata.yaml"}]}` )
297
+ fmt .Fprint (w , `]` )
298
+ })
299
+
300
+ // test.NewFakeGitHub and handler for returning a fake release
301
+ mux .HandleFunc ("/repos/o/r1/releases/tags/v0.4.0" , func (w http.ResponseWriter , r * http.Request ) {
302
+ testMethod (t , r , "GET" )
303
+ fmt .Fprint (w , `{"id":13, "tag_name": "v0.4.0", "assets": [{"id": 1, "name": "metadata.yaml"}] }` )
304
+ })
305
+
306
+ // test.NewFakeGitHub an handler for returning a fake release metadata file
307
+ mux .HandleFunc ("/repos/o/r1/releases/assets/1" , func (w http.ResponseWriter , r * http.Request ) {
308
+ testMethod (t , r , "GET" )
309
+ w .Header ().Set ("Content-Type" , "application/octet-stream" )
310
+ w .Header ().Set ("Content-Disposition" , "attachment; filename=metadata.yaml" )
311
+ fmt .Fprint (w , "apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3\n releaseSeries:\n - major: 0\n minor: 4\n contract: v1alpha4\n - major: 0\n minor: 3\n contract: v1alpha3\n " )
312
+ })
313
+
314
+ configVariablesClient := test .NewFakeVariableClient ()
315
+
316
+ type field struct {
317
+ providerConfig config.Provider
318
+ }
319
+ tests := []struct {
320
+ name string
321
+ field field
322
+ contract string
323
+ want string
324
+ wantErr bool
325
+ }{
326
+ {
327
+ name : "Get latest release if it matches the contract" ,
328
+ field : field {
329
+ providerConfig : config .NewProvider ("test" , "https://github.com/o/r1/releases/latest/path" , clusterctlv1 .CoreProviderType ),
330
+ },
331
+ contract : "v1alpha4" ,
332
+ want : "v0.4.0" ,
333
+ wantErr : false ,
334
+ },
335
+ {
336
+ name : "Get previous release if the latest doesn't match the contract" ,
337
+ field : field {
338
+ providerConfig : config .NewProvider ("test" , "https://github.com/o/r1/releases/latest/path" , clusterctlv1 .CoreProviderType ),
339
+ },
340
+ contract : "v1alpha3" ,
341
+ want : "v0.3.2" ,
342
+ wantErr : false ,
343
+ },
344
+ {
345
+ name : "Return the latest release if the contract doesn't exist" ,
346
+ field : field {
347
+ providerConfig : config .NewProvider ("test" , "https://github.com/o/r1/releases/latest/path" , clusterctlv1 .CoreProviderType ),
348
+ },
349
+ want : "v0.4.0" ,
350
+ contract : "foo" ,
351
+ wantErr : false ,
352
+ },
353
+ }
354
+ for _ , tt := range tests {
355
+ t .Run (tt .name , func (t * testing.T ) {
356
+ g := NewWithT (t )
357
+ resetCaches ()
358
+
359
+ gRepo , err := newGitHubRepository (tt .field .providerConfig , configVariablesClient , injectGithubClient (client ))
360
+ g .Expect (err ).NotTo (HaveOccurred ())
361
+
362
+ got , err := gRepo .getLatestContractRelease (tt .contract )
363
+ if tt .wantErr {
364
+ g .Expect (err ).To (HaveOccurred ())
365
+ return
366
+ }
367
+ g .Expect (err ).NotTo (HaveOccurred ())
368
+ g .Expect (got ).To (Equal (tt .want ))
369
+ })
370
+ }
371
+ }
372
+
286
373
func Test_gitHubRepository_getLatestRelease (t * testing.T ) {
287
374
client , mux , teardown := test .NewFakeGitHub ()
288
375
defer teardown ()
@@ -370,6 +457,87 @@ func Test_gitHubRepository_getLatestRelease(t *testing.T) {
370
457
}
371
458
}
372
459
460
+ func Test_gitHubRepository_getLatestPatchRelease (t * testing.T ) {
461
+ client , mux , teardown := test .NewFakeGitHub ()
462
+ defer teardown ()
463
+
464
+ // setup an handler for returning 3 fake releases
465
+ mux .HandleFunc ("/repos/o/r1/releases" , func (w http.ResponseWriter , r * http.Request ) {
466
+ testMethod (t , r , "GET" )
467
+ fmt .Fprint (w , `[` )
468
+ fmt .Fprint (w , `{"id":1, "tag_name": "v0.4.0"},` )
469
+ fmt .Fprint (w , `{"id":2, "tag_name": "v0.3.2"},` )
470
+ fmt .Fprint (w , `{"id":3, "tag_name": "v1.3.2"}` )
471
+ fmt .Fprint (w , `]` )
472
+ })
473
+
474
+ major0 := uint (0 )
475
+ minor3 := uint (3 )
476
+ minor4 := uint (4 )
477
+
478
+ configVariablesClient := test .NewFakeVariableClient ()
479
+
480
+ type field struct {
481
+ providerConfig config.Provider
482
+ }
483
+ tests := []struct {
484
+ name string
485
+ field field
486
+ major * uint
487
+ minor * uint
488
+ want string
489
+ wantErr bool
490
+ }{
491
+ {
492
+ name : "Get latest patch release, no Major/Minor specified" ,
493
+ field : field {
494
+ providerConfig : config .NewProvider ("test" , "https://github.com/o/r1/releases/latest/path" , clusterctlv1 .CoreProviderType ),
495
+ },
496
+ minor : nil ,
497
+ major : nil ,
498
+ want : "v1.3.2" ,
499
+ wantErr : false ,
500
+ },
501
+ {
502
+ name : "Get latest patch release, for Major 0 and Minor 3" ,
503
+ field : field {
504
+ providerConfig : config .NewProvider ("test" , "https://github.com/o/r1/releases/latest/path" , clusterctlv1 .CoreProviderType ),
505
+ },
506
+ major : & major0 ,
507
+ minor : & minor3 ,
508
+ want : "v0.3.2" ,
509
+ wantErr : false ,
510
+ },
511
+ {
512
+ name : "Get latest patch release, for Major 0 and Minor 4" ,
513
+ field : field {
514
+ providerConfig : config .NewProvider ("test" , "https://github.com/o/r1/releases/latest/path" , clusterctlv1 .CoreProviderType ),
515
+ },
516
+ major : & major0 ,
517
+ minor : & minor4 ,
518
+ want : "v0.4.0" ,
519
+ wantErr : false ,
520
+ },
521
+ }
522
+ for _ , tt := range tests {
523
+ t .Run (tt .name , func (t * testing.T ) {
524
+ g := NewWithT (t )
525
+ resetCaches ()
526
+
527
+ gRepo , err := newGitHubRepository (tt .field .providerConfig , configVariablesClient , injectGithubClient (client ))
528
+ g .Expect (err ).NotTo (HaveOccurred ())
529
+
530
+ got , err := gRepo .getLatestPatchRelease (tt .major , tt .minor )
531
+ if tt .wantErr {
532
+ g .Expect (err ).To (HaveOccurred ())
533
+ return
534
+ }
535
+ g .Expect (err ).NotTo (HaveOccurred ())
536
+ g .Expect (got ).To (Equal (tt .want ))
537
+ })
538
+ }
539
+ }
540
+
373
541
func Test_gitHubRepository_getReleaseByTag (t * testing.T ) {
374
542
client , mux , teardown := test .NewFakeGitHub ()
375
543
defer teardown ()
0 commit comments