Skip to content

Commit

Permalink
(fix) handle nil repos in github responses (#168)
Browse files Browse the repository at this point in the history
* (fix) handle nil repos in github responses
* convertRepoList change and tests
* add new line at end of test file
* implement Brad's suggested changes

Co-authored-by: Dan Wilson <daniel.wilson@harness.io>
  • Loading branch information
TP Honey and Dan Wilson authored Apr 22, 2022
1 parent f73f51e commit c16bee3
Show file tree
Hide file tree
Showing 3 changed files with 209 additions and 1 deletion.
22 changes: 21 additions & 1 deletion scm/driver/github/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package github

import (
"context"
"errors"
"fmt"
"strconv"
"time"
Expand Down Expand Up @@ -63,6 +64,13 @@ func (s *RepositoryService) Find(ctx context.Context, repo string) (*scm.Reposit
path := fmt.Sprintf("repos/%s", repo)
out := new(repository)
res, err := s.client.do(ctx, "GET", path, nil, out)
if err != nil {
return nil, res, err
}
convertedRepo := convertRepository(out)
if convertedRepo == nil {
return nil, res, errors.New("GitHub returned an unexpected null repository")
}
return convertRepository(out), res, err
}

Expand All @@ -79,6 +87,13 @@ func (s *RepositoryService) FindPerms(ctx context.Context, repo string) (*scm.Pe
path := fmt.Sprintf("repos/%s", repo)
out := new(repository)
res, err := s.client.do(ctx, "GET", path, nil, out)
if err != nil {
return nil, res, err
}
convertedRepo := convertRepository(out)
if convertedRepo == nil {
return nil, res, errors.New("GitHub returned an unexpected null repository")
}
return convertRepository(out).Perm, res, err
}

Expand Down Expand Up @@ -187,14 +202,19 @@ func (s *RepositoryService) DeleteHook(ctx context.Context, repo, id string) (*s
func convertRepositoryList(from []*repository) []*scm.Repository {
to := []*scm.Repository{}
for _, v := range from {
to = append(to, convertRepository(v))
if repo := convertRepository(v); repo != nil {
to = append(to, repo)
}
}
return to
}

// helper function to convert from the gogs repository structure
// to the common repository structure.
func convertRepository(from *repository) *scm.Repository {
if from == nil {
return nil
}
return &scm.Repository{
ID: strconv.Itoa(from.ID),
Name: from.Name,
Expand Down
75 changes: 75 additions & 0 deletions scm/driver/github/repo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"context"
"encoding/json"
"io/ioutil"
"reflect"
"testing"

"github.com/drone/go-scm/scm"
Expand Down Expand Up @@ -528,3 +529,77 @@ func TestHookEvents(t *testing.T) {
}
}
}

func Test_convertRepository(t *testing.T) {
permissionsStruct := &repository{
Name: "bla",
}
permissionsStruct.Permissions.Admin = true
tests := []struct {
name string
from *repository
want *scm.Repository
}{
{
name: "Simple",
from: &repository{
Name: "hello-world",
ID: 1,
Permissions: permissionsStruct.Permissions,
},
want: &scm.Repository{
Name: "hello-world",
ID: "1",
Perm: &scm.Perm{
Admin: true,
},
},
},
{
name: "null",
from: nil,
want: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := convertRepository(tt.from); !reflect.DeepEqual(got, tt.want) {
t.Errorf("convertRepository() = %v, want %v", got, tt.want)
}
})
}
}

func TestRepositoryListWithNull(t *testing.T) {
defer gock.Off()

gock.New("https://api.github.com").
Get("/user/repos").
MatchParam("page", "1").
MatchParam("per_page", "30").
Reply(200).
Type("application/json").
SetHeaders(mockHeaders).
SetHeaders(mockPageHeaders).
File("testdata/reposWithNull.json")

client := NewDefault()
got, res, err := client.Repositories.List(context.Background(), scm.ListOptions{Page: 1, Size: 30})
if err != nil {
t.Error(err)
return
}

want := []*scm.Repository{}
raw, _ := ioutil.ReadFile("testdata/repos.json.golden")
_ = json.Unmarshal(raw, &want)

if diff := cmp.Diff(got, want); diff != "" {
t.Errorf("Unexpected Results")
t.Log(diff)
}

t.Run("Request", testRequest(res))
t.Run("Rate", testRate(res))
t.Run("Page", testPage(res))
}
113 changes: 113 additions & 0 deletions scm/driver/github/testdata/reposWithNull.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
[
{
"id": 1296269,
"owner": {
"login": "octocat",
"id": 1,
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
"gravatar_id": "",
"url": "https://api.github.com/users/octocat",
"html_url": "https://github.com/octocat",
"followers_url": "https://api.github.com/users/octocat/followers",
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
"organizations_url": "https://api.github.com/users/octocat/orgs",
"repos_url": "https://api.github.com/users/octocat/repos",
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
"received_events_url": "https://api.github.com/users/octocat/received_events",
"type": "User",
"site_admin": false
},
"name": "Hello-World",
"full_name": "octocat/Hello-World",
"description": "This your first repo!",
"private": true,
"fork": true,
"visibility": "public",
"url": "https://api.github.com/repos/octocat/Hello-World",
"html_url": "https://github.com/octocat/Hello-World",
"archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
"assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
"blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
"branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
"clone_url": "https://github.com/octocat/Hello-World.git",
"collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
"comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
"commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
"compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
"contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
"contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
"deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
"downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
"events_url": "http://api.github.com/repos/octocat/Hello-World/events",
"forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
"git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
"git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
"git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
"git_url": "git:github.com/octocat/Hello-World.git",
"hooks_url": "http://api.github.com/repos/octocat/Hello-World/hooks",
"issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
"issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
"issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
"keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
"labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
"languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
"merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
"milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
"mirror_url": "git:git.example.com/octocat/Hello-World",
"notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since, all, participating}",
"pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
"releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
"ssh_url": "git@github.com:octocat/Hello-World.git",
"stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
"statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
"subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
"subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
"svn_url": "https://svn.github.com/octocat/Hello-World",
"tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
"teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
"trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}",
"homepage": "https://github.com",
"language": null,
"forks_count": 9,
"stargazers_count": 80,
"watchers_count": 80,
"size": 108,
"default_branch": "master",
"open_issues_count": 0,
"topics": [
"octocat",
"atom",
"electron",
"API"
],
"has_issues": true,
"has_wiki": true,
"has_pages": false,
"has_downloads": true,
"archived": false,
"pushed_at": "2011-01-26T19:06:43Z",
"created_at": "2011-01-26T19:01:12Z",
"updated_at": "2011-01-26T19:14:43Z",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"allow_rebase_merge": true,
"allow_squash_merge": true,
"allow_merge_commit": true,
"subscribers_count": 42,
"network_count": 0,
"license": {
"key": "mit",
"name": "MIT License",
"spdx_id": "MIT",
"url": "https://api.github.com/licenses/mit",
"html_url": "http://choosealicense.com/licenses/mit/"
}
},
null
]

0 comments on commit c16bee3

Please sign in to comment.