Skip to content

Commit ff88a8d

Browse files
Merge pull request #2444 from github/robertbrignull/QueryTreeDataProvider-tests
Add tests of QueryTreeDataProvider
2 parents 5d7a723 + 27a8803 commit ff88a8d

3 files changed

Lines changed: 106 additions & 5 deletions

File tree

extensions/ql-vscode/src/queries-panel/query-discovery.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { App } from "../common/app";
77
import { FileTreeDirectory, FileTreeLeaf } from "../common/file-tree-nodes";
88
import { getOnDiskWorkspaceFoldersObjects } from "../helpers";
99
import { AppEventEmitter } from "../common/events";
10+
import { QueryDiscoverer } from "./query-tree-data-provider";
1011

1112
/**
1213
* The results of discovering queries.
@@ -28,7 +29,10 @@ interface QueryDiscoveryResults {
2829
/**
2930
* Discovers all query files contained in the QL packs in a given workspace folder.
3031
*/
31-
export class QueryDiscovery extends Discovery<QueryDiscoveryResults> {
32+
export class QueryDiscovery
33+
extends Discovery<QueryDiscoveryResults>
34+
implements QueryDiscoverer
35+
{
3236
private results: QueryDiscoveryResults | undefined;
3337

3438
private readonly onDidChangeQueriesEmitter: AppEventEmitter<void>;

extensions/ql-vscode/src/queries-panel/query-tree-data-provider.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import { Event, EventEmitter, TreeDataProvider, TreeItem } from "vscode";
22
import { QueryTreeViewItem } from "./query-tree-view-item";
33
import { DisposableObject } from "../pure/disposable-object";
4-
import { QueryDiscovery } from "./query-discovery";
54
import { FileTreeNode } from "../common/file-tree-nodes";
65

6+
export interface QueryDiscoverer {
7+
readonly queries: FileTreeNode[] | undefined;
8+
readonly onDidChangeQueries: Event<void>;
9+
}
10+
711
export class QueryTreeDataProvider
812
extends DisposableObject
913
implements TreeDataProvider<QueryTreeViewItem>
@@ -14,10 +18,10 @@ export class QueryTreeDataProvider
1418
new EventEmitter<void>(),
1519
);
1620

17-
public constructor(private readonly queryDiscovery: QueryDiscovery) {
21+
public constructor(private readonly queryDiscoverer: QueryDiscoverer) {
1822
super();
1923

20-
queryDiscovery.onDidChangeQueries(() => {
24+
queryDiscoverer.onDidChangeQueries(() => {
2125
this.queryTreeItems = this.createTree();
2226
this.onDidChangeTreeDataEmitter.fire();
2327
});
@@ -30,7 +34,7 @@ export class QueryTreeDataProvider
3034
}
3135

3236
private createTree(): QueryTreeViewItem[] {
33-
return (this.queryDiscovery.queries || []).map(
37+
return (this.queryDiscoverer.queries || []).map(
3438
this.convertFileTreeNode.bind(this),
3539
);
3640
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import { EventEmitter } from "vscode";
2+
import {
3+
FileTreeDirectory,
4+
FileTreeLeaf,
5+
} from "../../../../src/common/file-tree-nodes";
6+
import {
7+
QueryDiscoverer,
8+
QueryTreeDataProvider,
9+
} from "../../../../src/queries-panel/query-tree-data-provider";
10+
11+
describe("QueryTreeDataProvider", () => {
12+
describe("getChildren", () => {
13+
it("returns no children when queries is undefined", async () => {
14+
const dataProvider = new QueryTreeDataProvider({
15+
queries: undefined,
16+
onDidChangeQueries: jest.fn(),
17+
});
18+
19+
expect(dataProvider.getChildren()).toEqual([]);
20+
});
21+
22+
it("returns no children when there are no queries", async () => {
23+
const dataProvider = new QueryTreeDataProvider({
24+
queries: [],
25+
onDidChangeQueries: jest.fn(),
26+
});
27+
28+
expect(dataProvider.getChildren()).toEqual([]);
29+
});
30+
31+
it("converts FileTreeNode to QueryTreeViewItem", async () => {
32+
const dataProvider = new QueryTreeDataProvider({
33+
queries: [
34+
new FileTreeDirectory("dir1", "dir1", [
35+
new FileTreeDirectory("dir1/dir2", "dir2", [
36+
new FileTreeLeaf("dir1/dir2/file1", "file1"),
37+
new FileTreeLeaf("dir1/dir2/file1", "file2"),
38+
]),
39+
]),
40+
new FileTreeDirectory("dir3", "dir3", [
41+
new FileTreeLeaf("dir3/file3", "file3"),
42+
]),
43+
],
44+
onDidChangeQueries: jest.fn(),
45+
});
46+
47+
expect(dataProvider.getChildren().length).toEqual(2);
48+
49+
expect(dataProvider.getChildren()[0].label).toEqual("dir1");
50+
expect(dataProvider.getChildren()[0].children.length).toEqual(1);
51+
expect(dataProvider.getChildren()[0].children[0].label).toEqual("dir2");
52+
expect(dataProvider.getChildren()[0].children[0].children.length).toEqual(
53+
2,
54+
);
55+
expect(
56+
dataProvider.getChildren()[0].children[0].children[0].label,
57+
).toEqual("file1");
58+
expect(
59+
dataProvider.getChildren()[0].children[0].children[1].label,
60+
).toEqual("file2");
61+
62+
expect(dataProvider.getChildren()[1].label).toEqual("dir3");
63+
expect(dataProvider.getChildren()[1].children.length).toEqual(1);
64+
expect(dataProvider.getChildren()[1].children[0].label).toEqual("file3");
65+
});
66+
});
67+
68+
describe("onDidChangeQueries", () => {
69+
it("should update tree when the queries change", async () => {
70+
const onDidChangeQueriesEmitter = new EventEmitter<void>();
71+
const queryDiscoverer: QueryDiscoverer = {
72+
queries: [
73+
new FileTreeDirectory("dir1", "dir1", [
74+
new FileTreeLeaf("dir1/file1", "file1"),
75+
]),
76+
],
77+
onDidChangeQueries: onDidChangeQueriesEmitter.event,
78+
};
79+
80+
const dataProvider = new QueryTreeDataProvider(queryDiscoverer);
81+
expect(dataProvider.getChildren().length).toEqual(1);
82+
83+
queryDiscoverer.queries?.push(
84+
new FileTreeDirectory("dir2", "dir2", [
85+
new FileTreeLeaf("dir2/file2", "file2"),
86+
]),
87+
);
88+
onDidChangeQueriesEmitter.fire();
89+
90+
expect(dataProvider.getChildren().length).toEqual(2);
91+
});
92+
});
93+
});

0 commit comments

Comments
 (0)