diff --git a/extensions/ql-vscode/src/skeleton-query-wizard.ts b/extensions/ql-vscode/src/skeleton-query-wizard.ts index f42346faf95..078a03c6d75 100644 --- a/extensions/ql-vscode/src/skeleton-query-wizard.ts +++ b/extensions/ql-vscode/src/skeleton-query-wizard.ts @@ -277,8 +277,12 @@ export class SkeletonQueryWizard { ): Promise { const dbItems = databaseItems || []; const dbs = dbItems.filter( - (db) => db.language === language && db.name === databaseNwo, + (db) => + db.language === language && + db.name === databaseNwo && + db.error === undefined, ); + if (dbs.length === 0) { return undefined; } @@ -290,7 +294,9 @@ export class SkeletonQueryWizard { databaseItems: readonly DatabaseItem[], ): Promise { const dbItems = databaseItems || []; - const dbs = dbItems.filter((db) => db.language === language); + const dbs = dbItems.filter( + (db) => db.language === language && db.error === undefined, + ); if (dbs.length === 0) { return undefined; } diff --git a/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts b/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts index a20b71fb349..d42c21197c9 100644 --- a/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts +++ b/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts @@ -20,8 +20,9 @@ import { } from "../../../src/local-databases"; import * as databaseFetcher from "../../../src/databaseFetcher"; import { createMockDB } from "../../factories/databases/databases"; +import { asError } from "../../../src/pure/helpers-pure"; -jest.setTimeout(40_000); +jest.setTimeout(80_000); describe("SkeletonQueryWizard", () => { let mockCli: CodeQLCliServer; @@ -366,8 +367,15 @@ describe("SkeletonQueryWizard", () => { describe("findDatabaseItemByNwo", () => { describe("when the item exists", () => { it("should return the database item", async () => { - const mockDbItem = createMockDB(dir); - const mockDbItem2 = createMockDB(dir); + const mockDbItem = createMockDB(dir, { + language: "ruby", + dateAdded: 123, + } as FullDatabaseOptions); + const mockDbItem2 = createMockDB(dir, { + language: "javascript", + } as FullDatabaseOptions); + + jest.spyOn(mockDbItem, "name", "get").mockReturnValue("mock-name"); const databaseItem = await wizard.findDatabaseItemByNwo( mockDbItem.language, @@ -375,8 +383,40 @@ describe("SkeletonQueryWizard", () => { [mockDbItem, mockDbItem2], ); - expect(databaseItem!.language).toEqual(mockDbItem.language); - expect(databaseItem!.name).toEqual(mockDbItem.name); + expect(JSON.stringify(databaseItem)).toEqual( + JSON.stringify(mockDbItem), + ); + }); + + it("should ignore databases with errors", async () => { + const mockDbItem = createMockDB(dir, { + language: "ruby", + dateAdded: 123, + } as FullDatabaseOptions); + const mockDbItem2 = createMockDB(dir, { + language: "javascript", + } as FullDatabaseOptions); + const mockDbItem3 = createMockDB(dir, { + language: "ruby", + dateAdded: 345, + } as FullDatabaseOptions); + + jest.spyOn(mockDbItem, "name", "get").mockReturnValue("mock-name"); + jest.spyOn(mockDbItem3, "name", "get").mockReturnValue(mockDbItem.name); + + jest + .spyOn(mockDbItem, "error", "get") + .mockReturnValue(asError("database go boom!")); + + const databaseItem = await wizard.findDatabaseItemByNwo( + mockDbItem.language, + mockDbItem.name, + [mockDbItem, mockDbItem2, mockDbItem3], + ); + + expect(JSON.stringify(databaseItem)).toEqual( + JSON.stringify(mockDbItem3), + ); }); }); @@ -413,6 +453,32 @@ describe("SkeletonQueryWizard", () => { expect(databaseItem).toEqual(mockDbItem); }); + + it("should ignore databases with errors", async () => { + const mockDbItem = createMockDB(dir, { + language: "ruby", + } as FullDatabaseOptions); + const mockDbItem2 = createMockDB(dir, { + language: "javascript", + } as FullDatabaseOptions); + const mockDbItem3 = createMockDB(dir, { + language: "ruby", + } as FullDatabaseOptions); + + jest + .spyOn(mockDbItem, "error", "get") + .mockReturnValue(asError("database go boom!")); + + const databaseItem = await wizard.findDatabaseItemByLanguage("ruby", [ + mockDbItem, + mockDbItem2, + mockDbItem3, + ]); + + expect(JSON.stringify(databaseItem)).toEqual( + JSON.stringify(mockDbItem3), + ); + }); }); describe("when the item doesn't exist", () => {