diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 55ef614faeff9a..34e7a2b4072fd1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -245,6 +245,15 @@ 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 }}" + 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="" 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..63071f2a7981e8 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("admin-tester"); } - @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 f6748fb6bdb91f..8be1cc5bc9bbd0 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 7d15259c1df3ce..c7bf094d69772e 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, 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,