If a folder that ends with `.testproj` is encountered, assume it is a database created by a codeql test. When the user wants to import this database, copy it into workspace storage. The database can be re-imported, which first removes the old version before importing it again.
108 lines
3.2 KiB
TypeScript
108 lines
3.2 KiB
TypeScript
import { join } from "path";
|
|
import { Uri, window } from "vscode";
|
|
|
|
import type { CodeQLCliServer } from "../../../../src/codeql-cli/cli";
|
|
import type { DatabaseManager } from "../../../../src/databases/local-databases";
|
|
import {
|
|
importLocalDatabase,
|
|
promptImportInternetDatabase,
|
|
} from "../../../../src/databases/database-fetcher";
|
|
import {
|
|
cleanDatabases,
|
|
dbLoc,
|
|
DB_URL,
|
|
getActivatedExtension,
|
|
storagePath,
|
|
testprojLoc,
|
|
} from "../../global.helper";
|
|
import { createMockCommandManager } from "../../../__mocks__/commandsMock";
|
|
import { remove } from "fs-extra";
|
|
|
|
/**
|
|
* Run various integration tests for databases
|
|
*/
|
|
describe("database-fetcher", () => {
|
|
let databaseManager: DatabaseManager;
|
|
let inputBoxStub: jest.SpiedFunction<typeof window.showInputBox>;
|
|
let cli: CodeQLCliServer;
|
|
const progressCallback = jest.fn();
|
|
|
|
beforeEach(async () => {
|
|
inputBoxStub = jest
|
|
.spyOn(window, "showInputBox")
|
|
.mockResolvedValue(undefined);
|
|
|
|
jest.spyOn(window, "showErrorMessage").mockResolvedValue(undefined);
|
|
jest.spyOn(window, "showInformationMessage").mockResolvedValue(undefined);
|
|
|
|
const extension = await getActivatedExtension();
|
|
databaseManager = extension.databaseManager;
|
|
cli = extension.cliServer;
|
|
|
|
await cleanDatabases(databaseManager);
|
|
});
|
|
|
|
afterEach(async () => {
|
|
await cleanDatabases(databaseManager);
|
|
await remove(storagePath);
|
|
});
|
|
|
|
describe("importLocalDatabase", () => {
|
|
it("should add a database from an archive", async () => {
|
|
const uri = Uri.file(dbLoc);
|
|
let dbItem = await importLocalDatabase(
|
|
createMockCommandManager(),
|
|
uri.toString(true),
|
|
databaseManager,
|
|
storagePath,
|
|
progressCallback,
|
|
cli,
|
|
);
|
|
expect(dbItem).toBe(databaseManager.currentDatabaseItem);
|
|
expect(dbItem).toBe(databaseManager.databaseItems[0]);
|
|
expect(dbItem).toBeDefined();
|
|
dbItem = dbItem!;
|
|
expect(dbItem.name).toBe("db");
|
|
expect(dbItem.databaseUri.fsPath).toBe(join(storagePath, "db", "db"));
|
|
});
|
|
|
|
it("should import a testproj database", async () => {
|
|
let dbItem = await importLocalDatabase(
|
|
createMockCommandManager(),
|
|
Uri.file(testprojLoc).toString(true),
|
|
databaseManager,
|
|
storagePath,
|
|
progressCallback,
|
|
cli,
|
|
);
|
|
expect(dbItem).toBe(databaseManager.currentDatabaseItem);
|
|
expect(dbItem).toBe(databaseManager.databaseItems[0]);
|
|
expect(dbItem).toBeDefined();
|
|
dbItem = dbItem!;
|
|
expect(dbItem.name).toBe("db");
|
|
expect(dbItem.databaseUri.fsPath).toBe(join(storagePath, "db", "db"));
|
|
});
|
|
});
|
|
|
|
describe("promptImportInternetDatabase", () => {
|
|
it("should add a database from a url", async () => {
|
|
// Provide a database URL when prompted
|
|
inputBoxStub.mockResolvedValue(DB_URL);
|
|
|
|
let dbItem = await promptImportInternetDatabase(
|
|
createMockCommandManager(),
|
|
databaseManager,
|
|
storagePath,
|
|
progressCallback,
|
|
cli,
|
|
);
|
|
expect(dbItem).toBeDefined();
|
|
dbItem = dbItem!;
|
|
expect(dbItem.name).toBe("db");
|
|
expect(dbItem.databaseUri.fsPath).toBe(
|
|
join(storagePath, "simple-db", "db"),
|
|
);
|
|
});
|
|
});
|
|
});
|