Skip to content

Commit 02dffe0

Browse files
committed
Fetch the latest database from the new sorted list
And add tests to check this. I've had to adapt the existing `findExistingDatabaseItem` method so receive params so that I'm better able to send it a language and a list of database items.
1 parent 561e07a commit 02dffe0

File tree

2 files changed

+88
-20
lines changed

2 files changed

+88
-20
lines changed

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

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,18 @@ export class SkeletonQueryWizard {
253253
}
254254

255255
private async selectOrDownloadDatabase() {
256+
if (this.language === undefined) {
257+
throw new Error("Language is undefined");
258+
}
259+
256260
if (this.qlPackStoragePath === undefined) {
257261
throw new Error("QL Pack storage path is undefined");
258262
}
259263

260-
const existingDatabaseItem = await this.findExistingDatabaseItem();
264+
const existingDatabaseItem = await this.findExistingDatabaseItem(
265+
this.language,
266+
this.databaseManager.databaseItems,
267+
);
261268

262269
if (existingDatabaseItem) {
263270
// select the found database
@@ -277,36 +284,28 @@ export class SkeletonQueryWizard {
277284
(db) => db.language === language && db.name === databaseNwo,
278285
);
279286

280-
if (dbs.length === 0) {
281-
return undefined;
282-
}
283-
return dbs[0];
287+
return dbs.pop();
284288
}
285289

286290
public async findDatabaseItemByLanguage(
287291
language: string,
288292
databaseItems: readonly DatabaseItem[],
289293
): Promise<DatabaseItem | undefined> {
290294
const dbs = databaseItems.filter((db) => db.language === language);
291-
if (dbs.length === 0) {
292-
return undefined;
293-
}
294-
return dbs[0];
295-
}
296295

297-
private async findExistingDatabaseItem() {
298-
if (this.language === undefined) {
299-
throw new Error("Language is undefined");
300-
}
296+
return dbs.pop();
297+
}
301298

302-
const defaultDatabaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language];
299+
public async findExistingDatabaseItem(
300+
language: string,
301+
databaseItems: readonly DatabaseItem[],
302+
): Promise<DatabaseItem | undefined> {
303+
const defaultDatabaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[language];
303304

304-
const dbItems = await this.sortDatabaseItemsByDateAdded(
305-
this.databaseManager.databaseItems,
306-
);
305+
const dbItems = await this.sortDatabaseItemsByDateAdded(databaseItems);
307306

308307
const defaultDatabaseItem = await this.findDatabaseItemByNwo(
309-
this.language,
308+
language,
310309
defaultDatabaseNwo,
311310
dbItems,
312311
);
@@ -315,7 +314,7 @@ export class SkeletonQueryWizard {
315314
return defaultDatabaseItem;
316315
}
317316

318-
return await this.findDatabaseItemByLanguage(this.language, dbItems);
317+
return await this.findDatabaseItemByLanguage(language, dbItems);
319318
}
320319

321320
public async sortDatabaseItemsByDateAdded(

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

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,4 +554,73 @@ describe("SkeletonQueryWizard", () => {
554554
});
555555
});
556556
});
557+
558+
describe("findExistingDatabaseItem", () => {
559+
describe("when there are multiple items with the same name", () => {
560+
it("should choose the latest one", async () => {
561+
const mockDbItem = createMockDB(dir, {
562+
language: "javascript",
563+
dateAdded: 456,
564+
} as FullDatabaseOptions);
565+
const mockDbItem2 = createMockDB(dir, {
566+
language: "ruby",
567+
dateAdded: 789,
568+
} as FullDatabaseOptions);
569+
const mockDbItem3 = createMockDB(dir, {
570+
language: "javascript",
571+
dateAdded: 123,
572+
} as FullDatabaseOptions);
573+
const mockDbItem4 = createMockDB(dir, {
574+
language: "javascript",
575+
dateAdded: undefined,
576+
} as FullDatabaseOptions);
577+
578+
jest
579+
.spyOn(mockDbItem, "name", "get")
580+
.mockReturnValue(QUERY_LANGUAGE_TO_DATABASE_REPO["javascript"]);
581+
jest
582+
.spyOn(mockDbItem2, "name", "get")
583+
.mockReturnValue(QUERY_LANGUAGE_TO_DATABASE_REPO["javascript"]);
584+
585+
const databaseItem = await wizard.findExistingDatabaseItem(
586+
"javascript",
587+
[mockDbItem, mockDbItem2, mockDbItem3, mockDbItem4],
588+
);
589+
590+
expect(JSON.stringify(databaseItem)).toEqual(
591+
JSON.stringify(mockDbItem),
592+
);
593+
});
594+
});
595+
596+
describe("when there are multiple items with the same language", () => {
597+
it("should choose the latest one", async () => {
598+
const mockDbItem = createMockDB(dir, {
599+
language: "ruby",
600+
dateAdded: 789,
601+
} as FullDatabaseOptions);
602+
const mockDbItem2 = createMockDB(dir, {
603+
language: "javascript",
604+
dateAdded: 456,
605+
} as FullDatabaseOptions);
606+
const mockDbItem3 = createMockDB(dir, {
607+
language: "ruby",
608+
dateAdded: 123,
609+
} as FullDatabaseOptions);
610+
const mockDbItem4 = createMockDB(dir, {
611+
language: "javascript",
612+
dateAdded: undefined,
613+
} as FullDatabaseOptions);
614+
615+
const databaseItem = await wizard.findExistingDatabaseItem(
616+
"javascript",
617+
[mockDbItem, mockDbItem2, mockDbItem3, mockDbItem4],
618+
);
619+
620+
expect(JSON.stringify(databaseItem)).toEqual(
621+
JSON.stringify(mockDbItem2),
622+
);
623+
});
624+
});
625+
});
557626
});

0 commit comments

Comments
 (0)