From 3de45b3e3210784963b3c39b01ac5bea46e7bb91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Mon, 18 Nov 2024 10:43:44 +0000 Subject: [PATCH 1/5] Fix SCM integration tests --- .../bitbucket-server-api.spec.ts | 45 ++++--------------- .../bitbucket-server/bitbucket-server-api.ts | 7 +-- .../bitbucket-repository-provider.spec.ts | 4 +- .../bitbucket-repository-provider.ts | 2 +- .../src/github/github-repository-provider.ts | 4 +- .../src/gitlab/gitlab-context-parser.spec.ts | 3 +- 6 files changed, 18 insertions(+), 47 deletions(-) diff --git a/components/server/src/bitbucket-server/bitbucket-server-api.spec.ts b/components/server/src/bitbucket-server/bitbucket-server-api.spec.ts index a06fd02ff02057..c6db2e9b15f718 100644 --- a/components/server/src/bitbucket-server/bitbucket-server-api.spec.ts +++ b/components/server/src/bitbucket-server/bitbucket-server-api.spec.ts @@ -78,17 +78,17 @@ class TestBitbucketServerApi { }; } - @test.skip async test_currentUsername_ok() { + @test async test_currentUsername_ok() { const result = await this.api.currentUsername(process.env["GITPOD_TEST_TOKEN_BITBUCKET_SERVER"]!); - expect(result).to.equal("AlexTugarev"); + expect(result).to.equal("alex"); } - @test.skip async test_getUserProfile_ok() { - const result = await this.api.getUserProfile(process.env["GITPOD_TEST_TOKEN_BITBUCKET_SERVER"]!, "AlexTugarev"); + @test async test_getUserProfile_ok() { + const result = await this.api.getUserProfile(process.env["GITPOD_TEST_TOKEN_BITBUCKET_SERVER"]!, "alex"); expect(result).to.deep.include({ - id: 105, // Identity.authId - name: "AlexTugarev", // Identity.authName - slug: "alextugarev", // used in URLs + id: 53, // Identity.authId + name: "alex", // Identity.authName + slug: "alex", // used in URLs displayName: "Alex Tugarev", }); } @@ -97,7 +97,7 @@ class TestBitbucketServerApi { const result = await this.api.getRepos(process.env["GITPOD_TEST_TOKEN_BITBUCKET_SERVER"]!, { permission: "REPO_READ", }); - expect(result.length).to.be.equal(9177); + expect(result.length).to.be.equal(10_000); // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=0&limit=1000 - OK // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=1002&limit=1000 - OK @@ -174,35 +174,6 @@ class TestBitbucketServerApi { // ✓ test_getRepos_searchString_wildcards_are_not_supported (172ms) } - @test async test_getRepos_searchString_single_char_is_ignored() { - const result = await this.api.getRepos(process.env["GITPOD_TEST_TOKEN_BITBUCKET_SERVER"]!, { - permission: "REPO_READ", - searchString: "t", - }); - expect(result.length).to.be.equal(9177); - - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=0&name=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=1000&name=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=2000&name=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=3000&name=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=4000&name=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=5000&name=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=6000&name=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=7000&name=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=8000&name=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=0&projectname=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=1000&projectname=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=2000&projectname=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=3000&projectname=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=4000&projectname=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=5000&projectname=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=6000&projectname=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=7000&projectname=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=8000&projectname=t - OK - // BBS: GET https://bitbucket.gitpod-dev.com/rest/api/1.0/repos?permission=REPO_READ&limit=1000&start=9000&projectname=t - OK - // ✓ test_getRepos_searchString_single_char_is_ignored (7329ms) - } - @test async test_getRepos_searchString_unmatched() { const result = await this.api.getRepos(process.env["GITPOD_TEST_TOKEN_BITBUCKET_SERVER"]!, { permission: "REPO_READ", diff --git a/components/server/src/bitbucket-server/bitbucket-server-api.ts b/components/server/src/bitbucket-server/bitbucket-server-api.ts index 9bfbcf4feadd3a..dcf21cc7cdae79 100644 --- a/components/server/src/bitbucket-server/bitbucket-server-api.ts +++ b/components/server/src/bitbucket-server/bitbucket-server-api.ts @@ -322,7 +322,7 @@ export class BitbucketServerApi { } /** - * If `searchString` is provided, this tries to match projects and repositorys by name, + * If `searchString` is provided, this tries to match projects and repositories by name, * otherwise it returns the first n repositories. * * Based on: @@ -333,7 +333,7 @@ export class BitbucketServerApi { query: { permission?: "REPO_READ" | "REPO_WRITE" | "REPO_ADMIN"; /** - * If projects and repositorys are matched by by name, otherwise it returns the first n repositories. + * If projects and repositories are matched by name, otherwise it returns the first n repositories. */ searchString?: string; /** @@ -402,6 +402,7 @@ export class BitbucketServerApi { start = pageResult.nextPageStart; } } + return result; }; @@ -425,7 +426,7 @@ export class BitbucketServerApi { return Array.from(results.values()); } else { - return await fetchRepos(baseParams); + return fetchRepos(baseParams); } } diff --git a/components/server/src/bitbucket/bitbucket-repository-provider.spec.ts b/components/server/src/bitbucket/bitbucket-repository-provider.spec.ts index 28be66b679beb8..c486a6f64c261c 100644 --- a/components/server/src/bitbucket/bitbucket-repository-provider.spec.ts +++ b/components/server/src/bitbucket/bitbucket-repository-provider.spec.ts @@ -12,7 +12,7 @@ import { AuthProviderParams } from "../auth/auth-provider"; import { HostContextProvider } from "../auth/host-context-provider"; import { DevData } from "../dev/dev-data"; import { TokenProvider } from "../user/token-provider"; -import { BitbucketApiFactory } from "./bitbucket-api-factory"; +import { BasicAuthBitbucketApiFactory, BitbucketApiFactory } from "./bitbucket-api-factory"; import { BitbucketRepositoryProvider } from "./bitbucket-repository-provider"; import { BitbucketTokenHelper } from "./bitbucket-token-handler"; const expect = chai.expect; @@ -50,7 +50,7 @@ class TestBitbucketRepositoryProvider { bind(TokenProvider).toConstantValue({ getTokenForHost: async () => DevData.createBitbucketTestToken(), }); - bind(BitbucketApiFactory).toSelf().inSingletonScope(); + bind(BitbucketApiFactory).to(BasicAuthBitbucketApiFactory).inSingletonScope(); bind(HostContextProvider).toConstantValue({ get: (hostname: string) => { authProvider: { diff --git a/components/server/src/bitbucket/bitbucket-repository-provider.ts b/components/server/src/bitbucket/bitbucket-repository-provider.ts index e0c3f2a2be6c3d..9d2c1fa8a2d1a3 100644 --- a/components/server/src/bitbucket/bitbucket-repository-provider.ts +++ b/components/server/src/bitbucket/bitbucket-repository-provider.ts @@ -187,7 +187,7 @@ export class BitbucketRepositoryProvider implements RepositoryProvider { workspace: workspaceSlug, // name includes searchString q: `name ~ "${searchString}"`, - // sort by most recently updatd first + // sort by most recently updated first sort: "-updated_on", // limit to the first 10 results per workspace pagelen: 10, diff --git a/components/server/src/github/github-repository-provider.ts b/components/server/src/github/github-repository-provider.ts index 5b6f5030602bf5..e2241638eedabc 100644 --- a/components/server/src/github/github-repository-provider.ts +++ b/components/server/src/github/github-repository-provider.ts @@ -262,10 +262,8 @@ export class GithubRepositoryProvider implements RepositoryProvider { } }`; - let repos: RepositoryInfo[] = []; - const result = await this.githubQueryApi.runQuery(user, repoSearchQuery); - repos = result.data.search.edges.map((edge) => { + const repos: RepositoryInfo[] = result.data.search.edges.map((edge) => { return { name: edge.node.name, url: edge.node.url, diff --git a/components/server/src/gitlab/gitlab-context-parser.spec.ts b/components/server/src/gitlab/gitlab-context-parser.spec.ts index 8cab2aedf7a0c5..4a6ad32bb3cc52 100644 --- a/components/server/src/gitlab/gitlab-context-parser.spec.ts +++ b/components/server/src/gitlab/gitlab-context-parser.spec.ts @@ -52,7 +52,8 @@ class TestGitlabContextParser { }; static readonly BLO_BLA_ERROR_DATA = { host: "gitlab.com", - lastUpdate: undefined, + lastUpdate: "", + errorMessage: 'GitLab responded: "404 Project Not Found"', owner: "blo", repoName: "bla", userIsOwner: false, From 4b8f5215b0974600453f926d0da34b4636639a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Mon, 18 Nov 2024 14:17:17 +0000 Subject: [PATCH 2/5] fixup bbs test expectation with official testing token --- .../server/src/bitbucket-server/bitbucket-server-api.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/server/src/bitbucket-server/bitbucket-server-api.spec.ts b/components/server/src/bitbucket-server/bitbucket-server-api.spec.ts index c6db2e9b15f718..63071f2a7981e8 100644 --- a/components/server/src/bitbucket-server/bitbucket-server-api.spec.ts +++ b/components/server/src/bitbucket-server/bitbucket-server-api.spec.ts @@ -80,7 +80,7 @@ class TestBitbucketServerApi { @test async test_currentUsername_ok() { const result = await this.api.currentUsername(process.env["GITPOD_TEST_TOKEN_BITBUCKET_SERVER"]!); - expect(result).to.equal("alex"); + expect(result).to.equal("admin-tester"); } @test async test_getUserProfile_ok() { From a47ca25bf8b039c65d88548fbcb4b237e2685637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Wed, 20 Nov 2024 07:53:25 +0000 Subject: [PATCH 3/5] Add note about GitLab search --- components/server/src/gitlab/gitlab-repository-provider.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/components/server/src/gitlab/gitlab-repository-provider.ts b/components/server/src/gitlab/gitlab-repository-provider.ts index 2a5adf53bc88b8..5e9f1b2041776a 100644 --- a/components/server/src/gitlab/gitlab-repository-provider.ts +++ b/components/server/src/gitlab/gitlab-repository-provider.ts @@ -144,6 +144,7 @@ export class GitlabRepositoryProvider implements RepositoryProvider { const result = await this.gitlab.run(user, async (gitlab) => { return gitlab.Projects.all({ membership: true, + // note: GitLab returns an empty project set when there isn't an exact match and the search length is <3 search: searchString, perPage: limit, simple: true, From 41c5243787e6eac078b804a4ee2afe8b2aae9789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Wed, 20 Nov 2024 07:54:04 +0000 Subject: [PATCH 4/5] Update GHA --- .github/workflows/build.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 55ef614faeff9a..c32402306a585f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -245,6 +245,14 @@ jobs: CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" LEEWAY_REMOTE_CACHE_BUCKET: ${{needs.configuration.outputs.leeway_cache_bucket}} IMAGE_REPO_BASE: ${{needs.configuration.outputs.image_repo_base}}/build + + # SCM tokens for integration tests + GITPOD_TEST_TOKEN_BITBUCKET: "${{ secrets.GITPOD_TEST_TOKEN_BITBUCKET }}" + GITPOD_TEST_TOKEN_BITBUCKET_SERVER: "${{ secrets.GITPOD_TEST_TOKEN_BITBUCKET_SERVER }}" + GITPOD_TEST_TOKEN_BITBUCKET_SERVER_WRITE: "${{ secrets.GITPOD_TEST_TOKEN_BITBUCKET_SERVER_WRITE }}" + GITPOD_TEST_TOKEN_BITBUCKET_SERVER_READ: "${{ secrets.GITPOD_TEST_TOKEN_BITBUCKET_SERVER_READ }}" + GITPOD_TEST_TOKEN_GITHUB: "${{ secrets.GITPOD_TEST_TOKEN_GITHUB }}" + GITPOD_TEST_TOKEN_GITLAB: "${{ secrets.GITPOD_TEST_TOKEN_GITLAB }}" run: | [[ "$PR_NO_CACHE" = "true" ]] && CACHE="none" || CACHE="remote" [[ "$PR_NO_TEST" = "true" ]] && TEST="--dont-test" || TEST="" From 64b4f6984455b2c3d7ccf3d52fa4053d9bc6f5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Wed, 20 Nov 2024 08:07:55 +0000 Subject: [PATCH 5/5] Add ADO token definition --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c32402306a585f..34e7a2b4072fd1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -253,6 +253,7 @@ jobs: GITPOD_TEST_TOKEN_BITBUCKET_SERVER_READ: "${{ secrets.GITPOD_TEST_TOKEN_BITBUCKET_SERVER_READ }}" GITPOD_TEST_TOKEN_GITHUB: "${{ secrets.GITPOD_TEST_TOKEN_GITHUB }}" GITPOD_TEST_TOKEN_GITLAB: "${{ secrets.GITPOD_TEST_TOKEN_GITLAB }}" + GITPOD_TEST_TOKEN_AZURE_DEVOPS: "${{ secrets.GITPOD_TEST_TOKEN_AZURE_DEVOPS }}" run: | [[ "$PR_NO_CACHE" = "true" ]] && CACHE="none" || CACHE="remote" [[ "$PR_NO_TEST" = "true" ]] && TEST="--dont-test" || TEST=""