Skip to content

Commit 0e7ee86

Browse files
committed
add repository_github handleErr test
Signed-off-by: sivchari <shibuuuu5@gmail.com>
1 parent d777178 commit 0e7ee86

File tree

2 files changed

+62
-8
lines changed

2 files changed

+62
-8
lines changed

cmd/clusterctl/client/repository/repository_github.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ const (
5050
)
5151

5252
var (
53-
errNotFound = errors.New("404 Not Found")
53+
errNotFound = errors.New("404 Not Found")
54+
errRateLimit = errors.New("rate limit for github api has been reached. Please wait one hour or get a personal API token and assign it to the GITHUB_TOKEN environment variable")
5455

5556
// Caches used to limit the number of GitHub API calls.
5657

@@ -319,7 +320,7 @@ func (g *gitHubRepository) getVersions(ctx context.Context) ([]string, error) {
319320
if listReleasesErr != nil {
320321
retryError = g.handleGithubErr(listReleasesErr, "failed to get the list of releases")
321322
// Return immediately if we are rate limited.
322-
if errors.Is(listReleasesErr, &github.RateLimitError{}) {
323+
if errors.Is(retryError, errRateLimit) {
323324
return false, retryError
324325
}
325326
return false, nil
@@ -334,7 +335,7 @@ func (g *gitHubRepository) getVersions(ctx context.Context) ([]string, error) {
334335
if listReleasesErr != nil {
335336
retryError = g.handleGithubErr(listReleasesErr, "failed to get the list of releases")
336337
// Return immediately if we are rate limited.
337-
if errors.Is(listReleasesErr, &github.RateLimitError{}) {
338+
if errors.Is(retryError, errRateLimit) {
338339
return false, retryError
339340
}
340341
return false, nil
@@ -384,7 +385,7 @@ func (g *gitHubRepository) getReleaseByTag(ctx context.Context, tag string) (*gi
384385
return false, retryError
385386
}
386387
// Return immediately if we are rate limited.
387-
if errors.Is(getReleasesErr, &github.RateLimitError{}) {
388+
if errors.Is(retryError, errRateLimit) {
388389
return false, retryError
389390
}
390391
return false, nil
@@ -466,7 +467,7 @@ func (g *gitHubRepository) downloadFilesFromRelease(ctx context.Context, release
466467
if downloadReleaseError != nil {
467468
retryError = g.handleGithubErr(downloadReleaseError, "failed to download file %q from %q release", *release.TagName, fileName)
468469
// Return immediately if we are rate limited.
469-
if errors.Is(downloadReleaseError, &github.RateLimitError{}) {
470+
if errors.Is(retryError, errRateLimit) {
470471
return false, retryError
471472
}
472473
return false, nil
@@ -499,13 +500,14 @@ func (g *gitHubRepository) downloadFilesFromRelease(ctx context.Context, release
499500

500501
// handleGithubErr wraps error messages.
501502
func (g *gitHubRepository) handleGithubErr(err error, message string, args ...interface{}) error {
502-
if errors.Is(err, &github.RateLimitError{}) {
503-
return errors.New("rate limit for github api has been reached. Please wait one hour or get a personal API token and assign it to the GITHUB_TOKEN environment variable")
503+
if _, ok := err.(*github.RateLimitError); ok {
504+
return errRateLimit
504505
}
505506

506507
var ghErr *github.ErrorResponse
507508
if errors.As(err, &ghErr) && ghErr.Response.StatusCode == http.StatusNotFound {
508509
return errNotFound
509510
}
510-
return errors.Wrapf(err, message, args...)
511+
512+
return fmt.Errorf("%s: %w", fmt.Sprintf(message, args...), err)
511513
}

cmd/clusterctl/client/repository/repository_github_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626

2727
"github.com/google/go-github/v53/github"
2828
. "github.com/onsi/gomega"
29+
"github.com/pkg/errors"
2930
"k8s.io/utils/ptr"
3031

3132
clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3"
@@ -1108,3 +1109,54 @@ func Test_gitHubRepository_releaseNotFound(t *testing.T) {
11081109
})
11091110
}
11101111
}
1112+
1113+
func Test_handleGithubErr(t *testing.T) {
1114+
tests := []struct {
1115+
name string
1116+
err error
1117+
message string
1118+
args []any
1119+
want error
1120+
}{
1121+
{
1122+
name: "Return error",
1123+
err: errors.New("error"),
1124+
message: "message %s and %s",
1125+
args: []any{"arg1", "arg2"},
1126+
want: fmt.Errorf("message arg1 and arg2: %w", errors.New("error")),
1127+
},
1128+
{
1129+
name: "Return RateLimitError",
1130+
err: &github.RateLimitError{
1131+
Response: &http.Response{
1132+
StatusCode: http.StatusForbidden,
1133+
},
1134+
},
1135+
message: "",
1136+
args: nil,
1137+
want: ErrRateLimit,
1138+
},
1139+
{
1140+
name: "Return ErrorResponse",
1141+
err: &github.ErrorResponse{
1142+
Response: &http.Response{
1143+
StatusCode: http.StatusNotFound,
1144+
},
1145+
},
1146+
message: "",
1147+
args: nil,
1148+
want: errNotFound,
1149+
},
1150+
}
1151+
1152+
gRepo := &gitHubRepository{}
1153+
1154+
for _, tt := range tests {
1155+
t.Run(tt.name, func(t *testing.T) {
1156+
g := NewWithT(t)
1157+
1158+
got := gRepo.handleGithubErr(tt.err, tt.message, tt.args...)
1159+
g.Expect(got.Error()).To(Equal(tt.want.Error()))
1160+
})
1161+
}
1162+
}

0 commit comments

Comments
 (0)