Path: blob/main/components/dashboard/src/data/git-providers/unified-repositories-search-query.test.ts
2501 views
/**1* Copyright (c) 2023 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { SuggestedRepository } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";7import { deduplicateAndFilterRepositories, isValidGitUrl } from "./unified-repositories-search-query";89function repo(name: string, project?: string): SuggestedRepository {10return new SuggestedRepository({11url: `http://github.com/efu3he4rf/${name}`,12repoName: name,13configurationName: project,14configurationId: project,15});16}1718test("it should deduplicate non-project entries", () => {19const suggestedRepos: SuggestedRepository[] = [repo("foo"), repo("foo2"), repo("foo", "project-foo")];20const deduplicated = deduplicateAndFilterRepositories("foo", false, false, suggestedRepos);21expect(deduplicated.length).toEqual(2);22expect(deduplicated[1].configurationName).toEqual("project-foo");23});2425test("it should not deduplicate project entries", () => {26const suggestedRepos: SuggestedRepository[] = [27repo("foo", "project-foo2"),28repo("foo2"),29repo("foo", "project-foo"),30];31const deduplicated = deduplicateAndFilterRepositories("foo", false, false, suggestedRepos);32expect(deduplicated.length).toEqual(3);33});3435test("it should exclude project entries", () => {36const suggestedRepos: SuggestedRepository[] = [37repo("foo", "project-foo2"),38repo("foo2"),39repo("foo", "project-foo"),40];41const deduplicated = deduplicateAndFilterRepositories("foo", true, false, suggestedRepos);42expect(deduplicated.length).toEqual(2);43expect(deduplicated[0].repoName).toEqual("foo");44expect(deduplicated[1].repoName).toEqual("foo2");45});4647test("it should match entries in url as well as project name", () => {48const suggestedRepos: SuggestedRepository[] = [49repo("somefOOtest"),50repo("Footest"),51repo("somefoO"),52repo("bar", "somefOO"),53repo("bar", "someFootest"),54repo("bar", "FOOtest"),55];56let deduplicated = deduplicateAndFilterRepositories("foo", false, false, suggestedRepos);57expect(deduplicated.length).toEqual(6);58deduplicated = deduplicateAndFilterRepositories("foot", false, false, suggestedRepos);59expect(deduplicated.length).toEqual(4);60deduplicated = deduplicateAndFilterRepositories("FOOT", false, false, suggestedRepos);61expect(deduplicated.length).toEqual(4);62});6364test("it keeps the order", () => {65const suggestedRepos: SuggestedRepository[] = [66repo("somefOOtest"),67repo("Footest"),68repo("somefoO"),69repo("bar", "somefOO"),70repo("bar", "someFootest"),71repo("bar", "FOOtest"),72repo("bar", "somefOO"),73];74const deduplicated = deduplicateAndFilterRepositories("foot", false, false, suggestedRepos);75expect(deduplicated[0].repoName).toEqual("somefOOtest");76expect(deduplicated[1].repoName).toEqual("Footest");77expect(deduplicated[2].configurationName).toEqual("someFootest");78expect(deduplicated[3].configurationName).toEqual("FOOtest");7980const deduplicatedNoSearch = deduplicateAndFilterRepositories("", false, false, suggestedRepos);81expect(deduplicatedNoSearch.length).toEqual(6);82});8384test("it should return all repositories without duplicates when excludeProjects is true", () => {85const suggestedRepos: SuggestedRepository[] = [86repo("foo"),87repo("foo", "project-foo"),88repo("foo", "project-bar"),89repo("bar", "project-foo"),90repo("bar", "project-bar"),91];92const deduplicated = deduplicateAndFilterRepositories("foo", true, false, suggestedRepos);93expect(deduplicated.length).toEqual(2);94expect(deduplicated[0].repoName).toEqual("foo");95expect(deduplicated[1].repoName).toEqual("bar");96});9798test("should perform weak validation for git URLs", () => {99expect(isValidGitUrl("a:")).toEqual(false);100expect(isValidGitUrl("a:b")).toEqual(false);101expect(isValidGitUrl("https://b")).toEqual(false);102expect(isValidGitUrl("https://b/repo.git")).toEqual(false);103expect(isValidGitUrl("https://b.com/repo.git")).toEqual(true);104expect(isValidGitUrl("[email protected]:")).toEqual(false);105expect(isValidGitUrl("[email protected]:")).toEqual(false);106expect(isValidGitUrl("[email protected]:22:")).toEqual(false);107expect(isValidGitUrl("[email protected]:g/g")).toEqual(true);108109// some "from the wild" cases110expect(isValidGitUrl("https://github.com/gitpod-io/gitpod/pull/20281")).toEqual(true);111expect(isValidGitUrl("https://gitlab.com/filiptronicek/gitpod.git")).toEqual(true);112expect(isValidGitUrl("[email protected]:gitpod-io/gitpod.git")).toEqual(true);113expect(isValidGitUrl("[email protected]:filiptronicek/gitpod.git")).toEqual(true);114expect(isValidGitUrl("ssh://[email protected]:12345/~/repository.git")).toBe(true);115expect(isValidGitUrl("https://bitbucket.gitpod-dev.com/scm/~geropl/test-user-repo.git")).toBe(true);116expect(isValidGitUrl("git://gitlab.com/gitpod/spring-petclinic")).toBe(true);117expect(isValidGitUrl("[email protected]:v3/services-azure/open-to-edit-project2/open-to-edit-project2")).toBe(118true,119);120});121122123