diff --git a/extensions/ql-vscode/src/skeleton-query-wizard.ts b/extensions/ql-vscode/src/skeleton-query-wizard.ts index baa3178f8..4ae9c973b 100644 --- a/extensions/ql-vscode/src/skeleton-query-wizard.ts +++ b/extensions/ql-vscode/src/skeleton-query-wizard.ts @@ -273,12 +273,8 @@ export class SkeletonQueryWizard { databaseNwo: string, databaseItems: readonly DatabaseItem[], ): Promise { - const dbItems = databaseItems || []; - const dbs = dbItems.filter( - (db) => - db.language === language && - db.name === databaseNwo && - db.error === undefined, + const dbs = databaseItems.filter( + (db) => db.language === language && db.name === databaseNwo, ); if (dbs.length === 0) { @@ -291,10 +287,7 @@ export class SkeletonQueryWizard { language: string, databaseItems: readonly DatabaseItem[], ): Promise { - const dbItems = databaseItems || []; - const dbs = dbItems.filter( - (db) => db.language === language && db.error === undefined, - ); + const dbs = databaseItems.filter((db) => db.language === language); if (dbs.length === 0) { return undefined; } @@ -308,19 +301,38 @@ export class SkeletonQueryWizard { const defaultDatabaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language]; + const dbItems = await this.sortDatabaseItemsByDateAdded( + this.databaseManager.databaseItems, + ); + const defaultDatabaseItem = await this.findDatabaseItemByNwo( this.language, defaultDatabaseNwo, - this.databaseManager.databaseItems, + dbItems, ); if (defaultDatabaseItem !== undefined) { return defaultDatabaseItem; } - return await this.findDatabaseItemByLanguage( - this.language, - this.databaseManager.databaseItems, - ); + return await this.findDatabaseItemByLanguage(this.language, dbItems); + } + + public async sortDatabaseItemsByDateAdded( + databaseItems: readonly DatabaseItem[], + ) { + const validDbItems = databaseItems.filter((db) => db.error === undefined); + + return validDbItems.sort((a, b) => { + if (a.dateAdded === undefined) { + return -1; + } + + if (b.dateAdded === undefined) { + return 1; + } + + return a.dateAdded - b.dateAdded; + }); } } 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 87fbbc1e5..511bc2e26 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 @@ -330,37 +330,6 @@ describe("SkeletonQueryWizard", () => { 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), - ); - }); }); describe("when the item doesn't exist", () => { @@ -396,32 +365,6 @@ 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", () => { @@ -550,4 +493,65 @@ describe("SkeletonQueryWizard", () => { }); }); }); + + describe("sortDatabaseItemsByDateAdded", () => { + describe("should return a sorted list", () => { + it("should sort the items by dateAdded", async () => { + const mockDbItem = createMockDB(dir, { + dateAdded: 678, + } as FullDatabaseOptions); + const mockDbItem2 = createMockDB(dir, { + dateAdded: 123, + } as FullDatabaseOptions); + const mockDbItem3 = createMockDB(dir, { + dateAdded: undefined, + } as FullDatabaseOptions); + const mockDbItem4 = createMockDB(dir, { + dateAdded: 345, + } as FullDatabaseOptions); + + const sortedList = await wizard.sortDatabaseItemsByDateAdded([ + mockDbItem, + mockDbItem2, + mockDbItem3, + mockDbItem4, + ]); + + expect(sortedList).toEqual([ + mockDbItem3, + mockDbItem2, + mockDbItem4, + mockDbItem, + ]); + }); + + it("should ignore databases with errors", async () => { + const mockDbItem = createMockDB(dir, { + dateAdded: 678, + } as FullDatabaseOptions); + const mockDbItem2 = createMockDB(dir, { + dateAdded: undefined, + } as FullDatabaseOptions); + const mockDbItem3 = createMockDB(dir, { + dateAdded: 345, + } as FullDatabaseOptions); + const mockDbItem4 = createMockDB(dir, { + dateAdded: 123, + } as FullDatabaseOptions); + + jest + .spyOn(mockDbItem, "error", "get") + .mockReturnValue(asError("database go boom!")); + + const sortedList = await wizard.sortDatabaseItemsByDateAdded([ + mockDbItem, + mockDbItem2, + mockDbItem3, + mockDbItem4, + ]); + + expect(sortedList).toEqual([mockDbItem2, mockDbItem4, mockDbItem3]); + }); + }); + }); });