Skip to content

Commit 128803b

Browse files
committed
Filter out databases with errors
When we create a skeleton query, we check whether you already have an existing database with the same name (e.g. `github/codeql`). If we can't find one, we also check for an existing database with the same language. If we find one, we select it instead of downloading a new database. Here we're filtering out databases with errors.
1 parent 089d356 commit 128803b

File tree

2 files changed

+78
-6
lines changed

2 files changed

+78
-6
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,8 +277,12 @@ export class SkeletonQueryWizard {
277277
): Promise<DatabaseItem | undefined> {
278278
const dbItems = databaseItems || [];
279279
const dbs = dbItems.filter(
280-
(db) => db.language === language && db.name === databaseNwo,
280+
(db) =>
281+
db.language === language &&
282+
db.name === databaseNwo &&
283+
db.error === undefined,
281284
);
285+
282286
if (dbs.length === 0) {
283287
return undefined;
284288
}
@@ -290,7 +294,9 @@ export class SkeletonQueryWizard {
290294
databaseItems: readonly DatabaseItem[],
291295
): Promise<DatabaseItem | undefined> {
292296
const dbItems = databaseItems || [];
293-
const dbs = dbItems.filter((db) => db.language === language);
297+
const dbs = dbItems.filter(
298+
(db) => db.language === language && db.error === undefined,
299+
);
294300
if (dbs.length === 0) {
295301
return undefined;
296302
}

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

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
} from "../../../src/local-databases";
2121
import * as databaseFetcher from "../../../src/databaseFetcher";
2222
import { createMockDB } from "../../factories/databases/databases";
23+
import { asError } from "../../../src/pure/helpers-pure";
2324

2425
jest.setTimeout(40_000);
2526

@@ -366,17 +367,56 @@ describe("SkeletonQueryWizard", () => {
366367
describe("findDatabaseItemByNwo", () => {
367368
describe("when the item exists", () => {
368369
it("should return the database item", async () => {
369-
const mockDbItem = createMockDB(dir);
370-
const mockDbItem2 = createMockDB(dir);
370+
const mockDbItem = createMockDB(dir, {
371+
language: "ruby",
372+
dateAdded: 123,
373+
} as FullDatabaseOptions);
374+
const mockDbItem2 = createMockDB(dir, {
375+
language: "javascript",
376+
} as FullDatabaseOptions);
377+
378+
jest.spyOn(mockDbItem, "name", "get").mockReturnValue("mock-name");
371379

372380
const databaseItem = await wizard.findDatabaseItemByNwo(
373381
mockDbItem.language,
374382
mockDbItem.name,
375383
[mockDbItem, mockDbItem2],
376384
);
377385

378-
expect(databaseItem!.language).toEqual(mockDbItem.language);
379-
expect(databaseItem!.name).toEqual(mockDbItem.name);
386+
expect(JSON.stringify(databaseItem)).toEqual(
387+
JSON.stringify(mockDbItem),
388+
);
389+
});
390+
391+
it("should ignore databases with errors", async () => {
392+
const mockDbItem = createMockDB(dir, {
393+
language: "ruby",
394+
dateAdded: 123,
395+
} as FullDatabaseOptions);
396+
const mockDbItem2 = createMockDB(dir, {
397+
language: "javascript",
398+
} as FullDatabaseOptions);
399+
const mockDbItem3 = createMockDB(dir, {
400+
language: "ruby",
401+
dateAdded: 345,
402+
} as FullDatabaseOptions);
403+
404+
jest.spyOn(mockDbItem, "name", "get").mockReturnValue("mock-name");
405+
jest.spyOn(mockDbItem3, "name", "get").mockReturnValue(mockDbItem.name);
406+
407+
jest
408+
.spyOn(mockDbItem, "error", "get")
409+
.mockReturnValue(asError("database go boom!"));
410+
411+
const databaseItem = await wizard.findDatabaseItemByNwo(
412+
mockDbItem.language,
413+
mockDbItem.name,
414+
[mockDbItem, mockDbItem2, mockDbItem3],
415+
);
416+
417+
expect(JSON.stringify(databaseItem)).toEqual(
418+
JSON.stringify(mockDbItem3),
419+
);
380420
});
381421
});
382422

@@ -413,6 +453,32 @@ describe("SkeletonQueryWizard", () => {
413453

414454
expect(databaseItem).toEqual(mockDbItem);
415455
});
456+
457+
it("should ignore databases with errors", async () => {
458+
const mockDbItem = createMockDB(dir, {
459+
language: "ruby",
460+
} as FullDatabaseOptions);
461+
const mockDbItem2 = createMockDB(dir, {
462+
language: "javascript",
463+
} as FullDatabaseOptions);
464+
const mockDbItem3 = createMockDB(dir, {
465+
language: "ruby",
466+
} as FullDatabaseOptions);
467+
468+
jest
469+
.spyOn(mockDbItem, "error", "get")
470+
.mockReturnValue(asError("database go boom!"));
471+
472+
const databaseItem = await wizard.findDatabaseItemByLanguage("ruby", [
473+
mockDbItem,
474+
mockDbItem2,
475+
mockDbItem3,
476+
]);
477+
478+
expect(JSON.stringify(databaseItem)).toEqual(
479+
JSON.stringify(mockDbItem3),
480+
);
481+
});
416482
});
417483

418484
describe("when the item doesn't exist", () => {

0 commit comments

Comments
 (0)