-
Notifications
You must be signed in to change notification settings - Fork 5.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: added github and gitlab response mock and replaced external calls (
#9305) * Added mock for gitlab and github for Unit test Signed-off-by: rishabh625 <[email protected]> * Added missing mock endpoint Signed-off-by: rishabh625 <[email protected]> * removed println and aserted for 1 master branch Signed-off-by: rishabh625 <[email protected]> * removed auth header assertion Signed-off-by: rishabh625 <[email protected]> * procfile to run binaries instead go run Signed-off-by: rishabh625 <[email protected]> * procfile to run binaries instead go run Signed-off-by: rishabh625 <[email protected]> * reverted unintentional testdata change Signed-off-by: rishabh625 <[email protected]> * Added test for branch do not exists Signed-off-by: rishabh625 <[email protected]>
- Loading branch information
1 parent
6d348ce
commit e8d2d3a
Showing
5 changed files
with
516 additions
and
59 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -266,28 +266,28 @@ func TestGiteaListRepos(t *testing.T) { | |
filters []v1alpha1.SCMProviderGeneratorFilter | ||
}{ | ||
{ | ||
name: "blank protocol", | ||
name: "blank protocol", | ||
allBranches: false, | ||
url: "[email protected]:test-argocd/pr-test.git", | ||
branches: []string{"main"}, | ||
url: "[email protected]:test-argocd/pr-test.git", | ||
branches: []string{"main"}, | ||
}, | ||
{ | ||
name: "ssh protocol", | ||
name: "ssh protocol", | ||
allBranches: false, | ||
proto: "ssh", | ||
url: "[email protected]:test-argocd/pr-test.git", | ||
proto: "ssh", | ||
url: "[email protected]:test-argocd/pr-test.git", | ||
}, | ||
{ | ||
name: "https protocol", | ||
name: "https protocol", | ||
allBranches: false, | ||
proto: "https", | ||
url: "https://gitea.com/test-argocd/pr-test", | ||
proto: "https", | ||
url: "https://gitea.com/test-argocd/pr-test", | ||
}, | ||
{ | ||
name: "other protocol", | ||
name: "other protocol", | ||
allBranches: false, | ||
proto: "other", | ||
hasError: true, | ||
proto: "other", | ||
hasError: true, | ||
}, | ||
{ | ||
name: "all branches", | ||
|
@@ -307,7 +307,6 @@ func TestGiteaListRepos(t *testing.T) { | |
if c.hasError { | ||
assert.NotNil(t, err) | ||
} else { | ||
checkRateLimit(t, err) | ||
assert.Nil(t, err) | ||
// Just check that this one project shows up. Not a great test but better thing nothing? | ||
repos := []*Repository{} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,36 +2,202 @@ package scm_provider | |
|
||
import ( | ||
"context" | ||
"os" | ||
"strings" | ||
"io" | ||
"net/http" | ||
"net/http/httptest" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
|
||
"github.com/argoproj/argo-cd/v2/pkg/apis/applicationset/v1alpha1" | ||
) | ||
|
||
func checkRateLimit(t *testing.T, err error) { | ||
// Check if we've hit a rate limit, don't fail the test if so. | ||
if err != nil && (strings.Contains(err.Error(), "rate limit exceeded") || | ||
(strings.Contains(err.Error(), "API rate limit") && strings.Contains(err.Error(), "still exceeded"))) { | ||
|
||
// GitHub Actions add this environment variable to indicate branch ref you are running on | ||
githubRef := os.Getenv("GITHUB_REF") | ||
|
||
// Only report rate limit errors as errors, when: | ||
// - We are running in a GitHub action | ||
// - AND, we are running that action on the 'master' or 'release-*' branch | ||
// (unfortunately, for PRs, we don't have access to GitHub secrets that would allow us to embed a token) | ||
failOnRateLimitErrors := os.Getenv("CI") != "" && (strings.Contains(githubRef, "/master") || strings.Contains(githubRef, "/release-")) | ||
|
||
t.Logf("Got a rate limit error, consider setting $GITHUB_TOKEN to increase your GitHub API rate limit: %v\n", err) | ||
if failOnRateLimitErrors { | ||
t.FailNow() | ||
} else { | ||
t.SkipNow() | ||
func githubMockHandler(t *testing.T) func(http.ResponseWriter, *http.Request) { | ||
return func(w http.ResponseWriter, r *http.Request) { | ||
w.Header().Set("Content-Type", "application/json") | ||
switch r.RequestURI { | ||
case "/api/v3/orgs/argoproj/repos?per_page=100": | ||
_, err := io.WriteString(w, `[ | ||
{ | ||
"id": 1296269, | ||
"node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5", | ||
"name": "argo-cd", | ||
"full_name": "argoproj/argo-cd", | ||
"owner": { | ||
"login": "argoproj", | ||
"id": 1, | ||
"node_id": "MDQ6VXNlcjE=", | ||
"avatar_url": "https://github.com/images/error/argoproj_happy.gif", | ||
"gravatar_id": "", | ||
"url": "https://api.github.com/users/argoproj", | ||
"html_url": "https://github.com/argoproj", | ||
"followers_url": "https://api.github.com/users/argoproj/followers", | ||
"following_url": "https://api.github.com/users/argoproj/following{/other_user}", | ||
"gists_url": "https://api.github.com/users/argoproj/gists{/gist_id}", | ||
"starred_url": "https://api.github.com/users/argoproj/starred{/owner}{/repo}", | ||
"subscriptions_url": "https://api.github.com/users/argoproj/subscriptions", | ||
"organizations_url": "https://api.github.com/users/argoproj/orgs", | ||
"repos_url": "https://api.github.com/users/argoproj/repos", | ||
"events_url": "https://api.github.com/users/argoproj/events{/privacy}", | ||
"received_events_url": "https://api.github.com/users/argoproj/received_events", | ||
"type": "User", | ||
"site_admin": false | ||
}, | ||
"private": false, | ||
"html_url": "https://github.com/argoproj/argo-cd", | ||
"description": "This your first repo!", | ||
"fork": false, | ||
"url": "https://api.github.com/repos/argoproj/argo-cd", | ||
"archive_url": "https://api.github.com/repos/argoproj/argo-cd/{archive_format}{/ref}", | ||
"assignees_url": "https://api.github.com/repos/argoproj/argo-cd/assignees{/user}", | ||
"blobs_url": "https://api.github.com/repos/argoproj/argo-cd/git/blobs{/sha}", | ||
"branches_url": "https://api.github.com/repos/argoproj/argo-cd/branches{/branch}", | ||
"collaborators_url": "https://api.github.com/repos/argoproj/argo-cd/collaborators{/collaborator}", | ||
"comments_url": "https://api.github.com/repos/argoproj/argo-cd/comments{/number}", | ||
"commits_url": "https://api.github.com/repos/argoproj/argo-cd/commits{/sha}", | ||
"compare_url": "https://api.github.com/repos/argoproj/argo-cd/compare/{base}...{head}", | ||
"contents_url": "https://api.github.com/repos/argoproj/argo-cd/contents/{path}", | ||
"contributors_url": "https://api.github.com/repos/argoproj/argo-cd/contributors", | ||
"deployments_url": "https://api.github.com/repos/argoproj/argo-cd/deployments", | ||
"downloads_url": "https://api.github.com/repos/argoproj/argo-cd/downloads", | ||
"events_url": "https://api.github.com/repos/argoproj/argo-cd/events", | ||
"forks_url": "https://api.github.com/repos/argoproj/argo-cd/forks", | ||
"git_commits_url": "https://api.github.com/repos/argoproj/argo-cd/git/commits{/sha}", | ||
"git_refs_url": "https://api.github.com/repos/argoproj/argo-cd/git/refs{/sha}", | ||
"git_tags_url": "https://api.github.com/repos/argoproj/argo-cd/git/tags{/sha}", | ||
"git_url": "git:github.com/argoproj/argo-cd.git", | ||
"issue_comment_url": "https://api.github.com/repos/argoproj/argo-cd/issues/comments{/number}", | ||
"issue_events_url": "https://api.github.com/repos/argoproj/argo-cd/issues/events{/number}", | ||
"issues_url": "https://api.github.com/repos/argoproj/argo-cd/issues{/number}", | ||
"keys_url": "https://api.github.com/repos/argoproj/argo-cd/keys{/key_id}", | ||
"labels_url": "https://api.github.com/repos/argoproj/argo-cd/labels{/name}", | ||
"languages_url": "https://api.github.com/repos/argoproj/argo-cd/languages", | ||
"merges_url": "https://api.github.com/repos/argoproj/argo-cd/merges", | ||
"milestones_url": "https://api.github.com/repos/argoproj/argo-cd/milestones{/number}", | ||
"notifications_url": "https://api.github.com/repos/argoproj/argo-cd/notifications{?since,all,participating}", | ||
"pulls_url": "https://api.github.com/repos/argoproj/argo-cd/pulls{/number}", | ||
"releases_url": "https://api.github.com/repos/argoproj/argo-cd/releases{/id}", | ||
"ssh_url": "[email protected]:argoproj/argo-cd.git", | ||
"stargazers_url": "https://api.github.com/repos/argoproj/argo-cd/stargazers", | ||
"statuses_url": "https://api.github.com/repos/argoproj/argo-cd/statuses/{sha}", | ||
"subscribers_url": "https://api.github.com/repos/argoproj/argo-cd/subscribers", | ||
"subscription_url": "https://api.github.com/repos/argoproj/argo-cd/subscription", | ||
"tags_url": "https://api.github.com/repos/argoproj/argo-cd/tags", | ||
"teams_url": "https://api.github.com/repos/argoproj/argo-cd/teams", | ||
"trees_url": "https://api.github.com/repos/argoproj/argo-cd/git/trees{/sha}", | ||
"clone_url": "https://github.com/argoproj/argo-cd.git", | ||
"mirror_url": "git:git.example.com/argoproj/argo-cd", | ||
"hooks_url": "https://api.github.com/repos/argoproj/argo-cd/hooks", | ||
"svn_url": "https://svn.github.com/argoproj/argo-cd", | ||
"homepage": "https://github.com", | ||
"language": null, | ||
"forks_count": 9, | ||
"stargazers_count": 80, | ||
"watchers_count": 80, | ||
"size": 108, | ||
"default_branch": "master", | ||
"open_issues_count": 0, | ||
"is_template": false, | ||
"topics": [ | ||
"argoproj", | ||
"atom", | ||
"electron", | ||
"api" | ||
], | ||
"has_issues": true, | ||
"has_projects": true, | ||
"has_wiki": true, | ||
"has_pages": false, | ||
"has_downloads": true, | ||
"archived": false, | ||
"disabled": false, | ||
"visibility": "public", | ||
"pushed_at": "2011-01-26T19:06:43Z", | ||
"created_at": "2011-01-26T19:01:12Z", | ||
"updated_at": "2011-01-26T19:14:43Z", | ||
"permissions": { | ||
"admin": false, | ||
"push": false, | ||
"pull": true | ||
}, | ||
"template_repository": null | ||
} | ||
]`) | ||
if err != nil { | ||
t.Fail() | ||
} | ||
case "/api/v3/repos/argoproj/argo-cd/branches?per_page=100": | ||
_, err := io.WriteString(w, `[ | ||
{ | ||
"name": "master", | ||
"commit": { | ||
"sha": "c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc", | ||
"url": "https://api.github.com/repos/argoproj/argo-cd/commits/c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc" | ||
}, | ||
"protected": true, | ||
"protection": { | ||
"required_status_checks": { | ||
"enforcement_level": "non_admins", | ||
"contexts": [ | ||
"ci-test", | ||
"linter" | ||
] | ||
} | ||
}, | ||
"protection_url": "https://api.github.com/repos/argoproj/hello-world/branches/master/protection" | ||
} | ||
] | ||
`) | ||
if err != nil { | ||
t.Fail() | ||
} | ||
case "/api/v3/repos/argoproj/argo-cd/contents/pkg?ref=master": | ||
_, err := io.WriteString(w, `{ | ||
"type": "file", | ||
"encoding": "base64", | ||
"size": 5362, | ||
"name": "pkg/", | ||
"path": "pkg/", | ||
"content": "encoded content ...", | ||
"sha": "3d21ec53a331a6f037a91c368710b99387d012c1", | ||
"url": "https://api.github.com/repos/octokit/octokit.rb/contents/README.md", | ||
"git_url": "https://api.github.com/repos/octokit/octokit.rb/git/blobs/3d21ec53a331a6f037a91c368710b99387d012c1", | ||
"html_url": "https://github.com/octokit/octokit.rb/blob/master/README.md", | ||
"download_url": "https://raw.githubusercontent.com/octokit/octokit.rb/master/README.md", | ||
"_links": { | ||
"git": "https://api.github.com/repos/octokit/octokit.rb/git/blobs/3d21ec53a331a6f037a91c368710b99387d012c1", | ||
"self": "https://api.github.com/repos/octokit/octokit.rb/contents/README.md", | ||
"html": "https://github.com/octokit/octokit.rb/blob/master/README.md" | ||
} | ||
}`) | ||
if err != nil { | ||
t.Fail() | ||
} | ||
case "/api/v3/repos/argoproj/argo-cd/branches/master": | ||
_, err := io.WriteString(w, `{ | ||
"name": "master", | ||
"commit": { | ||
"sha": "c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc", | ||
"url": "https://api.github.com/repos/octocat/Hello-World/commits/c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc" | ||
}, | ||
"protected": true, | ||
"protection": { | ||
"required_status_checks": { | ||
"enforcement_level": "non_admins", | ||
"contexts": [ | ||
"ci-test", | ||
"linter" | ||
] | ||
} | ||
}, | ||
"protection_url": "https://api.github.com/repos/octocat/hello-world/branches/master/protection" | ||
}`) | ||
if err != nil { | ||
t.Fail() | ||
} | ||
default: | ||
w.WriteHeader(404) | ||
} | ||
|
||
} | ||
} | ||
|
||
|
@@ -66,18 +232,20 @@ func TestGithubListRepos(t *testing.T) { | |
name: "all branches", | ||
allBranches: true, | ||
url: "[email protected]:argoproj/argo-cd.git", | ||
branches: []string{"master", "release-0.11"}, | ||
branches: []string{"master"}, | ||
}, | ||
} | ||
|
||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||
githubMockHandler(t)(w, r) | ||
})) | ||
defer ts.Close() | ||
for _, c := range cases { | ||
t.Run(c.name, func(t *testing.T) { | ||
provider, _ := NewGithubProvider(context.Background(), "argoproj", "", "", c.allBranches) | ||
provider, _ := NewGithubProvider(context.Background(), "argoproj", "", ts.URL, c.allBranches) | ||
rawRepos, err := ListRepos(context.Background(), provider, c.filters, c.proto) | ||
if c.hasError { | ||
assert.Error(t, err) | ||
} else { | ||
checkRateLimit(t, err) | ||
assert.NoError(t, err) | ||
// Just check that this one project shows up. Not a great test but better thing nothing? | ||
repos := []*Repository{} | ||
|
@@ -99,45 +267,58 @@ func TestGithubListRepos(t *testing.T) { | |
} | ||
|
||
func TestGithubHasPath(t *testing.T) { | ||
host, _ := NewGithubProvider(context.Background(), "argoproj", "", "", false) | ||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||
githubMockHandler(t)(w, r) | ||
})) | ||
defer ts.Close() | ||
host, _ := NewGithubProvider(context.Background(), "argoproj", "", ts.URL, false) | ||
repo := &Repository{ | ||
Organization: "argoproj", | ||
Repository: "argo-cd", | ||
Branch: "master", | ||
} | ||
ok, err := host.RepoHasPath(context.Background(), repo, "pkg/") | ||
checkRateLimit(t, err) | ||
assert.Nil(t, err) | ||
assert.True(t, ok) | ||
|
||
ok, err = host.RepoHasPath(context.Background(), repo, "notathing/") | ||
checkRateLimit(t, err) | ||
assert.Nil(t, err) | ||
assert.False(t, ok) | ||
} | ||
|
||
func TestGithubGetBranches(t *testing.T) { | ||
host, _ := NewGithubProvider(context.Background(), "argoproj", "", "", false) | ||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||
githubMockHandler(t)(w, r) | ||
})) | ||
defer ts.Close() | ||
host, _ := NewGithubProvider(context.Background(), "argoproj", "", ts.URL, false) | ||
repo := &Repository{ | ||
Organization: "argoproj", | ||
Repository: "argo-cd", | ||
Branch: "master", | ||
} | ||
repos, err := host.GetBranches(context.Background(), repo) | ||
if err != nil { | ||
checkRateLimit(t, err) | ||
assert.NoError(t, err) | ||
} else { | ||
assert.Equal(t, repos[0].Branch, "master") | ||
} | ||
// Get all branches | ||
//Branch Doesn't exists instead of error will return no error | ||
repo2 := &Repository{ | ||
Organization: "argoproj", | ||
Repository: "applicationset", | ||
Branch: "main", | ||
} | ||
_, err = host.GetBranches(context.Background(), repo2) | ||
assert.NoError(t, err) | ||
|
||
// Get all branches | ||
host.allBranches = true | ||
repos, err = host.GetBranches(context.Background(), repo) | ||
if err != nil { | ||
checkRateLimit(t, err) | ||
assert.NoError(t, err) | ||
} else { | ||
// considering master and one release branch to always exist. | ||
assert.Greater(t, len(repos), 1) | ||
// considering master branch to exist. | ||
assert.Equal(t, len(repos), 1) | ||
} | ||
} |
Oops, something went wrong.