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