From b0a9d5c7f9f884899a386ee337d1fe4af1324fcd Mon Sep 17 00:00:00 2001 From: Omer Zidkoni <50792403+omerzi@users.noreply.github.com> Date: Sun, 27 Aug 2023 19:00:52 +0300 Subject: [PATCH] GetRepositoryInfo for Azure Repos (#116) --- vcsclient/azurerepos.go | 41 +++++++-- vcsclient/azurerepos_test.go | 81 ++++++++++------- vcsclient/bitbucketcloud.go | 12 ++- vcsclient/bitbucketcloud_test.go | 20 ----- vcsclient/bitbucketserver.go | 11 ++- vcsclient/bitbucketserver_test.go | 39 ++++----- vcsclient/github.go | 17 ++-- vcsclient/github_test.go | 57 +++++------- vcsclient/gitlab.go | 18 ++-- vcsclient/gitlab_test.go | 57 +++++------- vcsclient/testdata/azurerepos/hello_world.zip | Bin 2847 -> 3891 bytes .../azurerepos/resourcesResponse.json | 20 ++--- vcsclient/vcsclient.go | 5 -- vcsutils/utils.go | 15 ---- vcsutils/utils_test.go | 82 ------------------ 15 files changed, 177 insertions(+), 298 deletions(-) diff --git a/vcsclient/azurerepos.go b/vcsclient/azurerepos.go index 7a304b10..b3d40152 100644 --- a/vcsclient/azurerepos.go +++ b/vcsclient/azurerepos.go @@ -9,6 +9,7 @@ import ( "github.com/jfrog/froggit-go/vcsutils" "github.com/jfrog/gofrog/datastructures" "github.com/microsoft/azure-devops-go-api/azuredevops" + "github.com/microsoft/azure-devops-go-api/azuredevops/core" "github.com/microsoft/azure-devops-go-api/azuredevops/git" "io" "net/http" @@ -114,16 +115,16 @@ func (client *AzureReposClient) DownloadRepository(ctx context.Context, owner, r return err } client.logger.Info(successfulRepoExtraction) + repoInfo, err := client.GetRepositoryInfo(ctx, owner, repository) + if err != nil { + return err + } + httpsCloneUrl := repoInfo.CloneInfo.HTTP // Generate .git folder with remote details return vcsutils.CreateDotGitFolderWithRemote( localPath, vcsutils.RemoteName, - client.GetGitRemoteURL(owner, repository)) -} - -// GetGitRemoteURL on Azure Repos -func (client *AzureReposClient) GetGitRemoteURL(owner, repository string) string { - return fmt.Sprintf("https://%s@%s/%s/_git/%s", owner, strings.TrimPrefix(client.connectionDetails.BaseUrl, "https://"), client.vcsInfo.Project, repository) + httpsCloneUrl) } func (client *AzureReposClient) sendDownloadRepoRequest(ctx context.Context, repository string, branch string) (res *http.Response, err error) { @@ -405,7 +406,33 @@ func (client *AzureReposClient) AddSshKeyToRepository(ctx context.Context, owner // GetRepositoryInfo on Azure Repos func (client *AzureReposClient) GetRepositoryInfo(ctx context.Context, owner, repository string) (RepositoryInfo, error) { - return RepositoryInfo{}, getUnsupportedInAzureError("get repository info") + azureReposGitClient, err := client.buildAzureReposClient(ctx) + if err != nil { + return RepositoryInfo{}, err + } + response, err := azureReposGitClient.GetRepository(ctx, git.GetRepositoryArgs{ + RepositoryId: &repository, + Project: &client.vcsInfo.Project, + }) + if err != nil { + return RepositoryInfo{}, fmt.Errorf("an error occured while retrieving <%s/%s/%s> repository info:\n%s", owner, client.vcsInfo.Project, repository, err.Error()) + } + if response == nil { + return RepositoryInfo{}, fmt.Errorf("failed to retreive <%s/%s/%s> repository info, received empty response", owner, client.vcsInfo.Project, repository) + } + if response.Project == nil { + return RepositoryInfo{}, fmt.Errorf("failed to retreive <%s/%s/%s> repository info, received empty project info", owner, client.vcsInfo.Project, repository) + } + + visibility := Private + visibilityFromResponse := *response.Project.Visibility + if visibilityFromResponse == core.ProjectVisibilityValues.Public { + visibility = Public + } + return RepositoryInfo{ + CloneInfo: CloneInfo{HTTP: *response.RemoteUrl, SSH: *response.SshUrl}, + RepositoryVisibility: visibility, + }, nil } // GetCommitBySha on Azure Repos diff --git a/vcsclient/azurerepos_test.go b/vcsclient/azurerepos_test.go index 87a77f97..00faa054 100644 --- a/vcsclient/azurerepos_test.go +++ b/vcsclient/azurerepos_test.go @@ -39,7 +39,7 @@ func TestAzureRepos_ListRepositories(t *testing.T) { jsonRes, err := json.Marshal(res) assert.NoError(t, err) ctx := context.Background() - client, cleanUp := createServerAndClient(t, vcsutils.AzureRepos, true, jsonRes, "listRepositories", createAzureReposHandler) + client, cleanUp := createServerAndClient(t, vcsutils.AzureRepos, true, jsonRes, "getRepository", createAzureReposHandler) defer cleanUp() reposMap, err := client.ListRepositories(ctx) assert.NoError(t, err) @@ -92,7 +92,7 @@ func TestAzureRepos_TestDownloadRepository(t *testing.T) { repo1, branch1) client, cleanUp := createServerAndClient(t, vcsutils.AzureRepos, true, - repoFile, downloadURL, createAzureReposHandler) + repoFile, downloadURL, createGetRepositoryAzureReposHandler) defer cleanUp() err = client.DownloadRepository(ctx, "", repo1, branch1, dir) assert.NoError(t, err) @@ -449,11 +449,11 @@ func TestAzureReposClient_CreateLabel(t *testing.T) { assert.Error(t, client.CreateLabel(ctx, owner, repo1, LabelInfo{})) } -func TestAzureReposClient_GetRepositoryInfo(t *testing.T) { +func TestAzureReposClient_GetRepositoryEnvironmentInfo(t *testing.T) { ctx := context.Background() client, cleanUp := createServerAndClient(t, vcsutils.AzureRepos, true, "", "unsupportedTest", createAzureReposHandler) defer cleanUp() - _, err := client.GetRepositoryInfo(ctx, owner, repo1) + _, err := client.GetRepositoryEnvironmentInfo(ctx, owner, repo1, "") assert.Error(t, err) } @@ -547,19 +547,22 @@ func TestAzureReposClient_SetCommitStatus(t *testing.T) { assert.Error(t, err) } -func TestAzureReposClient_GetLabel(t *testing.T) { +func TestAzureReposClient_GetRepositoryInfo(t *testing.T) { ctx := context.Background() - client, cleanUp := createServerAndClient(t, vcsutils.AzureRepos, true, "", "unsupportedTest", createAzureReposHandler) + client, cleanUp := createServerAndClient(t, vcsutils.AzureRepos, true, "", "/_apis/ResourceAreas/getRepository", createGetRepositoryAzureReposHandler) defer cleanUp() - _, err := client.GetLabel(ctx, owner, repo1, "") - assert.Error(t, err) + repositoryInfo, err := client.GetRepositoryInfo(ctx, "jfrog", "froggit-go") + assert.NoError(t, err) + assert.Equal(t, "https://jfrog@dev.azure.com/jfrog/froggit-go/_git/froggit-go", repositoryInfo.CloneInfo.HTTP) + assert.Equal(t, "git@ssh.dev.azure.com:v3/jfrog/froggit-go/froggit-go", repositoryInfo.CloneInfo.SSH) + assert.Equal(t, repositoryInfo.RepositoryVisibility, Public) } -func TestAzureReposClient_GetRepositoryEnvironmentInfo(t *testing.T) { +func TestAzureReposClient_GetLabel(t *testing.T) { ctx := context.Background() client, cleanUp := createServerAndClient(t, vcsutils.AzureRepos, true, "", "unsupportedTest", createAzureReposHandler) defer cleanUp() - _, err := client.GetRepositoryEnvironmentInfo(ctx, owner, repo1, envName) + _, err := client.GetLabel(ctx, owner, repo1, "") assert.Error(t, err) } @@ -695,13 +698,14 @@ func createAzureReposHandler(t *testing.T, expectedURI string, response []byte, return func(w http.ResponseWriter, r *http.Request) { base64Token := base64.StdEncoding.EncodeToString([]byte(":" + token)) assert.Equal(t, "Basic "+base64Token, r.Header.Get("Authorization")) - if r.RequestURI == "/_apis" { + switch r.RequestURI { + case "/_apis": jsonVal, err := os.ReadFile(filepath.Join("./", "testdata", "azurerepos", "resourcesResponse.json")) assert.NoError(t, err) _, err = w.Write(jsonVal) assert.NoError(t, err) return - } else if r.RequestURI == "/_apis/ResourceAreas" { + case "/_apis/ResourceAreas": jsonVal := `{"value": [],"count": 0}` _, err := w.Write([]byte(jsonVal)) assert.NoError(t, err) @@ -719,6 +723,39 @@ func createAzureReposHandler(t *testing.T, expectedURI string, response []byte, } } +func createGetRepositoryAzureReposHandler(t *testing.T, expectedURI string, response []byte, expectedStatusCode int) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + base64Token := base64.StdEncoding.EncodeToString([]byte(":" + token)) + assert.Equal(t, "Basic "+base64Token, r.Header.Get("Authorization")) + switch r.RequestURI { + case "/_apis": + jsonVal, err := os.ReadFile(filepath.Join("./", "testdata", "azurerepos", "resourcesResponse.json")) + assert.NoError(t, err) + _, err = w.Write(jsonVal) + assert.NoError(t, err) + return + case "/_apis/ResourceAreas": + jsonVal := `{"value": [],"count": 0}` + _, err := w.Write([]byte(jsonVal)) + assert.NoError(t, err) + return + case "/_apis/ResourceAreas/getRepository": + jsonVal := `{"id":"23d122fb-c6c1-4f03-8117-a10a08f8b0d6","name":"froggit-go","url":"https://dev.azure.com/jfrog/638e3921-f5e3-46e6-a11f-a139cb9bd511/_apis/git/repositories/23d122fb-c6c1-4f03-8117-a10a08f8b0d6","project":{"id":"638e3921-f5e3-46e6-a11f-a139cb9bd511","name":"froggit-go","visibility":"public"},"defaultBranch":"refs/heads/main","remoteUrl":"https://jfrog@dev.azure.com/jfrog/froggit-go/_git/froggit-go","sshUrl":"git@ssh.dev.azure.com:v3/jfrog/froggit-go/froggit-go","isDisabled":false,"isInMaintenance":false}` + _, err := w.Write([]byte(jsonVal)) + assert.NoError(t, err) + return + } + + if !strings.Contains(expectedURI, "bad^endpoint") { + assert.Contains(t, r.RequestURI, expectedURI) + w.WriteHeader(expectedStatusCode) + _, err := w.Write(response) + assert.NoError(t, err) + return + } + w.WriteHeader(http.StatusNotFound) + } +} func createBadAzureReposClient(t *testing.T, response []byte) (VcsClient, func()) { client, cleanUp := createServerAndClient( t, @@ -732,23 +769,3 @@ func createBadAzureReposClient(t *testing.T, response []byte) (VcsClient, func() createAzureReposHandler) return client, cleanUp } - -func TestAzureReposClient_GetGitRemoteUrl(t *testing.T) { - testCase := struct { - name string - apiEndpoint string - owner string - repo string - expectedResult string - }{ - name: "Azure Repos Cloud", - apiEndpoint: "https://dev.azure.com/my-org", - owner: "my-org", - repo: "my-repo", - expectedResult: "https://my-org@dev.azure.com/my-org/project/_git/my-repo", - } - info := VcsInfo{APIEndpoint: testCase.apiEndpoint, Project: "project"} - client, err := NewAzureReposClient(info, nil) - assert.NoError(t, err) - assert.Equal(t, testCase.expectedResult, client.GetGitRemoteURL(testCase.owner, testCase.repo)) -} diff --git a/vcsclient/bitbucketcloud.go b/vcsclient/bitbucketcloud.go index 93479684..3d767a06 100644 --- a/vcsclient/bitbucketcloud.go +++ b/vcsclient/bitbucketcloud.go @@ -274,14 +274,12 @@ func (client *BitbucketCloudClient) DownloadRepository(ctx context.Context, owne return err } client.logger.Info(successfulRepoExtraction) + repositoryInfo, err := client.GetRepositoryInfo(ctx, owner, repository) + if err != nil { + return err + } // Generate .git folder with remote details - return vcsutils.CreateDotGitFolderWithRemote(localPath, "origin", - client.GetGitRemoteURL(owner, repository)) -} - -// GetGitRemoteURL on Bitbucket Cloud -func (client *BitbucketCloudClient) GetGitRemoteURL(owner, repository string) string { - return vcsutils.GetGenericGitRemoteUrl(client.vcsInfo.APIEndpoint, owner, repository) + return vcsutils.CreateDotGitFolderWithRemote(localPath, "origin", repositoryInfo.CloneInfo.HTTP) } // CreatePullRequest on Bitbucket cloud diff --git a/vcsclient/bitbucketcloud_test.go b/vcsclient/bitbucketcloud_test.go index d0600ab0..06c2380a 100644 --- a/vcsclient/bitbucketcloud_test.go +++ b/vcsclient/bitbucketcloud_test.go @@ -151,26 +151,6 @@ func TestBitbucketCloud_CreatePullRequest(t *testing.T) { assert.NoError(t, err) } -func TestBitbucketCloudClient_GetGitRemoteUrl(t *testing.T) { - testCase := struct { - name string - apiEndpoint string - owner string - repo string - expectedResult string - }{ - name: "Bitbucket Cloud", - apiEndpoint: "https://bitbucket.org", - owner: "my-org", - repo: "my-repo", - expectedResult: "https://bitbucket.org/my-org/my-repo.git", - } - info := VcsInfo{APIEndpoint: testCase.apiEndpoint} - client, err := NewBitbucketCloudClient(info, nil) - assert.NoError(t, err) - assert.Equal(t, testCase.expectedResult, client.GetGitRemoteURL(testCase.owner, testCase.repo)) -} - func TestBitbucketCloudClient_UpdatePullRequest(t *testing.T) { ctx := context.Background() prId := 3 diff --git a/vcsclient/bitbucketserver.go b/vcsclient/bitbucketserver.go index dc444e18..ce179ae0 100644 --- a/vcsclient/bitbucketserver.go +++ b/vcsclient/bitbucketserver.go @@ -266,16 +266,15 @@ func (client *BitbucketServerClient) DownloadRepository(ctx context.Context, own return err } client.logger.Info(successfulRepoExtraction) + repositoryInfo, err := client.GetRepositoryInfo(ctx, owner, repository) + if err != nil { + return err + } // Generate .git folder with remote details return vcsutils.CreateDotGitFolderWithRemote( localPath, vcsutils.RemoteName, - client.GetGitRemoteURL(owner, repository)) -} - -// GetGitRemoteURL on Bitbucket Server -func (client *BitbucketServerClient) GetGitRemoteURL(owner, repository string) string { - return vcsutils.GetGenericGitRemoteUrl(fmt.Sprintf("%s/scm", strings.TrimSuffix(client.vcsInfo.APIEndpoint, "/rest")), owner, repository) + repositoryInfo.CloneInfo.HTTP) } // CreatePullRequest on Bitbucket server diff --git a/vcsclient/bitbucketserver_test.go b/vcsclient/bitbucketserver_test.go index 165a604a..33060652 100644 --- a/vcsclient/bitbucketserver_test.go +++ b/vcsclient/bitbucketserver_test.go @@ -158,7 +158,7 @@ func TestBitbucketServer_DownloadRepository(t *testing.T) { assert.NoError(t, err) client, cleanUp := createServerAndClient(t, vcsutils.BitbucketServer, false, repoFile, - fmt.Sprintf("/rest/api/1.0/projects/%s/repos/%s/archive?format=tgz", owner, repo1), createBitbucketServerHandler) + fmt.Sprintf("/rest/api/1.0/projects/%s/repos/%s/archive?format=tgz", owner, repo1), createBitbucketServerDownloadRepositoryHandler) defer cleanUp() err = client.DownloadRepository(ctx, owner, repo1, "", dir) assert.NoError(t, err) @@ -718,6 +718,22 @@ func createBitbucketServerHandler(t *testing.T, expectedURI string, response []b } } +func createBitbucketServerDownloadRepositoryHandler(t *testing.T, expectedURI string, response []byte, expectedStatusCode int) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.RequestURI == "/rest/api/1.0/projects/jfrog/repos/repo-1" { + repositoryResponse, err := os.ReadFile(filepath.Join("testdata", "bitbucketserver", "repository_response.json")) + assert.NoError(t, err) + _, err = w.Write(repositoryResponse) + assert.NoError(t, err) + } + w.WriteHeader(expectedStatusCode) + _, err := w.Write(response) + assert.NoError(t, err) + assert.Contains(t, expectedURI, r.RequestURI) + assert.Equal(t, "Bearer "+token, r.Header.Get("Authorization")) + } +} + func createBitbucketServerListRepositoriesHandler(t *testing.T, _ string, _ []byte, expectedStatusCode int) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var responseObj interface{} @@ -834,24 +850,3 @@ func createBadBitbucketServerClient(t *testing.T) VcsClient { assert.NoError(t, err) return client } - -func TestBitbucketServerClient_GetGitRemoteUrl(t *testing.T) { - testCase := struct { - name string - apiEndpoint string - owner string - repo string - expectedResult string - }{ - name: "Bitbucket On-Premises", - apiEndpoint: "https://git.example.com", - owner: "my-org", - repo: "my-repo", - expectedResult: "https://git.example.com/scm/my-org/my-repo.git", - } - info := VcsInfo{APIEndpoint: testCase.apiEndpoint} - client, err := NewBitbucketServerClient(info, nil) - assert.NoError(t, err) - assert.Equal(t, testCase.expectedResult, client.GetGitRemoteURL(testCase.owner, testCase.repo)) - -} diff --git a/vcsclient/github.go b/vcsclient/github.go index 75d5269d..70a19a91 100644 --- a/vcsclient/github.go +++ b/vcsclient/github.go @@ -20,11 +20,6 @@ import ( "golang.org/x/oauth2" ) -const ( - GitHubApiVersion = "/api/v3" - GitHubCloudBaseUrl = "https://github.com" -) - // GitHubClient API version 3 type GitHubClient struct { vcsInfo VcsInfo @@ -251,17 +246,15 @@ func (client *GitHubClient) DownloadRepository(ctx context.Context, owner, repos return } + repositoryInfo, err := client.GetRepositoryInfo(ctx, owner, repository) + if err != nil { + return err + } client.logger.Info(successfulRepoExtraction) - err = vcsutils.CreateDotGitFolderWithRemote(localPath, vcsutils.RemoteName, client.GetGitRemoteURL(owner, repository)) + err = vcsutils.CreateDotGitFolderWithRemote(localPath, vcsutils.RemoteName, repositoryInfo.CloneInfo.HTTP) return } -// GetGitRemoteURL on GitHub -func (client *GitHubClient) GetGitRemoteURL(owner, repository string) string { - baseUrl := vcsutils.GetBaseURLFromApiEndpoint(client.vcsInfo.APIEndpoint, GitHubCloudBaseUrl, GitHubApiVersion) - return vcsutils.GetGenericGitRemoteUrl(baseUrl, owner, repository) -} - // CreatePullRequest on GitHub func (client *GitHubClient) CreatePullRequest(ctx context.Context, owner, repository, sourceBranch, targetBranch, title, description string) error { diff --git a/vcsclient/github_test.go b/vcsclient/github_test.go index 8f35486e..27c15d3b 100644 --- a/vcsclient/github_test.go +++ b/vcsclient/github_test.go @@ -200,7 +200,7 @@ func TestGitHubClient_DownloadRepository(t *testing.T) { client, cleanUp := createServerAndClientReturningStatus(t, vcsutils.GitHub, false, []byte("https://github.com/octocat/Hello-World/archive/refs/heads/master.tar.gz"), - "/repos/jfrog/Hello-World/tarball/test", http.StatusFound, createGitHubHandler) + "/repos/jfrog/Hello-World/tarball/test", http.StatusFound, createDownloadRepositoryGitHubHandler) defer cleanUp() assert.NoError(t, err) @@ -844,39 +844,6 @@ func TestGitHubClient_TestGetCommitStatus(t *testing.T) { }) } -func TestGitHubClient_GetGitRemoteUrl(t *testing.T) { - testCases := []struct { - name string - apiEndpoint string - owner string - repo string - expectedResult string - }{ - { - name: "GitHub Cloud", - apiEndpoint: "", - owner: "my-org", - repo: "my-repo", - expectedResult: "https://github.com/my-org/my-repo.git", - }, - { - name: "GitHub On-Premises", - apiEndpoint: "https://github.example.com", - owner: "my-org", - repo: "my-repo", - expectedResult: "https://github.example.com/my-org/my-repo.git", - }, - } - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - info := VcsInfo{APIEndpoint: tc.apiEndpoint} - client, err := NewGitHubClient(info, nil) - assert.NoError(t, err) - assert.Equal(t, tc.expectedResult, client.GetGitRemoteURL(tc.owner, tc.repo)) - }) - } -} - func TestGitHubClient_DeletePullRequestComment(t *testing.T) { ctx := context.Background() client, cleanUp := createServerAndClient(t, vcsutils.GitHub, false, nil, fmt.Sprintf("/repos/%v/%v/issues/comments/1", owner, repo1), createGitHubHandler) @@ -979,6 +946,28 @@ func createGitHubHandler(t *testing.T, expectedURI string, response []byte, expe } } +func createDownloadRepositoryGitHubHandler(t *testing.T, expectedURI string, response []byte, expectedStatusCode int) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.RequestURI == "/repos/jfrog/Hello-World" { + repositoryResponse, err := os.ReadFile(filepath.Join("testdata", "github", "repository_response.json")) + assert.NoError(t, err) + _, err = w.Write(repositoryResponse) + assert.NoError(t, err) + return + } + assert.Equal(t, expectedURI, r.RequestURI) + assert.Equal(t, "Bearer "+token, r.Header.Get("Authorization")) + if strings.Contains(r.RequestURI, "tarball") { + w.Header().Add("Location", string(response)) + w.WriteHeader(expectedStatusCode) + return + } + w.WriteHeader(expectedStatusCode) + _, err := w.Write(response) + assert.NoError(t, err) + } +} + func createGitHubSarifUploadHandler(t *testing.T, _ string, _ []byte, _ int) http.HandlerFunc { resultSHA := "66d9a06b02a9f3f5fb47bb026a6fa5577647d96e" return func(w http.ResponseWriter, r *http.Request) { diff --git a/vcsclient/gitlab.go b/vcsclient/gitlab.go index 25e30755..4a994825 100644 --- a/vcsclient/gitlab.go +++ b/vcsclient/gitlab.go @@ -14,11 +14,6 @@ import ( "strings" ) -const ( - GitLabApiVersion = "/api/v4" - GitLabCloudBaseUrl = "https://gitlab.com" -) - // GitLabClient API version 4 type GitLabClient struct { glClient *gitlab.Client @@ -220,14 +215,13 @@ func (client *GitLabClient) DownloadRepository(ctx context.Context, owner, repos return err } - client.logger.Info(successfulRepoExtraction) - return vcsutils.CreateDotGitFolderWithRemote(localPath, vcsutils.RemoteName, client.GetGitRemoteURL(owner, repository)) -} + repositoryInfo, err := client.GetRepositoryInfo(ctx, owner, repository) + if err != nil { + return err + } -// GetGitRemoteURL on GitLab -func (client *GitLabClient) GetGitRemoteURL(owner, repository string) string { - baseUrl := vcsutils.GetBaseURLFromApiEndpoint(client.vcsInfo.APIEndpoint, GitLabCloudBaseUrl, GitLabApiVersion) - return vcsutils.GetGenericGitRemoteUrl(baseUrl, owner, repository) + client.logger.Info(successfulRepoExtraction) + return vcsutils.CreateDotGitFolderWithRemote(localPath, vcsutils.RemoteName, repositoryInfo.CloneInfo.HTTP) } // CreatePullRequest on GitLab diff --git a/vcsclient/gitlab_test.go b/vcsclient/gitlab_test.go index 9625f42e..7e2a12e5 100644 --- a/vcsclient/gitlab_test.go +++ b/vcsclient/gitlab_test.go @@ -135,7 +135,7 @@ func TestGitLabClient_DownloadRepository(t *testing.T) { assert.NoError(t, err) ref := "5fbf81b31ff7a3b06bd362d1891e2f01bdb2be69" - client, cleanUp := createServerAndClient(t, vcsutils.GitLab, false, repoFile, fmt.Sprintf("/api/v4/projects/%s/repository/archive.tar.gz?sha=%s", url.PathEscape(owner+"/"+repo1), ref), createGitLabHandler) + client, cleanUp := createServerAndClient(t, vcsutils.GitLab, false, repoFile, fmt.Sprintf("/api/v4/projects/%s/repository/archive.tar.gz?sha=%s", url.PathEscape(owner+"/"+repo1), ref), createDownloadRepositoryGitLabHandler) defer cleanUp() err = client.DownloadRepository(ctx, owner, repo1, ref, dir) @@ -633,6 +633,28 @@ func createGitLabHandler(t *testing.T, expectedURI string, response []byte, expe assert.Equal(t, token, r.Header.Get("Private-Token")) } } + +func createDownloadRepositoryGitLabHandler(t *testing.T, expectedURI string, response []byte, expectedStatusCode int) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.RequestURI == "/api/v4/" { + w.WriteHeader(http.StatusOK) + return + } + if r.RequestURI == "/api/v4/projects/jfrog%2Frepo-1" { + repositoryResponse, err := os.ReadFile(filepath.Join("testdata", "gitlab", "repository_response.json")) + assert.NoError(t, err) + _, err = w.Write(repositoryResponse) + assert.NoError(t, err) + return + } + w.WriteHeader(expectedStatusCode) + _, err := w.Write(response) + assert.NoError(t, err) + assert.Equal(t, expectedURI, r.RequestURI) + assert.Equal(t, token, r.Header.Get("Private-Token")) + } +} + func createGitLabWithPaginationHandler(t *testing.T, _ string, response []byte, _ []byte, expectedStatusCode int, expectedHttpMethod string) http.HandlerFunc { var repos []gitlab.Project err := json.Unmarshal(response, &repos) @@ -786,36 +808,3 @@ func TestGitLabClient_getProjectOwnerByID(t *testing.T) { assert.Error(t, err) assert.NotEqual(t, "test", projectOwner) } - -func TestGitLabClient_GetGitRemoteUrl(t *testing.T) { - testCases := []struct { - name string - apiEndpoint string - owner string - repo string - expectedResult string - }{ - { - name: "GitLab Cloud", - apiEndpoint: "https://gitlab.com", - owner: "my-org", - repo: "my-repo", - expectedResult: "https://gitlab.com/my-org/my-repo.git", - }, - { - name: "GitLab On-Premises", - apiEndpoint: "https://gitlab.example.com/", - owner: "my-org", - repo: "my-repo", - expectedResult: "https://gitlab.example.com/my-org/my-repo.git", - }, - } - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - info := VcsInfo{APIEndpoint: tc.apiEndpoint} - client, err := NewGitLabClient(info, nil) - assert.NoError(t, err) - assert.Equal(t, tc.expectedResult, client.GetGitRemoteURL(tc.owner, tc.repo)) - }) - } -} diff --git a/vcsclient/testdata/azurerepos/hello_world.zip b/vcsclient/testdata/azurerepos/hello_world.zip index ab7838a93f4d96722761000a4e46b96437a79afe..8af108cbec5131b8fff4c9f00b8546004cf2504a 100644 GIT binary patch delta 1116 zcmbO)wpnh14u?yVPGY0e>y(Wq9bEOyEL;pAaHd*19L#_coD4DyC8@*yGtLml0FI}pS?-8b+LtY z`cJz(*3~_o#ge6gUL8xXH!O76&?mjY%|&+cwU8s8GxT1qdc8jLa!Kg@Euy8Li?}a+ zbYg8vX!6NxYF1tAAf}k58QazQ@=n~=vbX!sojqgaIwytU^c*&wB@D|iG`V&iVVc(Q z)Ff^8!gcFk-gb!nzbkTW#@+Kh>vZY^k1mi@QDZwHqH4AHz(Th#=PLETn3Qb45`Xvg z+1|6oD`$%HEfE&nP{8K(Sji*h)=>vF4`a#OKbD7X7CCI$#rrz%M$W8l%L|-i?e)z< zJu)ZpRy;FZV9eIj$>ve0Im0Q$g!lHI853p;7+7^2^l~_BdE#br|u%0L*ofRRa#8CO=4fMzNI zhPRHpfQsO`A~b{*lCiKDCjvDNBU{x&O=DmHnfDjjJd|9<$RxrH%V(I`3}gr}4>K%j f)aOQW5t0emGhKkU2rC;%GYb$}08Mzx3*rF)bRnlq delta 65 zcmdliH(zXm4u^A-PGa)Ag5-@R9bA*2^IB