diff --git a/.github/workflows/release-gate.yml b/.github/workflows/release-gate.yml index 5f53b5029..1d5ca966f 100644 --- a/.github/workflows/release-gate.yml +++ b/.github/workflows/release-gate.yml @@ -142,11 +142,11 @@ jobs: run: python3 -m pip install pipenv poetry - name: Run Tests - run: go test github_test.go integrationutils.go commands.go -v -race -timeout 30m -cover + run: go test -tags integration github_test.go integrationutils.go commands.go -v -race -timeout 30m -cover env: JF_URL: ${{ secrets.PLATFORM_URL }} JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }} - FROGBOT_TESTS_GITHUB_TOKEN: ${{ secrets.FROGBOT_TESTS_GITHUB_TOKEN }} + FROGBOT_V3_TESTS_GITHUB_TOKEN: ${{ secrets.FROGBOT_V3_TESTS_GITHUB_TOKEN }} azure-integration: name: Azure Integration Tests @@ -178,11 +178,11 @@ jobs: run: python3 -m pip install pipenv poetry - name: Run Tests - run: go test azure_test.go integrationutils.go commands.go -v -race -timeout 30m -cover + run: go test -tags integration azure_test.go integrationutils.go commands.go -v -race -timeout 30m -cover env: JF_URL: ${{ secrets.PLATFORM_URL }} JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }} - FROGBOT_TESTS_AZURE_TOKEN: ${{ secrets.FROGBOT_TESTS_AZURE_TOKEN }} + FROGBOT_TESTS_AZURE_TOKEN: ${{ secrets.FROGBOT_V3_TESTS_AZURE_TOKEN }} gitlab-integration: name: GitLab Integration Tests @@ -214,11 +214,11 @@ jobs: run: python3 -m pip install pipenv poetry - name: Run Tests - run: go test gitlab_test.go integrationutils.go commands.go -v -race -timeout 30m -cover + run: go test -tags integration gitlab_test.go integrationutils.go commands.go -v -race -timeout 30m -cover env: JF_URL: ${{ secrets.PLATFORM_URL }} JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }} - FROGBOT_TESTS_GITLAB_TOKEN: ${{ secrets.FROGBOT_TESTS_GITLAB_TOKEN }} + FROGBOT_V3_TESTS_GITLAB_TOKEN: ${{ secrets.FROGBOT_V3_TESTS_GITLAB_TOKEN }} bitbucket-server-integration: name: Bitbucket Server Integration Tests @@ -283,8 +283,8 @@ jobs: env: JF_URL: ${{ secrets.PLATFORM_URL }} JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }} - FROGBOT_TESTS_BB_SERVER_TOKEN: ${{ secrets.FROGBOT_TESTS_BB_SERVER_TOKEN }} - run: go test -v bitbucket_server_test.go commands.go integrationutils.go + FROGBOT_TESTS_BB_SERVER_TOKEN: ${{ secrets.FROGBOT_V3_TESTS_BB_SERVER_TOKEN }} + run: go test -tags integration -v bitbucket_server_test.go commands.go integrationutils.go - name: Display Logs on Failure if: failure() diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bc205cf29..c40a8bee6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -217,11 +217,11 @@ jobs: ${{ runner.os }}-go- - name: Run Tests - run: go test github_test.go integrationutils.go commands.go -v -race -timeout 30m -cover + run: go test -tags integration github_test.go integrationutils.go commands.go -v -race -timeout 30m -cover env: JF_URL: ${{ secrets.PLATFORM_URL }} JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }} - FROGBOT_TESTS_GITHUB_TOKEN: ${{ secrets.FROGBOT_TESTS_GITHUB_TOKEN }} + FROGBOT_V3_TESTS_GITHUB_TOKEN: ${{ secrets.FROGBOT_V3_TESTS_GITHUB_TOKEN }} azure-integration: name: Azure Integration Tests @@ -262,11 +262,11 @@ jobs: ${{ runner.os }}-go- - name: Run Tests - run: go test azure_test.go integrationutils.go commands.go -v -race -timeout 30m -cover + run: go test -tags integration azure_test.go integrationutils.go commands.go -v -race -timeout 30m -cover env: JF_URL: ${{ secrets.PLATFORM_URL }} JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }} - FROGBOT_TESTS_AZURE_TOKEN: ${{ secrets.FROGBOT_TESTS_AZURE_TOKEN }} + FROGBOT_TESTS_AZURE_TOKEN: ${{ secrets.FROGBOT_V3_TESTS_AZURE_TOKEN }} gitlab-integration: name: GitLab Integration Tests @@ -307,11 +307,11 @@ jobs: ${{ runner.os }}-go- - name: Run Tests - run: go test gitlab_test.go integrationutils.go commands.go -v -race -timeout 30m -cover + run: go test -tags integration gitlab_test.go integrationutils.go commands.go -v -race -timeout 30m -cover env: JF_URL: ${{ secrets.PLATFORM_URL }} JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }} - FROGBOT_TESTS_GITLAB_TOKEN: ${{ secrets.FROGBOT_TESTS_GITLAB_TOKEN }} + FROGBOT_V3_TESTS_GITLAB_TOKEN: ${{ secrets.FROGBOT_V3_TESTS_GITLAB_TOKEN }} bitbucket-server-integration: name: Bitbucket Server Integration Tests @@ -359,6 +359,6 @@ jobs: env: JF_URL: ${{ secrets.PLATFORM_URL }} JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }} - FROGBOT_TESTS_BB_SERVER_TOKEN: ${{ secrets.FROGBOT_TESTS_BB_SERVER_TOKEN }} + FROGBOT_TESTS_BB_SERVER_TOKEN: ${{ secrets.FROGBOT_V3_TESTS_BB_SERVER_TOKEN }} JFROG_CLI_LOG_LEVEL: "DEBUG" - run: go test -v bitbucket_server_test.go commands.go integrationutils.go + run: go test -tags integration -v bitbucket_server_test.go commands.go integrationutils.go diff --git a/azure_test.go b/azure_test.go index 5688eb9b6..4cdd2b648 100644 --- a/azure_test.go +++ b/azure_test.go @@ -1,3 +1,5 @@ +//go:build integration + package main import ( @@ -21,30 +23,26 @@ func buildAzureReposClient(t *testing.T, azureToken string) vcsclient.VcsClient return azureClient } -func buildAzureReposIntegrationTestDetails(t *testing.T, useLocalRepo bool) *IntegrationTestDetails { +func buildAzureReposIntegrationTestDetails(t *testing.T) *IntegrationTestDetails { integrationRepoToken := getIntegrationToken(t, azureIntegrationTokenEnv) - testDetails := NewIntegrationTestDetails(integrationRepoToken, string(utils.AzureRepos), azureGitCloneUrl, "frogbot-test", useLocalRepo) + testDetails := NewIntegrationTestDetails(integrationRepoToken, string(utils.AzureRepos), azureGitCloneUrl, "frogbot-test") testDetails.ApiEndpoint = azureApiEndpoint return testDetails } -func azureReposTestsInit(t *testing.T, useLocalRepo bool) (vcsclient.VcsClient, *IntegrationTestDetails) { - testDetails := buildAzureReposIntegrationTestDetails(t, useLocalRepo) +func azureReposTestsInit(t *testing.T) (vcsclient.VcsClient, *IntegrationTestDetails) { + testDetails := buildAzureReposIntegrationTestDetails(t) azureClient := buildAzureReposClient(t, testDetails.GitToken) return azureClient, testDetails } func TestAzureRepos_ScanPullRequestIntegration(t *testing.T) { - azureClient, testDetails := azureReposTestsInit(t, false) + t.Fatal("ScanPullRequest integration test is not yet implemented") + azureClient, testDetails := azureReposTestsInit(t) runScanPullRequestCmd(t, azureClient, testDetails) } func TestAzureRepos_ScanRepositoryIntegration(t *testing.T) { - azureClient, testDetails := azureReposTestsInit(t, false) - runScanRepositoryCmd(t, azureClient, testDetails) -} - -func TestAzureRepos_ScanRepositoryWithLocalDirIntegration(t *testing.T) { - azureClient, testDetails := azureReposTestsInit(t, true) + azureClient, testDetails := azureReposTestsInit(t) runScanRepositoryCmd(t, azureClient, testDetails) } diff --git a/bitbucket_server_test.go b/bitbucket_server_test.go index 9dde83703..a36fff1a2 100644 --- a/bitbucket_server_test.go +++ b/bitbucket_server_test.go @@ -1,3 +1,5 @@ +//go:build integration + package main import ( @@ -27,9 +29,9 @@ func buildBitbucketServerClient(t *testing.T, bitbucketServerToken string) vcscl return bbClient } -func buildBitbucketServerIntegrationTestDetails(t *testing.T, useLocalRepo bool) *IntegrationTestDetails { +func buildBitbucketServerIntegrationTestDetails(t *testing.T) *IntegrationTestDetails { integrationRepoToken := getIntegrationToken(t, bitbucketServerIntegrationTokenEnv) - testDetails := NewIntegrationTestDetails(integrationRepoToken, string(utils.BitbucketServer), bitbucketServerGitCloneUrl, "FROG", useLocalRepo) + testDetails := NewIntegrationTestDetails(integrationRepoToken, string(utils.BitbucketServer), bitbucketServerGitCloneUrl, "FROG") testDetails.ApiEndpoint = bitbucketServerApiEndpoint return testDetails } @@ -54,24 +56,20 @@ func waitForConnection(t *testing.T) { require.NoError(t, retryExecutor.Execute()) } -func bitbucketServerTestsInit(t *testing.T, useLocalRepo bool) (vcsclient.VcsClient, *IntegrationTestDetails) { - testDetails := buildBitbucketServerIntegrationTestDetails(t, useLocalRepo) +func bitbucketServerTestsInit(t *testing.T) (vcsclient.VcsClient, *IntegrationTestDetails) { + testDetails := buildBitbucketServerIntegrationTestDetails(t) bbClient := buildBitbucketServerClient(t, testDetails.GitToken) waitForConnection(t) return bbClient, testDetails } func TestBitbucketServer_ScanPullRequestIntegration(t *testing.T) { - bbClient, testDetails := bitbucketServerTestsInit(t, false) + t.Fatal("ScanPullRequest integration test is not yet implemented") + bbClient, testDetails := bitbucketServerTestsInit(t) runScanPullRequestCmd(t, bbClient, testDetails) } func TestBitbucketServer_ScanRepositoryIntegration(t *testing.T) { - bbClient, testDetails := bitbucketServerTestsInit(t, false) - runScanRepositoryCmd(t, bbClient, testDetails) -} - -func TestBitbucketServer_ScanRepositoryWithLocalDirIntegration(t *testing.T) { - bbClient, testDetails := bitbucketServerTestsInit(t, true) + bbClient, testDetails := bitbucketServerTestsInit(t) runScanRepositoryCmd(t, bbClient, testDetails) } diff --git a/github_test.go b/github_test.go index c66a6eef6..4a67c346a 100644 --- a/github_test.go +++ b/github_test.go @@ -1,17 +1,21 @@ +//go:build integration + package main import ( + "testing" + "github.com/jfrog/frogbot/v2/utils" "github.com/jfrog/froggit-go/vcsclient" "github.com/jfrog/froggit-go/vcsutils" "github.com/stretchr/testify/assert" - "testing" ) const ( //#nosec G101 -- False positive - no hardcoded credentials. - githubIntegrationTokenEnv = "FROGBOT_TESTS_GITHUB_TOKEN" - githubGitCloneUrl = "https://github.com/frogbot-test/integration.git" + githubIntegrationTokenEnv = "FROGBOT_V3_TESTS_GITHUB_TOKEN" + githubGitCloneUrl = "https://github.com/frogbot-e2e-test/frogbot-test.git" + githubRepoOwner = "frogbot-e2e-test" ) func buildGitHubClient(t *testing.T, githubToken string) vcsclient.VcsClient { @@ -20,28 +24,24 @@ func buildGitHubClient(t *testing.T, githubToken string) vcsclient.VcsClient { return githubClient } -func buildGitHubIntegrationTestDetails(t *testing.T, useLocalRepo bool) *IntegrationTestDetails { +func buildGitHubIntegrationTestDetails(t *testing.T) *IntegrationTestDetails { integrationRepoToken := getIntegrationToken(t, githubIntegrationTokenEnv) - return NewIntegrationTestDetails(integrationRepoToken, string(utils.GitHub), githubGitCloneUrl, "frogbot-test", useLocalRepo) + return NewIntegrationTestDetails(integrationRepoToken, string(utils.GitHub), githubGitCloneUrl, githubRepoOwner) } -func githubTestsInit(t *testing.T, useLocalRepo bool) (vcsclient.VcsClient, *IntegrationTestDetails) { - testDetails := buildGitHubIntegrationTestDetails(t, useLocalRepo) +func githubTestsInit(t *testing.T) (vcsclient.VcsClient, *IntegrationTestDetails) { + testDetails := buildGitHubIntegrationTestDetails(t) githubClient := buildGitHubClient(t, testDetails.GitToken) return githubClient, testDetails } func TestGitHub_ScanPullRequestIntegration(t *testing.T) { - githubClient, testDetails := githubTestsInit(t, false) + t.Fatal("ScanPullRequest integration test is not yet implemented") + githubClient, testDetails := githubTestsInit(t) runScanPullRequestCmd(t, githubClient, testDetails) } func TestGitHub_ScanRepositoryIntegration(t *testing.T) { - githubClient, testDetails := githubTestsInit(t, false) - runScanRepositoryCmd(t, githubClient, testDetails) -} - -func TestGitHub_ScanRepositoryWithLocalDirIntegration(t *testing.T) { - githubClient, testDetails := githubTestsInit(t, true) + githubClient, testDetails := githubTestsInit(t) runScanRepositoryCmd(t, githubClient, testDetails) } diff --git a/gitlab_test.go b/gitlab_test.go index 2cce4d35f..5c46557cc 100644 --- a/gitlab_test.go +++ b/gitlab_test.go @@ -1,17 +1,21 @@ +//go:build integration + package main import ( + "testing" + "github.com/jfrog/frogbot/v2/utils" "github.com/jfrog/froggit-go/vcsclient" "github.com/jfrog/froggit-go/vcsutils" "github.com/stretchr/testify/assert" - "testing" ) const ( //#nosec G101 -- False positive - no hardcoded credentials. - gitlabIntegrationTokenEnv = "FROGBOT_TESTS_GITLAB_TOKEN" - gitlabGitCloneUrl = "https://gitlab.com/frogbot-test2/integration.git" + gitlabIntegrationTokenEnv = "FROGBOT_V3_TESTS_GITLAB_TOKEN" + gitlabGitCloneUrl = "https://gitlab.com/frogbot-e2e-test1/frogbot-test.git" + gitlabRepoOwner = "frogbot-e2e-test1" ) func buildGitLabClient(t *testing.T, gitlabToken string) vcsclient.VcsClient { @@ -20,28 +24,24 @@ func buildGitLabClient(t *testing.T, gitlabToken string) vcsclient.VcsClient { return azureClient } -func buildGitLabIntegrationTestDetails(t *testing.T, useLocalRepo bool) *IntegrationTestDetails { +func buildGitLabIntegrationTestDetails(t *testing.T) *IntegrationTestDetails { integrationRepoToken := getIntegrationToken(t, gitlabIntegrationTokenEnv) - return NewIntegrationTestDetails(integrationRepoToken, string(utils.GitLab), gitlabGitCloneUrl, "frogbot-test2", useLocalRepo) + return NewIntegrationTestDetails(integrationRepoToken, string(utils.GitLab), gitlabGitCloneUrl, gitlabRepoOwner) } -func gitlabTestsInit(t *testing.T, useLocalRepo bool) (vcsclient.VcsClient, *IntegrationTestDetails) { - testDetails := buildGitLabIntegrationTestDetails(t, useLocalRepo) +func gitlabTestsInit(t *testing.T) (vcsclient.VcsClient, *IntegrationTestDetails) { + testDetails := buildGitLabIntegrationTestDetails(t) gitlabClient := buildGitLabClient(t, testDetails.GitToken) return gitlabClient, testDetails } func TestGitLab_ScanPullRequestIntegration(t *testing.T) { - gitlabClient, testDetails := gitlabTestsInit(t, false) + t.Fatal("ScanPullRequest integration test is not yet implemented") + gitlabClient, testDetails := gitlabTestsInit(t) runScanPullRequestCmd(t, gitlabClient, testDetails) } func TestGitLab_ScanRepositoryIntegration(t *testing.T) { - gitlabClient, testDetails := gitlabTestsInit(t, false) - runScanRepositoryCmd(t, gitlabClient, testDetails) -} - -func TestGitLab_ScanRepositoryWithLocalDirIntegration(t *testing.T) { - gitlabClient, testDetails := gitlabTestsInit(t, true) + gitlabClient, testDetails := gitlabTestsInit(t) runScanRepositoryCmd(t, gitlabClient, testDetails) } diff --git a/integrationutils.go b/integrationutils.go index a9ac65bec..72e60f366 100644 --- a/integrationutils.go +++ b/integrationutils.go @@ -1,3 +1,5 @@ +//go:build integration + package main import ( @@ -23,10 +25,11 @@ import ( ) const ( - repoName = "integration" - issuesBranch = "issues-branch" + repoName = "frogbot-test" + issuesBranch = "issues-branch" // TODO consider changing (without 'frogbot' prefix) mainBranch = "main" - expectedNumberOfIssues = 10 + gitUsername = "frogbot-e2e-test" + expectedNumberOfIssues = 10 // TODO change when fixing PR tests ) type IntegrationTestDetails struct { @@ -40,19 +43,17 @@ type IntegrationTestDetails struct { ApiEndpoint string PullRequestID string CustomBranchName string - UseLocalRepo bool // TODO can remove when deprecating non-local repository concept from integration tests } -func NewIntegrationTestDetails(token, gitProvider, gitCloneUrl, repoOwner string, useLocalRepo bool) *IntegrationTestDetails { +func NewIntegrationTestDetails(token, gitProvider, gitCloneUrl, repoOwner string) *IntegrationTestDetails { return &IntegrationTestDetails{ - GitProject: repoName, - RepoOwner: repoOwner, - RepoName: repoName, - GitToken: token, - GitUsername: "frogbot", - GitProvider: gitProvider, - GitCloneURL: gitCloneUrl, - UseLocalRepo: useLocalRepo, + GitProject: repoName, + RepoOwner: repoOwner, + RepoName: repoName, + GitToken: token, + GitUsername: gitUsername, + GitProvider: gitProvider, + GitCloneURL: gitCloneUrl, } } @@ -131,6 +132,19 @@ func findRelevantPrID(pullRequests []vcsclient.PullRequestInfo, branch string) ( return } +func cleanupLeftoverFrogbotPRs(t *testing.T, client vcsclient.VcsClient, testDetails *IntegrationTestDetails, gitManager *utils.GitManager) { + remainingPRs := getOpenPullRequests(t, client, testDetails) + for _, pr := range remainingPRs { + if strings.HasPrefix(pr.Source.Name, "frogbot-") { + t.Logf("Cleaning up leftover frogbot PR: %s (ID: %d)", pr.Source.Name, pr.ID) + closePullRequest(t, client, testDetails, int(pr.ID)) + if err := gitManager.RemoveRemoteBranch(pr.Source.Name); err != nil { + t.Logf("Warning: failed to remove leftover branch %s: %v", pr.Source.Name, err) + } + } + } +} + func getOpenPullRequests(t *testing.T, client vcsclient.VcsClient, testDetails *IntegrationTestDetails) []vcsclient.PullRequestInfo { ctx := context.Background() pullRequests, err := client.ListOpenPullRequests(ctx, testDetails.RepoOwner, testDetails.RepoName) @@ -181,49 +195,47 @@ func runScanRepositoryCmd(t *testing.T, client vcsclient.VcsClient, testDetails assert.NoError(t, restoreFunc()) }() - // When testing using local repository, clone the repository before the test starts, so we can work with it as if it existed locally - if testDetails.UseLocalRepo { - cloneOptions := &git.CloneOptions{ - URL: testDetails.GitCloneURL, - Auth: &githttp.BasicAuth{ - Username: testDetails.GitUsername, - Password: testDetails.GitToken, - }, - RemoteName: "origin", - ReferenceName: utils.GetFullBranchName("main"), - SingleBranch: true, - Depth: 1, - Tags: git.NoTags, - } - _, err := git.PlainClone(testTempDir, false, cloneOptions) - require.NoError(t, err) + cloneOptions := &git.CloneOptions{ + URL: testDetails.GitCloneURL, + Auth: &githttp.BasicAuth{ + Username: testDetails.GitUsername, + Password: testDetails.GitToken, + }, + RemoteName: "origin", + ReferenceName: utils.GetFullBranchName("main"), + SingleBranch: true, + Depth: 1, + Tags: git.NoTags, } - timestamp := getTimestamp() - // Add a timestamp to the fixing pull requests, to identify them later - testDetails.CustomBranchName = "frogbot-{IMPACTED_PACKAGE}-{BRANCH_NAME_HASH}-" + timestamp + _, err := git.PlainClone(testTempDir, false, cloneOptions) + require.NoError(t, err) // Set the required environment variables for the scan-repository command unsetEnvs := setIntegrationTestEnvs(t, testDetails) defer unsetEnvs() - err := Exec(&scanrepository.ScanRepositoryCmd{}, utils.ScanRepository) + err = Exec(&scanrepository.ScanRepositoryCmd{}, utils.ScanRepository) require.NoError(t, err) gitManager := buildGitManager(t, testDetails) pullRequests := getOpenPullRequests(t, client, testDetails) - expectedBranchName := "frogbot-pyjwt-45ebb5a61916a91ae7c1e3ff7ffb6112-" + timestamp - prId := findRelevantPrID(pullRequests, expectedBranchName) - assert.NotZero(t, prId) - closePullRequest(t, client, testDetails, prId) - assert.NoError(t, gitManager.RemoveRemoteBranch(expectedBranchName)) - - expectedBranchName = "frogbot-pyyaml-985622f4dbf3a64873b6b8440288e005-" + timestamp - prId = findRelevantPrID(pullRequests, expectedBranchName) - assert.NotZero(t, prId) - closePullRequest(t, client, testDetails, prId) - assert.NoError(t, gitManager.RemoveRemoteBranch(expectedBranchName)) + expectedBranches := []string{ + "frogbot-snyk-5aaa88cc32aaaf2d8d893decd0a1b284", + "frogbot-lodash-36ab76ead8f9cace70988ea19d280c93", + "frogbot-minimist-e6e68f7e53c2b59c6bd946e00af797f7", + } + for _, expectedBranch := range expectedBranches { + prId := findRelevantPrID(pullRequests, expectedBranch) + assert.NotZero(t, prId, "Expected to find PR for branch %s", expectedBranch) + if prId != 0 { + closePullRequest(t, client, testDetails, prId) + assert.NoError(t, gitManager.RemoveRemoteBranch(expectedBranch)) + } + } + + cleanupLeftoverFrogbotPRs(t, client, testDetails, gitManager) } func validateResults(t *testing.T, ctx context.Context, client vcsclient.VcsClient, testDetails *IntegrationTestDetails, prID int) {