Skip to content

Commit 422f6de

Browse files
authored
Merge pull request #2735 from github/nora/test-model-details-view
Add tests for Model Details View
2 parents ee88ea1 + 0daa06b commit 422f6de

3 files changed

Lines changed: 181 additions & 6 deletions

File tree

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import {
2+
Usage,
3+
ExternalApiUsage,
4+
CallClassification,
5+
} from "../../../src/data-extensions-editor/external-api-usage";
6+
import { ModeledMethodType } from "../../../src/data-extensions-editor/modeled-method";
7+
import { ResolvableLocationValue } from "../../../src/common/bqrs-cli-types";
8+
9+
export function createExternalApiUsage({
10+
library = "test",
11+
supported = true,
12+
supportedType = "none" as ModeledMethodType,
13+
usages = [],
14+
signature = "test",
15+
packageName = "test",
16+
typeName = "test",
17+
methodName = "test",
18+
methodParameters = "test",
19+
}: {
20+
library?: string;
21+
supported?: boolean;
22+
supportedType?: ModeledMethodType;
23+
usages?: Usage[];
24+
signature?: string;
25+
packageName?: string;
26+
typeName?: string;
27+
methodName?: string;
28+
methodParameters?: string;
29+
} = {}): ExternalApiUsage {
30+
return {
31+
library,
32+
supported,
33+
supportedType,
34+
usages,
35+
signature,
36+
packageName,
37+
typeName,
38+
methodName,
39+
methodParameters,
40+
};
41+
}
42+
43+
export function createUsage({
44+
classification = CallClassification.Unknown,
45+
label = "test",
46+
url = {} as ResolvableLocationValue,
47+
}: {
48+
classification?: CallClassification;
49+
label?: string;
50+
url?: ResolvableLocationValue;
51+
} = {}): Usage {
52+
return {
53+
classification,
54+
label,
55+
url,
56+
};
57+
}

extensions/ql-vscode/test/vscode-tests/no-workspace/data-extensions-editor/model-details/model-details-data-provider.test.ts

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,28 @@ import { CodeQLCliServer } from "../../../../../src/codeql-cli/cli";
22
import { ExternalApiUsage } from "../../../../../src/data-extensions-editor/external-api-usage";
33
import { ModelDetailsDataProvider } from "../../../../../src/data-extensions-editor/model-details/model-details-data-provider";
44
import { DatabaseItem } from "../../../../../src/databases/local-databases";
5+
import {
6+
createExternalApiUsage,
7+
createUsage,
8+
} from "../../../../factories/data-extension/external-api-factories";
59
import { mockedObject } from "../../../utils/mocking.helpers";
610

