@@ -2,6 +2,8 @@ package release_test
2
2
3
3
import (
4
4
"context"
5
+ "io/ioutil"
6
+ "net/http"
5
7
"strings"
6
8
"sync"
7
9
"testing"
@@ -15,10 +17,19 @@ import (
15
17
"github.com/pkg/errors"
16
18
"github.com/spf13/afero"
17
19
20
+ log "github.com/sirupsen/logrus"
18
21
"github.com/stretchr/testify/assert"
19
22
"github.com/stretchr/testify/mock"
20
23
)
21
24
25
+ func pInt64 (v int64 ) * int64 {
26
+ return & v
27
+ }
28
+
29
+ func pString (v string ) * string {
30
+ return & v
31
+ }
32
+
22
33
func TestGetAssets (t * testing.T ) {
23
34
a := assert .New (t )
24
35
roBase := afero .NewReadOnlyFs (afero .NewOsFs ())
@@ -274,6 +285,8 @@ func TestGetAssets(t *testing.T) {
274
285
}
275
286
276
287
func TestUpload (t * testing.T ) {
288
+ log .SetOutput (ioutil .Discard )
289
+
277
290
a := assert .New (t )
278
291
fs := afero .NewOsFs ()
279
292
id := int64 (1 )
@@ -283,12 +296,20 @@ func TestUpload(t *testing.T) {
283
296
Error string
284
297
}
285
298
299
+ type mockResponses struct {
300
+ LastTry bool
301
+ UploadReleaseAssetResponse * github.Response
302
+ UploadReleaseAssetError error
303
+ GetReleaseByTagRelease * github.RepositoryRelease
304
+ GetReleaseByTagError error
305
+ DeleteReleaseAssetError error
306
+ }
307
+
286
308
type test struct {
287
- Asset release.Asset
288
- Release * release.Release
289
- Expected expected
290
- Error error
291
- FailedAttempts int
309
+ Asset release.Asset
310
+ Release * release.Release
311
+ MockResponses []mockResponses
312
+ Expected expected
292
313
}
293
314
294
315
suite := map [string ]test {
@@ -302,46 +323,169 @@ func TestUpload(t *testing.T) {
302
323
Owner : "anton-yurchenko" ,
303
324
Name : "git-release" ,
304
325
},
326
+ Reference : & release.Reference {
327
+ Tag : "v1.0.0" ,
328
+ },
329
+ },
330
+ MockResponses : []mockResponses {
331
+ {
332
+ UploadReleaseAssetResponse : & github.Response {
333
+ Response : & http.Response {StatusCode : http .StatusOK },
334
+ },
335
+ UploadReleaseAssetError : nil ,
336
+ },
305
337
},
306
338
Expected : expected {
307
339
Error : "" ,
308
340
},
309
- Error : nil ,
310
- FailedAttempts : 0 ,
311
341
},
312
- "Multiple Retries " : {
342
+ "Ghost Release Asset Not Found " : {
313
343
Asset : release.Asset {
314
- Name : "testFile2 " ,
315
- Path : "testFile2 " ,
344
+ Name : "testFile1 " ,
345
+ Path : "testFile1 " ,
316
346
},
317
347
Release : & release.Release {
318
348
Slug : & release.Slug {
319
349
Owner : "anton-yurchenko" ,
320
350
Name : "git-release" ,
321
351
},
352
+ Reference : & release.Reference {
353
+ Tag : "v1.0.0" ,
354
+ },
355
+ },
356
+ MockResponses : []mockResponses {
357
+ {
358
+ UploadReleaseAssetResponse : & github.Response {
359
+ Response : & http.Response {StatusCode : http .StatusBadGateway },
360
+ },
361
+ UploadReleaseAssetError : errors .New ("reason-c" ),
362
+ GetReleaseByTagRelease : & github.RepositoryRelease {
363
+ Assets : []github.ReleaseAsset {
364
+ {
365
+ ID : pInt64 (123 ),
366
+ Name : pString ("testFile2" ),
367
+ },
368
+ },
369
+ },
370
+ GetReleaseByTagError : nil ,
371
+ },
322
372
},
323
373
Expected : expected {
324
- Error : "" ,
374
+ Error : "ghost release asset not found" ,
375
+ },
376
+ },
377
+ "Asset Already Exists - Last Try [very long test]" : {
378
+ Asset : release.Asset {
379
+ Name : "test/File1" ,
380
+ Path : "testFile1" ,
381
+ },
382
+ Release : & release.Release {
383
+ Slug : & release.Slug {
384
+ Owner : "anton-yurchenko" ,
385
+ Name : "git-release" ,
386
+ },
387
+ Reference : & release.Reference {
388
+ Tag : "v1.0.0" ,
389
+ },
390
+ },
391
+ MockResponses : []mockResponses {
392
+ {
393
+ UploadReleaseAssetResponse : & github.Response {
394
+ Response : & http.Response {StatusCode : http .StatusInternalServerError },
395
+ },
396
+ UploadReleaseAssetError : errors .New ("reason-a" ),
397
+ },
398
+ {
399
+ UploadReleaseAssetResponse : & github.Response {
400
+ Response : & http.Response {StatusCode : http .StatusBadGateway },
401
+ },
402
+ UploadReleaseAssetError : errors .New ("reason-c" ),
403
+ GetReleaseByTagRelease : & github.RepositoryRelease {
404
+ Assets : []github.ReleaseAsset {
405
+ {
406
+ ID : pInt64 (123 ),
407
+ Name : pString ("test-File1" ),
408
+ },
409
+ },
410
+ },
411
+ GetReleaseByTagError : errors .New ("reason-d" ),
412
+ },
413
+ {
414
+ UploadReleaseAssetResponse : & github.Response {
415
+ Response : & http.Response {StatusCode : http .StatusUnprocessableEntity },
416
+ },
417
+ UploadReleaseAssetError : errors .New ("reason-c" ),
418
+ GetReleaseByTagRelease : & github.RepositoryRelease {
419
+ Assets : []github.ReleaseAsset {
420
+ {
421
+ ID : pInt64 (123 ),
422
+ Name : pString ("test-File1" ),
423
+ },
424
+ },
425
+ },
426
+ GetReleaseByTagError : nil ,
427
+ DeleteReleaseAssetError : errors .New ("reason" ),
428
+ },
429
+ {
430
+ LastTry : true ,
431
+ UploadReleaseAssetResponse : & github.Response {
432
+ Response : & http.Response {StatusCode : http .StatusBadGateway },
433
+ },
434
+ UploadReleaseAssetError : errors .New ("reason-e" ),
435
+ },
436
+ },
437
+ Expected : expected {
438
+ Error : "maximum attempts reached uploading asset: test/File1" ,
325
439
},
326
- Error : nil ,
327
- FailedAttempts : 2 ,
328
440
},
329
- "Maximum Retries " : {
441
+ "Recover [long test] " : {
330
442
Asset : release.Asset {
331
- Name : "testFile2 " ,
332
- Path : "testFile2 " ,
443
+ Name : "test/File1 " ,
444
+ Path : "testFile1 " ,
333
445
},
334
446
Release : & release.Release {
335
447
Slug : & release.Slug {
336
448
Owner : "anton-yurchenko" ,
337
449
Name : "git-release" ,
338
450
},
451
+ Reference : & release.Reference {
452
+ Tag : "v1.0.0" ,
453
+ },
454
+ },
455
+ MockResponses : []mockResponses {
456
+ {
457
+ UploadReleaseAssetResponse : & github.Response {
458
+ Response : & http.Response {StatusCode : http .StatusInternalServerError },
459
+ },
460
+ UploadReleaseAssetError : errors .New ("reason-a" ),
461
+ },
462
+ {
463
+ UploadReleaseAssetResponse : & github.Response {
464
+ Response : & http.Response {StatusCode : http .StatusUnprocessableEntity },
465
+ },
466
+ UploadReleaseAssetError : errors .New ("reason-b" ),
467
+ GetReleaseByTagRelease : & github.RepositoryRelease {
468
+ Assets : []github.ReleaseAsset {
469
+ {
470
+ ID : pInt64 (123 ),
471
+ Name : pString ("test-File1" ),
472
+ },
473
+ },
474
+ },
475
+ GetReleaseByTagError : nil ,
476
+ DeleteReleaseAssetError : nil ,
477
+ },
478
+ {
479
+ LastTry : true ,
480
+ UploadReleaseAssetResponse : & github.Response {
481
+ Response : & http.Response {StatusCode : http .StatusOK },
482
+ },
483
+ UploadReleaseAssetError : nil ,
484
+ },
339
485
},
340
486
Expected : expected {
341
- Error : "maximum attempts reached uploading asset: testFile2 " ,
487
+ Error : "" ,
342
488
},
343
- Error : errors .New ("reason" ),
344
- FailedAttempts : 3 ,
345
489
},
346
490
"File Does Not Exists" : {
347
491
Asset : release.Asset {
@@ -355,10 +499,8 @@ func TestUpload(t *testing.T) {
355
499
},
356
500
},
357
501
Expected : expected {
358
- Error : "open testFile3: no such file or directory" ,
502
+ Error : "error opening a file: open testFile3: no such file or directory" ,
359
503
},
360
- Error : nil ,
361
- FailedAttempts : 0 ,
362
504
},
363
505
}
364
506
@@ -382,7 +524,7 @@ func TestUpload(t *testing.T) {
382
524
errs := make (chan error , 1 )
383
525
384
526
m := new (mocks.RepositoriesClient )
385
- for i := 1 ; i <= test .FailedAttempts ; i ++ {
527
+ for _ , res := range test .MockResponses {
386
528
m .On ("UploadReleaseAsset" ,
387
529
context .Background (),
388
530
test .Release .Slug .Owner ,
@@ -391,18 +533,37 @@ func TestUpload(t *testing.T) {
391
533
& github.UploadOptions {
392
534
Name : strings .ReplaceAll (test .Asset .Name , "/" , "-" ),
393
535
},
394
- mock .AnythingOfType ("*os.File" )). Return ( nil , nil , errors . New ( "reason" )). Once ()
395
- }
536
+ mock .AnythingOfType ("*os.File" ),
537
+ ). Return ( nil , res . UploadReleaseAssetResponse , res . UploadReleaseAssetError ). Once ()
396
538
397
- m .On ("UploadReleaseAsset" ,
398
- context .Background (),
399
- test .Release .Slug .Owner ,
400
- test .Release .Slug .Name ,
401
- id ,
402
- & github.UploadOptions {
403
- Name : strings .ReplaceAll (test .Asset .Name , "/" , "-" ),
404
- },
405
- mock .AnythingOfType ("*os.File" )).Return (nil , nil , test .Error ).Once ()
539
+ if ! res .LastTry && (res .UploadReleaseAssetResponse .StatusCode == http .StatusBadGateway || res .UploadReleaseAssetResponse .StatusCode == http .StatusUnprocessableEntity ) {
540
+ m .On ("GetReleaseByTag" ,
541
+ context .Background (),
542
+ test .Release .Slug .Owner ,
543
+ test .Release .Slug .Name ,
544
+ test .Release .Reference .Tag ,
545
+ ).Return (res .GetReleaseByTagRelease , nil , res .GetReleaseByTagError ).Once ()
546
+
547
+ if res .GetReleaseByTagError == nil {
548
+ var assetID int64
549
+ for _ , s := range res .GetReleaseByTagRelease .Assets {
550
+ if * s .Name == strings .ReplaceAll (test .Asset .Name , "/" , "-" ) {
551
+ assetID = * s .ID
552
+ break
553
+ }
554
+ }
555
+
556
+ if res .GetReleaseByTagError == nil && assetID != 0 {
557
+ m .On ("DeleteReleaseAsset" ,
558
+ context .Background (),
559
+ test .Release .Slug .Owner ,
560
+ test .Release .Slug .Name ,
561
+ assetID ,
562
+ ).Return (nil , res .DeleteReleaseAssetError ).Once ()
563
+ }
564
+ }
565
+ }
566
+ }
406
567
407
568
test .Asset .Upload (test .Release , m , id , errs , wg )
408
569
0 commit comments