Files
vscode-codeql/extensions/ql-vscode/test/vscode-tests/cli-integration/databases/database-fetcher.test.ts
Andrew Eisenberg ca21ed18d0 Import testproj databases into workspace storage
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.
2024-02-25 18:39:41 -05:00

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"),
);
});
});
});