711
describe("ModelDetailsDataProvider", () => {
812
const mockCliServer = mockedObject<CodeQLCliServer>({});
13+
let dataProvider: ModelDetailsDataProvider;
14+
15+
beforeEach(() => {
16+
dataProvider = new ModelDetailsDataProvider(mockCliServer);
17+
});
918

1019
describe("setState", () => {
11-
const hideModeledApis: boolean = false;
20+
const hideModeledApis = false;
1221
const externalApiUsages: ExternalApiUsage[] = [];
1322
const dbItem = mockedObject<DatabaseItem>({
1423
getSourceLocationPrefix: () => "test",
1524
});
1625

1726
it("should not emit onDidChangeTreeData event when state has not changed", async () => {
18-
const dataProvider = new ModelDetailsDataProvider(mockCliServer);
1927
await dataProvider.setState(externalApiUsages, dbItem, hideModeledApis);
2028

2129
const onDidChangeTreeDataListener = jest.fn();
@@ -29,7 +37,6 @@ describe("ModelDetailsDataProvider", () => {
2937
it("should emit onDidChangeTreeData event when externalApiUsages has changed", async () => {
3038
const externalApiUsages2: ExternalApiUsage[] = [];
3139

32-
const dataProvider = new ModelDetailsDataProvider(mockCliServer);
3340
await dataProvider.setState(externalApiUsages, dbItem, hideModeledApis);
3441

3542
const onDidChangeTreeDataListener = jest.fn();
@@ -45,7 +52,6 @@ describe("ModelDetailsDataProvider", () => {
4552
getSourceLocationPrefix: () => "test",
4653
});
4754

48-
const dataProvider = new ModelDetailsDataProvider(mockCliServer);
4955
await dataProvider.setState(externalApiUsages, dbItem, hideModeledApis);
5056

5157
const onDidChangeTreeDataListener = jest.fn();
@@ -57,7 +63,6 @@ describe("ModelDetailsDataProvider", () => {
5763
});
5864

5965
it("should emit onDidChangeTreeData event when hideModeledApis has changed", async () => {
60-
const dataProvider = new ModelDetailsDataProvider(mockCliServer);
6166
await dataProvider.setState(externalApiUsages, dbItem, hideModeledApis);
6267

6368
const onDidChangeTreeDataListener = jest.fn();
@@ -74,7 +79,6 @@ describe("ModelDetailsDataProvider", () => {
7479
});
7580
const externalApiUsages2: ExternalApiUsage[] = [];
7681

77-
const dataProvider = new ModelDetailsDataProvider(mockCliServer);
7882
await dataProvider.setState(externalApiUsages, dbItem, hideModeledApis);
7983

8084
const onDidChangeTreeDataListener = jest.fn();
@@ -89,4 +93,45 @@ describe("ModelDetailsDataProvider", () => {
8993
expect(onDidChangeTreeDataListener).toHaveBeenCalledTimes(1);
9094
});
9195
});
96+
97+
describe("getChildren", () => {
98+
const supportedExternalApiUsage = createExternalApiUsage({
99+
supported: true,
100+
});
101+
102+
const unsupportedExternalApiUsage = createExternalApiUsage({
103+
supported: false,
104+
});
105+
106+
const externalApiUsages: ExternalApiUsage[] = [
107+
supportedExternalApiUsage,
108+
unsupportedExternalApiUsage,
109+
];
110+
const dbItem = mockedObject<DatabaseItem>({
111+
getSourceLocationPrefix: () => "test",
112+
});
113+
114+
const usage = createUsage({});
115+
116+
it("should return [] if item is a usage", async () => {
117+
expect(dataProvider.getChildren(usage)).toEqual([]);
118+
});
119+
120+
it("should return usages if item is external api usage", async () => {
121+
const externalApiUsage = createExternalApiUsage({ usages: [usage] });
122+
expect(dataProvider.getChildren(externalApiUsage)).toEqual([usage]);
123+
});
124+
125+
it("should show all externalApiUsages if hideModeledApis is false and looking at the root", async () => {
126+
const hideModeledApis = false;
127+
await dataProvider.setState(externalApiUsages, dbItem, hideModeledApis);
128+
expect(dataProvider.getChildren().length).toEqual(2);
129+
});
130+
131+
it("should filter externalApiUsages if hideModeledApis is true and looking at the root", async () => {
132+
const hideModeledApis = true;
133+
await dataProvider.setState(externalApiUsages, dbItem, hideModeledApis);
134+
expect(dataProvider.getChildren().length).toEqual(1);
135+
});
136+
});
92137
});
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { window, TreeView } from "vscode";
2+
import { CodeQLCliServer } from "../../../../../src/codeql-cli/cli";
3+
import { ExternalApiUsage } from "../../../../../src/data-extensions-editor/external-api-usage";
4+
import { ModelDetailsPanel } from "../../../../../src/data-extensions-editor/model-details/model-details-panel";
5+
import { DatabaseItem } from "../../../../../src/databases/local-databases";
6+
import { mockedObject } from "../../../utils/mocking.helpers";
7+
import {
8+
createExternalApiUsage,
9+
createUsage,
10+
} from "../../../../factories/data-extension/external-api-factories";
11+
12+
describe("ModelDetailsPanel", () => {
13+
const mockCliServer = mockedObject<CodeQLCliServer>({});
14+
const dbItem = mockedObject<DatabaseItem>({
15+
getSourceLocationPrefix: () => "test",
16+
});
17+
18+
describe("setState", () => {
19+
const hideModeledApis = false;
20+
const externalApiUsages: ExternalApiUsage[] = [createExternalApiUsage()];
21+
22+
it("should update the tree view with the correct batch number", async () => {
23+
const mockTreeView = {
24+
badge: undefined,
25+
} as TreeView<unknown>;
26+
jest.spyOn(window, "createTreeView").mockReturnValue(mockTreeView);
27+
28+
const panel = new ModelDetailsPanel(mockCliServer);
29+
await panel.setState(externalApiUsages, dbItem, hideModeledApis);
30+
31+
expect(mockTreeView.badge?.value).toBe(1);
32+
});
33+
});
34+
35+
describe("revealItem", () => {
36+
let mockTreeView: TreeView<unknown>;
37+
38+
const hideModeledApis: boolean = false;
39+
const usage = createUsage();
40+
41+
beforeEach(() => {
42+
mockTreeView = {
43+
reveal: jest.fn(),
44+
} as unknown as TreeView<unknown>;
45+
jest.spyOn(window, "createTreeView").mockReturnValue(mockTreeView);
46+
});
47+
48+
it("should reveal the correct item in the tree view", async () => {
49+
const externalApiUsages = [
50+
createExternalApiUsage({
51+
usages: [usage],
52+
}),
53+
];
54+
55+
const panel = new ModelDetailsPanel(mockCliServer);
56+
await panel.setState(externalApiUsages, dbItem, hideModeledApis);
57+
58+
await panel.revealItem(usage);
59+
60+
expect(mockTreeView.reveal).toHaveBeenCalledWith(usage);
61+
});
62+
63+
it("should do nothing if usage cannot be found", async () => {
64+
const externalApiUsages = [createExternalApiUsage({})];
65+
const panel = new ModelDetailsPanel(mockCliServer);
66+
await panel.setState(externalApiUsages, dbItem, hideModeledApis);
67+
68+
await panel.revealItem(usage);
69+
70+
expect(mockTreeView.reveal).not.toHaveBeenCalled();
71+
});
72+
});
73+
});

0 commit comments

Comments
 (0)