Skip to content

Commit 83148f6

Browse files
authored
Add test for "promptForDatabase" (#3248)
1 parent 8690f76 commit 83148f6

2 files changed

Lines changed: 156 additions & 28 deletions

File tree

extensions/ql-vscode/src/databases/local-databases-ui.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,15 +235,15 @@ async function chooseDatabaseDir(byFolder: boolean): Promise<Uri | undefined> {
235235
return getFirst(chosen);
236236
}
237237

238-
interface DatabaseSelectionQuickPickItem extends QuickPickItem {
238+
export interface DatabaseSelectionQuickPickItem extends QuickPickItem {
239239
databaseKind: "new" | "existing";
240240
}
241241

242242
export interface DatabaseQuickPickItem extends QuickPickItem {
243243
databaseItem: DatabaseItem;
244244
}
245245

246-
interface DatabaseImportQuickPickItems extends QuickPickItem {
246+
export interface DatabaseImportQuickPickItems extends QuickPickItem {
247247
importType: "URL" | "github" | "archive" | "folder";
248248
}
249249

extensions/ql-vscode/test/vscode-tests/no-workspace/databases/local-databases-ui.test.ts

Lines changed: 154 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,42 @@ import {
77
createFileSync,
88
pathExistsSync,
99
} from "fs-extra";
10-
import { Uri } from "vscode";
10+
import { CancellationTokenSource, Uri, window } from "vscode";
11+
12+
import type {
13+
DatabaseImportQuickPickItems,
14+
DatabaseQuickPickItem,
15+
DatabaseSelectionQuickPickItem,
16+
} from "../../../../src/databases/local-databases-ui";
1117

1218
import { DatabaseUI } from "../../../../src/databases/local-databases-ui";
1319
import { testDisposeHandler } from "../../test-dispose-handler";
1420
import { createMockApp } from "../../../__mocks__/appMock";
1521
import { QueryLanguage } from "../../../../src/common/query-language";
22+
import { mockedQuickPickItem, mockedObject } from "../../utils/mocking.helpers";
1623

1724
describe("local-databases-ui", () => {
25+
const storageDir = dirSync({ unsafeCleanup: true }).name;
26+
const db1 = createDatabase(storageDir, "db1-imported", QueryLanguage.Cpp);
27+
const db2 = createDatabase(storageDir, "db2-notimported", QueryLanguage.Cpp);
28+
const db3 = createDatabase(storageDir, "db3-invalidlanguage", "hucairz");
29+
30+
// these two should be deleted
31+
const db4 = createDatabase(
32+
storageDir,
33+
"db2-notimported-with-db-info",
34+
QueryLanguage.Cpp,
35+
".dbinfo",
36+
);
37+
const db5 = createDatabase(
38+
storageDir,
39+
"db2-notimported-with-codeql-database.yml",
40+
QueryLanguage.Cpp,
41+
"codeql-database.yml",
42+
);
43+
44+
const app = createMockApp({});
45+
1846
describe("fixDbUri", () => {
1947
const fixDbUri = (DatabaseUI.prototype as any).fixDbUri;
2048
it("should choose current directory normally", async () => {
@@ -64,30 +92,6 @@ describe("local-databases-ui", () => {
6492
});
6593

6694
it("should delete orphaned databases", async () => {
67-
const storageDir = dirSync({ unsafeCleanup: true }).name;
68-
const db1 = createDatabase(storageDir, "db1-imported", QueryLanguage.Cpp);
69-
const db2 = createDatabase(
70-
storageDir,
71-
"db2-notimported",
72-
QueryLanguage.Cpp,
73-
);
74-
const db3 = createDatabase(storageDir, "db3-invalidlanguage", "hucairz");
75-
76-
// these two should be deleted
77-
const db4 = createDatabase(
78-
storageDir,
79-
"db2-notimported-with-db-info",
80-
QueryLanguage.Cpp,
81-
".dbinfo",
82-
);
83-
const db5 = createDatabase(
84-
storageDir,
85-
"db2-notimported-with-codeql-database.yml",
86-
QueryLanguage.Cpp,
87-
"codeql-database.yml",
88-
);
89-
90-
const app = createMockApp({});
9195
const databaseUI = new DatabaseUI(
9296
app,
9397
{
@@ -98,6 +102,7 @@ describe("local-databases-ui", () => {
98102
onDidChangeCurrentDatabaseItem: () => {
99103
/**/
100104
},
105+
setCurrentDatabaseItem: () => {},
101106
} as any,
102107
{
103108
onLanguageContextChanged: () => {
@@ -108,7 +113,6 @@ describe("local-databases-ui", () => {
108113
storageDir,
109114
storageDir,
110115
);
111-
112116
await databaseUI.handleRemoveOrphanedDatabases();
113117

114118
expect(pathExistsSync(db1)).toBe(true);
@@ -121,6 +125,130 @@ describe("local-databases-ui", () => {
121125
databaseUI.dispose(testDisposeHandler);
122126
});
123127

128+
describe("getDatabaseItem", () => {
129+
const progress = jest.fn();
130+
const token = new CancellationTokenSource().token;
131+
describe("when there is a current database", () => {
132+
const databaseUI = new DatabaseUI(
133+
app,
134+
{
135+
databaseItems: [{ databaseUri: Uri.file(db1) }],
136+
onDidChangeDatabaseItem: () => {
137+
/**/
138+
},
139+
onDidChangeCurrentDatabaseItem: () => {
140+
/**/
141+
},
142+
setCurrentDatabaseItem: () => {},
143+
currentDatabaseItem: { databaseUri: Uri.file(db1) },
144+
} as any,
145+
{
146+
onLanguageContextChanged: () => {
147+
/**/
148+
},
149+
} as any,
150+
{} as any,
151+
storageDir,
152+
storageDir,
153+
);
154+
155+
it("should return current database", async () => {
156+
const databaseItem = await databaseUI.getDatabaseItem(progress, token);
157+
158+
expect(databaseItem).toEqual({ databaseUri: Uri.file(db1) });
159+
});
160+
});
161+
162+
describe("when there is no current database", () => {
163+
const databaseManager = {
164+
databaseItems: [
165+
{ databaseUri: Uri.file(db1) },
166+
{ databaseUri: Uri.file(db2) },
167+
],
168+
onDidChangeDatabaseItem: () => {
169+
/**/
170+
},
171+
onDidChangeCurrentDatabaseItem: () => {
172+
/**/
173+
},
174+
setCurrentDatabaseItem: () => {},
175+
currentDatabaseItem: undefined,
176+
} as any;
177+
178+
const databaseUI = new DatabaseUI(
179+
app,
180+
databaseManager,
181+
{
182+
onLanguageContextChanged: () => {
183+
/**/
184+
},
185+
} as any,
186+
{} as any,
187+
storageDir,
188+
storageDir,
189+
);
190+
191+
it("should prompt for a database and select existing one", async () => {
192+
const showQuickPickSpy = jest
193+
.spyOn(window, "showQuickPick")
194+
.mockResolvedValueOnce(
195+
mockedQuickPickItem(
196+
mockedObject<DatabaseSelectionQuickPickItem>({
197+
databaseKind: "existing",
198+
}),
199+
),
200+
)
201+
.mockResolvedValueOnce(
202+
mockedQuickPickItem(
203+
mockedObject<DatabaseQuickPickItem>({
204+
databaseItem: { databaseUri: Uri.file(db2) },
205+
}),
206+
),
207+
);
208+
209+
const setCurrentDatabaseItemSpy = jest.spyOn(
210+
databaseManager,
211+
"setCurrentDatabaseItem",
212+
);
213+
214+
await databaseUI.getDatabaseItem(progress, token);
215+
216+
expect(showQuickPickSpy).toHaveBeenCalledTimes(2);
217+
expect(setCurrentDatabaseItemSpy).toHaveBeenCalledWith({
218+
databaseUri: Uri.file(db2),
219+
});
220+
});
221+
222+
it("should prompt for a database and import a new one", async () => {
223+
const showQuickPickSpy = jest
224+
.spyOn(window, "showQuickPick")
225+
.mockResolvedValueOnce(
226+
mockedQuickPickItem(
227+
mockedObject<DatabaseSelectionQuickPickItem>({
228+
databaseKind: "new",
229+
}),
230+
),
231+
)
232+
.mockResolvedValueOnce(
233+
mockedQuickPickItem(
234+
mockedObject<DatabaseImportQuickPickItems>({
235+
importType: "github",
236+
}),
237+
),
238+
);
239+
240+
const handleChooseDatabaseGithubSpy = jest
241+
.spyOn(databaseUI as any, "handleChooseDatabaseGithub")
242+
.mockResolvedValue(undefined);
243+
244+
await databaseUI.getDatabaseItem(progress, token);
245+
246+
expect(showQuickPickSpy).toHaveBeenCalledTimes(2);
247+
expect(handleChooseDatabaseGithubSpy).toHaveBeenCalledTimes(1);
248+
});
249+
});
250+
});
251+
124252
function createDatabase(
125253
storageDir: string,
126254
dbName: string,

0 commit comments

Comments
 (0)