Merge pull request #2444 from github/robertbrignull/QueryTreeDataProvider-tests

Add tests of QueryTreeDataProvider
This commit is contained in:
Robert
2023-05-24 16:25:08 +01:00
committed by GitHub
3 changed files with 106 additions and 5 deletions

View File

@@ -7,6 +7,7 @@ import { App } from "../common/app";
import { FileTreeDirectory, FileTreeLeaf } from "../common/file-tree-nodes";
import { getOnDiskWorkspaceFoldersObjects } from "../helpers";
import { AppEventEmitter } from "../common/events";
import { QueryDiscoverer } from "./query-tree-data-provider";
/**
* The results of discovering queries.
@@ -28,7 +29,10 @@ interface QueryDiscoveryResults {
/**
* Discovers all query files contained in the QL packs in a given workspace folder.
*/
export class QueryDiscovery extends Discovery<QueryDiscoveryResults> {
export class QueryDiscovery
extends Discovery<QueryDiscoveryResults>
implements QueryDiscoverer
{
private results: QueryDiscoveryResults | undefined;
private readonly onDidChangeQueriesEmitter: AppEventEmitter<void>;

View File

@@ -1,9 +1,13 @@
import { Event, EventEmitter, TreeDataProvider, TreeItem } from "vscode";
import { QueryTreeViewItem } from "./query-tree-view-item";
import { DisposableObject } from "../pure/disposable-object";
import { QueryDiscovery } from "./query-discovery";
import { FileTreeNode } from "../common/file-tree-nodes";
export interface QueryDiscoverer {
readonly queries: FileTreeNode[] | undefined;
readonly onDidChangeQueries: Event<void>;
}
export class QueryTreeDataProvider
extends DisposableObject
implements TreeDataProvider<QueryTreeViewItem>
@@ -14,10 +18,10 @@ export class QueryTreeDataProvider
new EventEmitter<void>(),
);
public constructor(private readonly queryDiscovery: QueryDiscovery) {
public constructor(private readonly queryDiscoverer: QueryDiscoverer) {
super();
queryDiscovery.onDidChangeQueries(() => {
queryDiscoverer.onDidChangeQueries(() => {
this.queryTreeItems = this.createTree();
this.onDidChangeTreeDataEmitter.fire();
});
@@ -30,7 +34,7 @@ export class QueryTreeDataProvider
}
private createTree(): QueryTreeViewItem[] {
return (this.queryDiscovery.queries || []).map(
return (this.queryDiscoverer.queries || []).map(
this.convertFileTreeNode.bind(this),
);
}

View File

@@ -0,0 +1,93 @@
import { EventEmitter } from "vscode";
import {
FileTreeDirectory,
FileTreeLeaf,
} from "../../../../src/common/file-tree-nodes";
import {
QueryDiscoverer,
QueryTreeDataProvider,
} from "../../../../src/queries-panel/query-tree-data-provider";
describe("QueryTreeDataProvider", () => {
describe("getChildren", () => {
it("returns no children when queries is undefined", async () => {
const dataProvider = new QueryTreeDataProvider({
queries: undefined,
onDidChangeQueries: jest.fn(),
});
expect(dataProvider.getChildren()).toEqual([]);
});
it("returns no children when there are no queries", async () => {
const dataProvider = new QueryTreeDataProvider({
queries: [],
onDidChangeQueries: jest.fn(),
});
expect(dataProvider.getChildren()).toEqual([]);
});
it("converts FileTreeNode to QueryTreeViewItem", async () => {
const dataProvider = new QueryTreeDataProvider({
queries: [
new FileTreeDirectory("dir1", "dir1", [
new FileTreeDirectory("dir1/dir2", "dir2", [
new FileTreeLeaf("dir1/dir2/file1", "file1"),
new FileTreeLeaf("dir1/dir2/file1", "file2"),
]),
]),
new FileTreeDirectory("dir3", "dir3", [
new FileTreeLeaf("dir3/file3", "file3"),
]),
],
onDidChangeQueries: jest.fn(),
});
expect(dataProvider.getChildren().length).toEqual(2);
expect(dataProvider.getChildren()[0].label).toEqual("dir1");
expect(dataProvider.getChildren()[0].children.length).toEqual(1);
expect(dataProvider.getChildren()[0].children[0].label).toEqual("dir2");
expect(dataProvider.getChildren()[0].children[0].children.length).toEqual(
2,
);
expect(
dataProvider.getChildren()[0].children[0].children[0].label,
).toEqual("file1");
expect(
dataProvider.getChildren()[0].children[0].children[1].label,
).toEqual("file2");
expect(dataProvider.getChildren()[1].label).toEqual("dir3");
expect(dataProvider.getChildren()[1].children.length).toEqual(1);
expect(dataProvider.getChildren()[1].children[0].label).toEqual("file3");
});
});
describe("onDidChangeQueries", () => {
it("should update tree when the queries change", async () => {
const onDidChangeQueriesEmitter = new EventEmitter<void>();
const queryDiscoverer: QueryDiscoverer = {
queries: [
new FileTreeDirectory("dir1", "dir1", [
new FileTreeLeaf("dir1/file1", "file1"),
]),
],
onDidChangeQueries: onDidChangeQueriesEmitter.event,
};
const dataProvider = new QueryTreeDataProvider(queryDiscoverer);
expect(dataProvider.getChildren().length).toEqual(1);
queryDiscoverer.queries?.push(
new FileTreeDirectory("dir2", "dir2", [
new FileTreeLeaf("dir2/file2", "file2"),
]),
);
onDidChangeQueriesEmitter.fire();
expect(dataProvider.getChildren().length).toEqual(2);
});
});
});