Skip to content

Commit 6b26323

Browse files
committed
Move database Item search methods into skeleton wizard
And the tests for it. We can now re-use the factory from the previous commit.
1 parent 0ff2e83 commit 6b26323

File tree

4 files changed

+128
-80
lines changed

4 files changed

+128
-80
lines changed

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

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -897,31 +897,6 @@ export class DatabaseManager extends DisposableObject {
897897
}
898898
}
899899

900-
public async digForDatabaseItem(
901-
language: string,
902-
databaseNwo: string,
903-
): Promise<DatabaseItem | undefined> {
904-
const dbItems = this.databaseItems || [];
905-
const dbs = dbItems.filter(
906-
(db) => db.language === language && db.name === databaseNwo,
907-
);
908-
if (dbs.length === 0) {
909-
return undefined;
910-
}
911-
return dbs[0];
912-
}
913-
914-
public async digForDatabaseWithSameLanguage(
915-
language: string,
916-
): Promise<DatabaseItem | undefined> {
917-
const dbItems = this.databaseItems || [];
918-
const dbs = dbItems.filter((db) => db.language === language);
919-
if (dbs.length === 0) {
920-
return undefined;
921-
}
922-
return dbs[0];
923-
}
924-
925900
/**
926901
* Returns the index of the workspace folder that corresponds to the source archive of `item`
927902
* if there is one, and -1 otherwise.

extensions/ql-vscode/src/skeleton-query-wizard.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { QueryLanguage } from "./common/query-language";
77
import { askForLanguage, isFolderAlreadyInWorkspace } from "./helpers";
88
import { getErrorMessage } from "./pure/helpers-pure";
99
import { QlPackGenerator } from "./qlpack-generator";
10-
import { DatabaseManager } from "./local-databases";
10+
import { DatabaseItem, DatabaseManager } from "./local-databases";
1111
import * as databaseFetcher from "./databaseFetcher";
1212
import { ProgressCallback, UserCancellationException } from "./progress";
1313

@@ -239,19 +239,20 @@ export class SkeletonQueryWizard {
239239

240240
const databaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language];
241241

242-
// Check that we haven't already downloaded a database for this language
243-
const existingDatabaseItem = await this.databaseManager.digForDatabaseItem(
242+
const existingDatabaseItem = await this.digForDatabaseItem(
244243
this.language,
245244
databaseNwo,
245+
this.databaseManager.databaseItems,
246246
);
247247

248248
if (existingDatabaseItem) {
249249
// select the found database
250250
await this.databaseManager.setCurrentDatabaseItem(existingDatabaseItem);
251251
} else {
252252
const sameLanguageDatabaseItem =
253-
await this.databaseManager.digForDatabaseWithSameLanguage(
253+
await this.digForDatabaseWithSameLanguage(
254254
this.language,
255+
this.databaseManager.databaseItems,
255256
);
256257

257258
if (sameLanguageDatabaseItem) {
@@ -265,4 +266,31 @@ export class SkeletonQueryWizard {
265266
}
266267
}
267268
}
269+
270+
public async digForDatabaseItem(
271+
language: string,
272+
databaseNwo: string,
273+
databaseItems: readonly DatabaseItem[],
274+
): Promise<DatabaseItem | undefined> {
275+
const dbItems = databaseItems || [];
276+
const dbs = dbItems.filter(
277+
(db) => db.language === language && db.name === databaseNwo,
278+
);
279+
if (dbs.length === 0) {
280+
return undefined;
281+
}
282+
return dbs[0];
283+
}
284+
285+
public async digForDatabaseWithSameLanguage(
286+
language: string,
287+
databaseItems: readonly DatabaseItem[],
288+
): Promise<DatabaseItem | undefined> {
289+
const dbItems = databaseItems || [];
290+
const dbs = dbItems.filter((db) => db.language === language);
291+
if (dbs.length === 0) {
292+
return undefined;
293+
}
294+
return dbs[0];
295+
}
268296
}

extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts

Lines changed: 96 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,19 @@ import { createFileSync, ensureDirSync, removeSync } from "fs-extra";
1313
import { join } from "path";
1414
import { CancellationTokenSource } from "vscode-jsonrpc";
1515
import { testCredentialsWithStub } from "../../factories/authentication";
16-
import { DatabaseItem, DatabaseManager } from "../../../src/local-databases";
16+
import {
17+
DatabaseItem,
18+
DatabaseManager,
19+
FullDatabaseOptions,
20+
} from "../../../src/local-databases";
1721
import * as databaseFetcher from "../../../src/databaseFetcher";
22+
import { createMockDB } from "../../factories/databases/databases";
1823

1924
jest.setTimeout(40_000);
2025

2126
describe("SkeletonQueryWizard", () => {
2227
let wizard: SkeletonQueryWizard;
28+
let mockDatabaseManager: DatabaseManager;
2329
let dir: tmp.DirResult;
2430
let storagePath: string;
2531
let quickPickSpy: jest.SpiedFunction<typeof window.showQuickPick>;
@@ -42,11 +48,6 @@ describe("SkeletonQueryWizard", () => {
4248
const token = new CancellationTokenSource().token;
4349
const credentials = testCredentialsWithStub();
4450
const chosenLanguage = "ruby";
45-
const mockDatabaseManager = mockedObject<DatabaseManager>({
46-
setCurrentDatabaseItem: jest.fn(),
47-
digForDatabaseItem: jest.fn(),
48-
digForDatabaseWithSameLanguage: jest.fn(),
49-
});
5051
const mockCli = mockedObject<CodeQLCliServer>({
5152
resolveLanguages: jest
5253
.fn()
@@ -65,6 +66,11 @@ describe("SkeletonQueryWizard", () => {
6566
jest.spyOn(extLogger, "log").mockResolvedValue(undefined);
6667

6768
beforeEach(async () => {
69+
mockDatabaseManager = mockedObject<DatabaseManager>({
70+
setCurrentDatabaseItem: jest.fn(),
71+
databaseItems: [] as DatabaseItem[],
72+
});
73+
6874
dir = tmp.dirSync({
6975
prefix: "skeleton_query_wizard_",
7076
unsafeCleanup: true,
@@ -214,6 +220,7 @@ describe("SkeletonQueryWizard", () => {
214220
describe("if database is also already downloaded", () => {
215221
let databaseNwo: string;
216222
let databaseItem: DatabaseItem;
223+
let mockDatabaseManagerWithItems: DatabaseManager;
217224

218225
beforeEach(async () => {
219226
databaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[chosenLanguage];
@@ -223,9 +230,19 @@ describe("SkeletonQueryWizard", () => {
223230
language: chosenLanguage,
224231
} as DatabaseItem;
225232

226-
jest
227-
.spyOn(mockDatabaseManager, "digForDatabaseItem")
228-
.mockResolvedValue([databaseItem] as any);
233+
mockDatabaseManagerWithItems = mockedObject<DatabaseManager>({
234+
setCurrentDatabaseItem: jest.fn(),
235+
databaseItems: [databaseItem] as DatabaseItem[],
236+
});
237+
238+
wizard = new SkeletonQueryWizard(
239+
mockCli,
240+
jest.fn(),
241+
credentials,
242+
extLogger,
243+
mockDatabaseManagerWithItems,
244+
token,
245+
);
229246
});
230247

231248
it("should not download a new database for language", async () => {
@@ -237,9 +254,9 @@ describe("SkeletonQueryWizard", () => {
237254
it("should select an existing database", async () => {
238255
await wizard.execute();
239256

240-
expect(mockDatabaseManager.setCurrentDatabaseItem).toHaveBeenCalledWith(
241-
[databaseItem],
242-
);
257+
expect(
258+
mockDatabaseManagerWithItems.setCurrentDatabaseItem,
259+
).toHaveBeenCalledWith(databaseItem);
243260
});
244261

245262
it("should open the new query file", async () => {
@@ -254,12 +271,6 @@ describe("SkeletonQueryWizard", () => {
254271
});
255272

256273
describe("if database is missing", () => {
257-
beforeEach(async () => {
258-
jest
259-
.spyOn(mockDatabaseManager, "digForDatabaseItem")
260-
.mockResolvedValue(undefined);
261-
});
262-
263274
describe("if the user choses to downloaded the suggested database from GitHub", () => {
264275
it("should download a new database for language", async () => {
265276
await wizard.execute();
@@ -335,4 +346,71 @@ describe("SkeletonQueryWizard", () => {
335346
});
336347
});
337348
});
349+
350+
describe("digForDatabaseItem", () => {
351+
describe("when the item exists", () => {
352+
it("should return the database item", async () => {
353+
const mockDbItem = createMockDB(dir);
354+
const mockDbItem2 = createMockDB(dir);
355+
356+
const databaseItem = await wizard.digForDatabaseItem(
357+
mockDbItem.language,
358+
mockDbItem.name,
359+
[mockDbItem, mockDbItem2],
360+
);
361+
362+
expect(databaseItem!.language).toEqual(mockDbItem.language);
363+
expect(databaseItem!.name).toEqual(mockDbItem.name);
364+
});
365+
});
366+
367+
describe("when the item doesn't exist", () => {
368+
it("should return nothing", async () => {
369+
const mockDbItem = createMockDB(dir);
370+
const mockDbItem2 = createMockDB(dir);
371+
372+
const databaseItem = await wizard.digForDatabaseItem(
373+
"ruby",
374+
"mock-database-name",
375+
[mockDbItem, mockDbItem2],
376+
);
377+
378+
expect(databaseItem).toBeUndefined();
379+
});
380+
});
381+
});
382+
383+
describe("digForDatabaseWithSameLanguage", () => {
384+
describe("when the item exists", () => {
385+
it("should return the database item", async () => {
386+
const mockDbItem = createMockDB(dir, {
387+
language: "ruby",
388+
} as FullDatabaseOptions);
389+
const mockDbItem2 = createMockDB(dir, {
390+
language: "javascript",
391+
} as FullDatabaseOptions);
392+
393+
const databaseItem = await wizard.digForDatabaseWithSameLanguage(
394+
"ruby",
395+
[mockDbItem, mockDbItem2],
396+
);
397+
398+
expect(databaseItem).toEqual(mockDbItem);
399+
});
400+
});
401+
402+
describe("when the item doesn't exist", () => {
403+
it("should return nothing", async () => {
404+
const mockDbItem = createMockDB(dir);
405+
const mockDbItem2 = createMockDB(dir);
406+
407+
const databaseItem = await wizard.digForDatabaseWithSameLanguage(
408+
"ruby",
409+
[mockDbItem, mockDbItem2],
410+
);
411+
412+
expect(databaseItem).toBeUndefined();
413+
});
414+
});
415+
});
338416
});

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

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -800,37 +800,4 @@ describe("local databases", () => {
800800
});
801801
});
802802
});
803-
804-
describe("digForDatabaseItem", () => {
805-
describe("when the item exists", () => {
806-
it("should return the database item", async () => {
807-
const mockDbItem = createMockDB();
808-
809-
await (databaseManager as any).addDatabaseItem(
810-
{} as ProgressCallback,
811-
{} as CancellationToken,
812-
mockDbItem,
813-
);
814-
815-
const databaseItem = await databaseManager.digForDatabaseItem(
816-
mockDbItem.language,
817-
mockDbItem.name,
818-
);
819-
820-
expect(databaseItem!.language).toEqual(mockDbItem.language);
821-
expect(databaseItem!.name).toEqual(mockDbItem.name);
822-
});
823-
});
824-
825-
describe("when the item doesn't exist", () => {
826-
it("should return nothing", async () => {
827-
const databaseItem = await databaseManager.digForDatabaseItem(
828-
"ruby",
829-
"mock-database-name",
830-
);
831-
832-
expect(databaseItem).toBeUndefined();
833-
});
834-
});
835-
});
836803
});

0 commit comments

Comments
 (0)