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.
This commit is contained in:
Elena Tanasoiu
2023-04-14 16:51:16 +00:00
parent 561e07a689
commit 02dffe08d5
2 changed files with 88 additions and 20 deletions

View File

@@ -253,11 +253,18 @@ export class SkeletonQueryWizard {
}
private async selectOrDownloadDatabase() {
if (this.language === undefined) {
throw new Error("Language is undefined");
}
if (this.qlPackStoragePath === undefined) {
throw new Error("QL Pack storage path is undefined");
}
const existingDatabaseItem = await this.findExistingDatabaseItem();
const existingDatabaseItem = await this.findExistingDatabaseItem(
this.language,
this.databaseManager.databaseItems,
);
if (existingDatabaseItem) {
// select the found database
@@ -277,10 +284,7 @@ export class SkeletonQueryWizard {
(db) => db.language === language && db.name === databaseNwo,
);
if (dbs.length === 0) {
return undefined;
}
return dbs[0];
return dbs.pop();
}
public async findDatabaseItemByLanguage(
@@ -288,25 +292,20 @@ export class SkeletonQueryWizard {
databaseItems: readonly DatabaseItem[],
): Promise<DatabaseItem | undefined> {
const dbs = databaseItems.filter((db) => db.language === language);
if (dbs.length === 0) {
return undefined;
}
return dbs[0];
return dbs.pop();
}
private async findExistingDatabaseItem() {
if (this.language === undefined) {
throw new Error("Language is undefined");
}
public async findExistingDatabaseItem(
language: string,
databaseItems: readonly DatabaseItem[],
): Promise<DatabaseItem | undefined> {
const defaultDatabaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[language];
const defaultDatabaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language];
const dbItems = await this.sortDatabaseItemsByDateAdded(
this.databaseManager.databaseItems,
);
const dbItems = await this.sortDatabaseItemsByDateAdded(databaseItems);
const defaultDatabaseItem = await this.findDatabaseItemByNwo(
this.language,
language,
defaultDatabaseNwo,
dbItems,
);
@@ -315,7 +314,7 @@ export class SkeletonQueryWizard {
return defaultDatabaseItem;
}
return await this.findDatabaseItemByLanguage(this.language, dbItems);
return await this.findDatabaseItemByLanguage(language, dbItems);
}
public async sortDatabaseItemsByDateAdded(

View File

@@ -554,4 +554,73 @@ describe("SkeletonQueryWizard", () => {
});
});
});
describe("findExistingDatabaseItem", () => {
describe("when there are multiple items with the same name", () => {
it("should choose the latest one", async () => {
const mockDbItem = createMockDB(dir, {
language: "javascript",
dateAdded: 456,
} as FullDatabaseOptions);
const mockDbItem2 = createMockDB(dir, {
language: "ruby",
dateAdded: 789,
} as FullDatabaseOptions);
const mockDbItem3 = createMockDB(dir, {
language: "javascript",
dateAdded: 123,
} as FullDatabaseOptions);
const mockDbItem4 = createMockDB(dir, {
language: "javascript",
dateAdded: undefined,
} as FullDatabaseOptions);
jest
.spyOn(mockDbItem, "name", "get")
.mockReturnValue(QUERY_LANGUAGE_TO_DATABASE_REPO["javascript"]);
jest
.spyOn(mockDbItem2, "name", "get")
.mockReturnValue(QUERY_LANGUAGE_TO_DATABASE_REPO["javascript"]);
const databaseItem = await wizard.findExistingDatabaseItem(
"javascript",
[mockDbItem, mockDbItem2, mockDbItem3, mockDbItem4],
);
expect(JSON.stringify(databaseItem)).toEqual(
JSON.stringify(mockDbItem),
);
});
});
describe("when there are multiple items with the same language", () => {
it("should choose the latest one", async () => {
const mockDbItem = createMockDB(dir, {
language: "ruby",
dateAdded: 789,
} as FullDatabaseOptions);
const mockDbItem2 = createMockDB(dir, {
language: "javascript",
dateAdded: 456,
} as FullDatabaseOptions);
const mockDbItem3 = createMockDB(dir, {
language: "ruby",
dateAdded: 123,
} as FullDatabaseOptions);
const mockDbItem4 = createMockDB(dir, {
language: "javascript",
dateAdded: undefined,
} as FullDatabaseOptions);
const databaseItem = await wizard.findExistingDatabaseItem(
"javascript",
[mockDbItem, mockDbItem2, mockDbItem3, mockDbItem4],
);
expect(JSON.stringify(databaseItem)).toEqual(
JSON.stringify(mockDbItem2),
);
});
});
});
});