diff --git a/clients/gitlabrepo/checkruns_test.go b/clients/gitlabrepo/checkruns_test.go index 94921ead4be..235bc81b5cf 100644 --- a/clients/gitlabrepo/checkruns_test.go +++ b/clients/gitlabrepo/checkruns_test.go @@ -48,7 +48,7 @@ func Test_CheckRuns(t *testing.T) { }, { name: "valid checkruns with zero results", - responsePath: "./testdata/valid-checkruns-1", + responsePath: "./testdata/empty-response", ref: "eb94b618fb5865b26e80fdd8ae531b7a63ad851a", wantErr: false, }, diff --git a/clients/gitlabrepo/client.go b/clients/gitlabrepo/client.go index 17b417d358f..68644e241e8 100644 --- a/clients/gitlabrepo/client.go +++ b/clients/gitlabrepo/client.go @@ -184,6 +184,10 @@ func (client *Client) ListCommits() ([]clients.Commit, error) { return []clients.Commit{}, err } + if len(commitsRaw) < 1 { + return []clients.Commit{}, nil + } + before := commitsRaw[0].CommittedDate // Get merge request details from GraphQL // GitLab REST API doesn't provide a way to link Merge Requests and Commits that diff --git a/clients/gitlabrepo/client_test.go b/clients/gitlabrepo/client_test.go index c305533550e..d04455c7535 100644 --- a/clients/gitlabrepo/client_test.go +++ b/clients/gitlabrepo/client_test.go @@ -15,10 +15,15 @@ package gitlabrepo import ( + "context" "errors" + "net/http" "testing" + "github.com/google/go-cmp/cmp" "github.com/xanzy/go-gitlab" + + "github.com/ossf/scorecard/v4/clients" ) func TestCheckRepoInaccessible(t *testing.T) { @@ -69,3 +74,71 @@ func TestCheckRepoInaccessible(t *testing.T) { }) } } + +func TestListCommits(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + responsePath string + commits []clients.Commit + wantErr bool + }{ + { + name: "Error in ListRawCommits", + responsePath: "./testdata/invalid-commits", + commits: []clients.Commit{}, + wantErr: true, + }, + { + name: "No commits in repo", + responsePath: "./testdata/empty-response", + commits: []clients.Commit{}, + wantErr: false, + }, + } + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + httpClient := &http.Client{ + Transport: suffixStubTripper{ + responsePaths: map[string]string{ + "commits": tt.responsePath, // corresponds to projects//repository/commits + }, + }, + } + glclient, err := gitlab.NewClient("", gitlab.WithHTTPClient(httpClient)) + if err != nil { + t.Fatalf("gitlab.NewClient error: %v", err) + } + commitshandler := &commitsHandler{ + glClient: glclient, + } + + repoURL := repoURL{ + owner: "ossf-tests", + commitSHA: clients.HeadSHA, + } + + commitshandler.init(&repoURL, 30) + + gqlhandler := graphqlHandler{ + client: httpClient, + } + gqlhandler.init(context.Background(), &repoURL) + + client := &Client{glClient: glclient, commits: commitshandler, graphql: &gqlhandler} + + got, Err := client.ListCommits() + + if (Err != nil) != tt.wantErr { + t.Fatalf("ListCommits, wanted Error: %v, got Error: %v", tt.wantErr, Err) + } + if !cmp.Equal(got, tt.commits) { + t.Errorf("ListCommits() got %v, want %v", got, tt.commits) + } + }) + } +} diff --git a/clients/gitlabrepo/testdata/valid-checkruns-1 b/clients/gitlabrepo/testdata/empty-response similarity index 100% rename from clients/gitlabrepo/testdata/valid-checkruns-1 rename to clients/gitlabrepo/testdata/empty-response