diff --git a/applicationset/services/scm_provider/github_test.go b/applicationset/services/scm_provider/github_test.go index 303237fc1fe40..e611b8bfe594b 100644 --- a/applicationset/services/scm_provider/github_test.go +++ b/applicationset/services/scm_provider/github_test.go @@ -2,207 +2,124 @@ package scm_provider import ( "context" - "io" + "encoding/json" "net/http" "net/http/httptest" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + github "github.com/google/go-github/v66/github" ) func githubMockHandler(t *testing.T) func(http.ResponseWriter, *http.Request) { t.Helper() 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": "git@github.com: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() + repo := &github.Repository{ + ID: github.Int64(1296269), + NodeID: github.String("MDEwOlJlcG9zaXRvcnkxMjk2MjY5"), + Name: github.String("argo-cd"), + FullName: github.String("argoproj/argo-cd"), + Description: github.String("This your first repo!"), + Homepage: github.String("https://github.com"), + DefaultBranch: github.String("master"), + ForksCount: github.Int(9), + StargazersCount: github.Int(80), + WatchersCount: github.Int(80), + Topics: []string{"argoproj", "atom", "electron", "api"}, + Owner: &github.User{ + Login: github.String("argoproj"), + ID: github.Int64(1), + NodeID: github.String("MDQ6VXNlcjE="), + Type: github.String("User"), + SiteAdmin: github.Bool(false), + }, + CreatedAt: &github.Timestamp{Time: time.Date(2011, 1, 26, 19, 1, 12, 0, time.UTC)}, + UpdatedAt: &github.Timestamp{Time: time.Date(2011, 1, 26, 19, 14, 43, 0, time.UTC)}, + PushedAt: &github.Timestamp{Time: time.Date(2011, 1, 26, 19, 6, 43, 0, time.UTC)}, } + + if err := json.NewEncoder(w).Encode([]*github.Repository{repo}); err != nil { + t.Errorf("Failed to encode repository response: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + 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() + branch := &github.Branch{ + Name: github.String("master"), + Commit: &github.RepositoryCommit{ + SHA: github.String("c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc"), + }, + Protected: github.Bool(true), + Protection: &github.Protection{ + RequiredStatusChecks: &github.RequiredStatusChecks{ + // Enforcement: github.String("non_admins"), + Contexts: &[]string{"ci-test", "linter"}, + }, + }, } + + if err := json.NewEncoder(w).Encode([]*github.Branch{branch}); err != nil { + t.Errorf("Failed to encode branch response: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + 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() + content := &github.RepositoryContent{ + Type: github.String("file"), + Encoding: github.String("base64"), + Size: github.Int(5362), + Name: github.String("pkg/"), + Path: github.String("pkg/"), + Content: github.String("encoded content ..."), + SHA: github.String("3d21ec53a331a6f037a91c368710b99387d012c1"), + URL: github.String("https://api.github.com/repos/octokit/octokit.rb/contents/README.md"), + GitURL: github.String("https://api.github.com/repos/octokit/octokit.rb/git/blobs/3d21ec53a331a6f037a91c368710b99387d012c1"), + HTMLURL: github.String("https://github.com/octokit/octokit.rb/blob/master/README.md"), + DownloadURL: github.String("https://raw.githubusercontent.com/octokit/octokit.rb/master/README.md"), + } + + if err := json.NewEncoder(w).Encode(content); err != nil { + t.Errorf("Failed to encode content response: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return } + 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" + branch := &github.Branch{ + Name: github.String("master"), + Commit: &github.RepositoryCommit{ + SHA: github.String("c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc"), }, - "protected": true, - "protection": { - "required_status_checks": { - "enforcement_level": "non_admins", - "contexts": [ - "ci-test", - "linter" - ] - } + Protected: github.Bool(true), + Protection: &github.Protection{ + RequiredStatusChecks: &github.RequiredStatusChecks{ + //Enforcement: github.String("non_admins"), + Contexts: &[]string{"ci-test", "linter"}, + }, }, - "protection_url": "https://api.github.com/repos/octocat/hello-world/branches/master/protection" - }`) - if err != nil { - t.Fail() } + + if err := json.NewEncoder(w).Encode(branch); err != nil { + t.Errorf("Failed to encode branch response: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + default: w.WriteHeader(http.StatusNotFound) } } } - func TestGithubListRepos(t *testing.T) { cases := []struct { name, proto, url string