Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import { load } from "js-yaml";

import { AstViewer, AstItem } from "../../../src/astViewer";
import { commands, Range, Uri } from "vscode";
import { DatabaseItem } from "../../../src/local-databases";
import { testDisposeHandler } from "../test-dispose-handler";
import { mockDatabaseItem } from "../utils/mocking.helpers";

describe("AstViewer", () => {
let astRoots: AstItem[];
Expand All @@ -31,7 +31,7 @@ describe("AstViewer", () => {
});

it("should update the viewer roots", () => {
const item = {} as DatabaseItem;
const item = mockDatabaseItem();
viewer = new AstViewer();
viewer.updateRoots(astRoots, item, Uri.file("def/abc"));

Expand Down Expand Up @@ -71,7 +71,7 @@ describe("AstViewer", () => {
selectionRange: Range | undefined,
fileUri = defaultUri,
) {
const item = {} as DatabaseItem;
const item = mockDatabaseItem();
viewer = new AstViewer();
viewer.updateRoots(astRoots, item, defaultUri);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ import { readFileSync } from "fs-extra";

import AstBuilder from "../../../../src/contextual/astBuilder";
import { CodeQLCliServer } from "../../../../src/cli";
import { DatabaseItem } from "../../../../src/local-databases";
import { Uri } from "vscode";
import { QueryWithResults } from "../../../../src/run-queries-shared";
import { mockedObject } from "../../utils/mocking.helpers";
import { mockDatabaseItem, mockedObject } from "../../utils/mocking.helpers";

/**
*
Expand Down Expand Up @@ -146,7 +145,9 @@ describe("AstBuilder", () => {
},
} as QueryWithResults,
mockCli,
{} as DatabaseItem,
mockDatabaseItem({
resolveSourceFile: undefined,
}),
Uri.file(""),
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
WholeFileLocation,
LineColumnLocation,
} from "../../../../src/pure/bqrs-cli-types";
import { mockDatabaseItem } from "../../utils/mocking.helpers";

describe("fileRangeFromURI", () => {
it("should return undefined when value is not a file URI", () => {
Expand Down Expand Up @@ -92,8 +93,8 @@ describe("fileRangeFromURI", () => {
});

function createMockDatabaseItem(): DatabaseItem {
return {
return mockDatabaseItem({
resolveSourceFile: (file: string) => Uri.parse(file),
} as DatabaseItem;
});
}
});
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ import {
resolveQueries,
} from "../../../../src/contextual/queryResolver";
import { CodeQLCliServer } from "../../../../src/cli";
import { DatabaseItem } from "../../../../src/local-databases";
import { mockedObject } from "../../utils/mocking.helpers";
import { mockDatabaseItem, mockedObject } from "../../utils/mocking.helpers";

describe("queryResolver", () => {
let getQlPackForDbschemeSpy: jest.SpiedFunction<
Expand Down Expand Up @@ -96,13 +95,13 @@ describe("queryResolver", () => {
dbschemePack: "my-qlpack",
dbschemePackIsLibraryPack: false,
});
const db = {
const db = mockDatabaseItem({
contents: {
datasetUri: {
fsPath: "/path/to/database",
},
},
} as unknown as DatabaseItem;
});
const result = await qlpackOfDatabase(mockCli, db);
expect(result).toEqual({
dbschemePack: "my-qlpack",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
tryResolveLocation,
} from "../../../src/interface-utils";
import { getDefaultResultSetName } from "../../../src/pure/interface-types";
import { DatabaseItem } from "../../../src/local-databases";
import { mockDatabaseItem } from "../utils/mocking.helpers";

describe("interface-utils", () => {
describe("webview uri conversion", () => {
Expand Down Expand Up @@ -84,27 +84,21 @@ describe("interface-utils", () => {

describe("resolveWholeFileLocation", () => {
it("should resolve a whole file location", () => {
const mockDatabaseItem: DatabaseItem = {
resolveSourceFile: jest.fn().mockReturnValue(Uri.file("abc")),
} as unknown as DatabaseItem;
const databaseItem = mockDatabaseItem();
expect(
tryResolveLocation("file://hucairz:0:0:0:0", mockDatabaseItem),
tryResolveLocation("file://hucairz:0:0:0:0", databaseItem),
).toEqual(new Location(Uri.file("abc"), new Range(0, 0, 0, 0)));
});

it("should resolve a five-part location edge case", () => {
const mockDatabaseItem: DatabaseItem = {
resolveSourceFile: jest.fn().mockReturnValue(Uri.file("abc")),
} as unknown as DatabaseItem;
const databaseItem = mockDatabaseItem();
expect(
tryResolveLocation("file://hucairz:1:1:1:1", mockDatabaseItem),
tryResolveLocation("file://hucairz:1:1:1:1", databaseItem),
).toEqual(new Location(Uri.file("abc"), new Range(0, 0, 0, 1)));
});

it("should resolve a five-part location", () => {
const mockDatabaseItem: DatabaseItem = {
resolveSourceFile: jest.fn().mockReturnValue(Uri.parse("abc")),
} as unknown as DatabaseItem;
const databaseItem = mockDatabaseItem();

expect(
tryResolveLocation(
Expand All @@ -115,24 +109,20 @@ describe("interface-utils", () => {
endLine: 5,
uri: "hucairz",
},
mockDatabaseItem,
databaseItem,
),
).toEqual(
new Location(
Uri.parse("abc"),
new Range(new Position(4, 3), new Position(3, 0)),
),
);
expect(mockDatabaseItem.resolveSourceFile).toHaveBeenCalledTimes(1);
expect(mockDatabaseItem.resolveSourceFile).toHaveBeenCalledWith(
"hucairz",
);
expect(databaseItem.resolveSourceFile).toHaveBeenCalledTimes(1);
expect(databaseItem.resolveSourceFile).toHaveBeenCalledWith("hucairz");
});

it("should resolve a five-part location with an empty path", () => {
const mockDatabaseItem: DatabaseItem = {
resolveSourceFile: jest.fn().mockReturnValue(Uri.parse("abc")),
} as unknown as DatabaseItem;
const databaseItem = mockDatabaseItem();

expect(
tryResolveLocation(
Expand All @@ -143,51 +133,41 @@ describe("interface-utils", () => {
endLine: 5,
uri: "",
},
mockDatabaseItem,
databaseItem,
),
).toBeUndefined();
});

it("should resolve a string location for whole file", () => {
const mockDatabaseItem: DatabaseItem = {
resolveSourceFile: jest.fn().mockReturnValue(Uri.parse("abc")),
} as unknown as DatabaseItem;
const databaseItem = mockDatabaseItem();

expect(
tryResolveLocation("file://hucairz:0:0:0:0", mockDatabaseItem),
tryResolveLocation("file://hucairz:0:0:0:0", databaseItem),
).toEqual(new Location(Uri.parse("abc"), new Range(0, 0, 0, 0)));
expect(mockDatabaseItem.resolveSourceFile).toHaveBeenCalledTimes(1);
expect(mockDatabaseItem.resolveSourceFile).toHaveBeenCalledWith(
"hucairz",
);
expect(databaseItem.resolveSourceFile).toHaveBeenCalledTimes(1);
expect(databaseItem.resolveSourceFile).toHaveBeenCalledWith("hucairz");
});

it("should resolve a string location for five-part location", () => {
const mockDatabaseItem: DatabaseItem = {
resolveSourceFile: jest.fn().mockReturnValue(Uri.parse("abc")),
} as unknown as DatabaseItem;
const databaseItem = mockDatabaseItem();

expect(
tryResolveLocation("file://hucairz:5:4:3:2", mockDatabaseItem),
tryResolveLocation("file://hucairz:5:4:3:2", databaseItem),
).toEqual(
new Location(
Uri.parse("abc"),
new Range(new Position(4, 3), new Position(2, 2)),
),
);
expect(mockDatabaseItem.resolveSourceFile).toHaveBeenCalledTimes(1);
expect(mockDatabaseItem.resolveSourceFile).toHaveBeenCalledWith(
"hucairz",
);
expect(databaseItem.resolveSourceFile).toHaveBeenCalledTimes(1);
expect(databaseItem.resolveSourceFile).toHaveBeenCalledWith("hucairz");
});

it("should resolve a string location for invalid string", () => {
const mockDatabaseItem: DatabaseItem = {
resolveSourceFile: jest.fn().mockReturnValue(Uri.parse("abc")),
} as unknown as DatabaseItem;
const databaseItem = mockDatabaseItem();

expect(
tryResolveLocation("file://hucairz:x:y:z:a", mockDatabaseItem),
tryResolveLocation("file://hucairz:x:y:z:a", databaseItem),
).toBeUndefined();
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,15 @@ describe("test-adapter", () => {
const preTestDatabaseItem = new DatabaseItemImpl(
Uri.file("/path/to/test/dir/dir.testproj"),
undefined,
{ displayName: "custom display name" } as unknown as FullDatabaseOptions,
mockedObject<FullDatabaseOptions>({ displayName: "custom display name" }),
(_) => {
/* no change event listener */
},
);
const postTestDatabaseItem = new DatabaseItemImpl(
Uri.file("/path/to/test/dir/dir.testproj"),
undefined,
{ displayName: "default name" } as unknown as FullDatabaseOptions,
mockedObject<FullDatabaseOptions>({ displayName: "default name" }),
(_) => {
/* no change event listener */
},
Expand Down
16 changes: 16 additions & 0 deletions extensions/ql-vscode/test/vscode-tests/utils/mocking.helpers.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import { DatabaseItem } from "../../../src/local-databases";
import { Uri } from "vscode";

export type DeepPartial<T> = T extends object
? {
[P in keyof T]?: DeepPartial<T[P]>;
Expand Down Expand Up @@ -41,3 +44,16 @@ export function mockedObject<T extends object>(
},
});
}

export function mockDatabaseItem(
props: DeepPartial<DatabaseItem> = {},
): DatabaseItem {
return mockedObject<DatabaseItem>({
databaseUri: Uri.file("abc"),
name: "github/codeql",
language: "javascript",
sourceArchive: undefined,
resolveSourceFile: jest.fn().mockReturnValue(Uri.file("abc")),
...props,
});
}