Skip to content

Commit d22245a

Browse files
Update tests to support new functionality
1 parent b2c041d commit d22245a

File tree

2 files changed

+212
-75
lines changed

2 files changed

+212
-75
lines changed

release/asset_test.go

Lines changed: 195 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package release_test
22

33
import (
44
"context"
5+
"io/ioutil"
6+
"net/http"
57
"strings"
68
"sync"
79
"testing"
@@ -15,10 +17,19 @@ import (
1517
"github.com/pkg/errors"
1618
"github.com/spf13/afero"
1719

20+
log "github.com/sirupsen/logrus"
1821
"github.com/stretchr/testify/assert"
1922
"github.com/stretchr/testify/mock"
2023
)
2124

25+
func pInt64(v int64) *int64 {
26+
return &v
27+
}
28+
29+
func pString(v string) *string {
30+
return &v
31+
}
32+
2233
func TestGetAssets(t *testing.T) {
2334
a := assert.New(t)
2435
roBase := afero.NewReadOnlyFs(afero.NewOsFs())
@@ -274,6 +285,8 @@ func TestGetAssets(t *testing.T) {
274285
}
275286

276287
func TestUpload(t *testing.T) {
288+
log.SetOutput(ioutil.Discard)
289+
277290
a := assert.New(t)
278291
fs := afero.NewOsFs()
279292
id := int64(1)
@@ -283,12 +296,20 @@ func TestUpload(t *testing.T) {
283296
Error string
284297
}
285298

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+
286308
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
292313
}
293314

294315
suite := map[string]test{
@@ -302,46 +323,169 @@ func TestUpload(t *testing.T) {
302323
Owner: "anton-yurchenko",
303324
Name: "git-release",
304325
},
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+
},
305337
},
306338
Expected: expected{
307339
Error: "",
308340
},
309-
Error: nil,
310-
FailedAttempts: 0,
311341
},
312-
"Multiple Retries": {
342+
"Ghost Release Asset Not Found": {
313343
Asset: release.Asset{
314-
Name: "testFile2",
315-
Path: "testFile2",
344+
Name: "testFile1",
345+
Path: "testFile1",
316346
},
317347
Release: &release.Release{
318348
Slug: &release.Slug{
319349
Owner: "anton-yurchenko",
320350
Name: "git-release",
321351
},
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+
},
322372
},
323373
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",
325439
},
326-
Error: nil,
327-
FailedAttempts: 2,
328440
},
329-
"Maximum Retries": {
441+
"Recover [long test]": {
330442
Asset: release.Asset{
331-
Name: "testFile2",
332-
Path: "testFile2",
443+
Name: "test/File1",
444+
Path: "testFile1",
333445
},
334446
Release: &release.Release{
335447
Slug: &release.Slug{
336448
Owner: "anton-yurchenko",
337449
Name: "git-release",
338450
},
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+
},
339485
},
340486
Expected: expected{
341-
Error: "maximum attempts reached uploading asset: testFile2",
487+
Error: "",
342488
},
343-
Error: errors.New("reason"),
344-
FailedAttempts: 3,
345489
},
346490
"File Does Not Exists": {
347491
Asset: release.Asset{
@@ -355,10 +499,8 @@ func TestUpload(t *testing.T) {
355499
},
356500
},
357501
Expected: expected{
358-
Error: "open testFile3: no such file or directory",
502+
Error: "error opening a file: open testFile3: no such file or directory",
359503
},
360-
Error: nil,
361-
FailedAttempts: 0,
362504
},
363505
}
364506

@@ -382,7 +524,7 @@ func TestUpload(t *testing.T) {
382524
errs := make(chan error, 1)
383525

384526
m := new(mocks.RepositoriesClient)
385-
for i := 1; i <= test.FailedAttempts; i++ {
527+
for _, res := range test.MockResponses {
386528
m.On("UploadReleaseAsset",
387529
context.Background(),
388530
test.Release.Slug.Owner,
@@ -391,18 +533,37 @@ func TestUpload(t *testing.T) {
391533
&github.UploadOptions{
392534
Name: strings.ReplaceAll(test.Asset.Name, "/", "-"),
393535
},
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()
396538

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+
}
406567

407568
test.Asset.Upload(test.Release, m, id, errs, wg)
408569

0 commit comments

Comments
 (0)