Skip to content

Commit ef330ce

Browse files
authored
Add tests (#855)
* Remove unused parameters from FolderElement * Add test to DragElement * Test destroy * Remove unused variable handleKeyDownHandler * Remove unused type * Test SelectNodeHandler * Test dataloader * Test dataloader
1 parent c28bc55 commit ef330ce

File tree

7 files changed

+153
-22
lines changed

7 files changed

+153
-22
lines changed

src/keyHandler.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import {
77
} from "./jqtreeMethodTypes";
88
import { Node } from "./node";
99

10-
type KeyboardEventHandler = (event: KeyboardEvent) => boolean;
11-
1210
interface KeyHandlerParams {
1311
closeNode: CloseNode;
1412
getSelectedNode: GetSelectedNode;
@@ -55,7 +53,6 @@ export default class KeyHandler {
5553
}
5654
};
5755

58-
private handleKeyDownHandler?: KeyboardEventHandler;
5956
private isFocusOnTree: IsFocusOnTree;
6057
private keyboardSupport: boolean;
6158
private openNode: OpenNode;
@@ -127,8 +124,8 @@ export default class KeyHandler {
127124
}
128125

129126
public deinit(): void {
130-
if (this.handleKeyDownHandler) {
131-
document.removeEventListener("keydown", this.handleKeyDownHandler);
127+
if (this.keyboardSupport) {
128+
document.removeEventListener("keydown", this.handleKeyDown);
132129
}
133130
}
134131

src/nodeElement/folderElement.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,7 @@ class FolderElement extends NodeElement {
4444
) as HTMLLinkElement;
4545
}
4646

47-
public close(
48-
slide = true,
49-
animationSpeed: JQuery.Duration | undefined = "fast",
50-
): void {
47+
public close(slide: boolean, animationSpeed: JQuery.Duration): void {
5148
if (!this.node.is_open) {
5249
return;
5350
}
@@ -86,8 +83,8 @@ class FolderElement extends NodeElement {
8683

8784
public open(
8885
onFinished: OnFinishOpenNode | undefined,
89-
slide = true,
90-
animationSpeed: JQuery.Duration = "fast",
86+
slide: boolean,
87+
animationSpeed: JQuery.Duration,
9188
): void {
9289
if (this.node.is_open) {
9390
return;

src/selectNodeHandler.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,14 @@ export default class SelectNodeHandler {
6464
return [];
6565
}
6666
} else {
67-
const selectedNodes = [];
68-
69-
for (const id in this.selectedNodes) {
70-
if (
71-
Object.prototype.hasOwnProperty.call(this.selectedNodes, id)
72-
) {
73-
const node = this.getNodeById(id);
74-
if (node && parent.isParentOf(node)) {
75-
selectedNodes.push(node);
76-
}
67+
const selectedNodes: Node[] = [];
68+
69+
this.selectedNodes.forEach((id) => {
70+
const node = this.getNodeById(id);
71+
if (node && parent.isParentOf(node)) {
72+
selectedNodes.push(node);
7773
}
78-
}
74+
});
7975

8076
return selectedNodes;
8177
}

src/test/dataLoader.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { waitFor } from "@testing-library/dom";
2+
import { http, HttpResponse } from "msw";
3+
import { setupServer } from "msw/node";
4+
5+
import DataLoader from "../dataLoader";
6+
7+
const server = setupServer();
8+
9+
afterAll(() => {
10+
server.close();
11+
});
12+
13+
afterEach(() => {
14+
server.resetHandlers();
15+
});
16+
17+
beforeAll(() => {
18+
server.listen();
19+
});
20+
21+
describe("loadFromUrl", () => {
22+
it("does nothing when urlInfo is empty", () => {
23+
const loadData = () => null;
24+
const treeElement = document.createElement("div");
25+
const triggerEvent = jest.fn();
26+
27+
const dataLoader = new DataLoader({
28+
loadData,
29+
treeElement,
30+
triggerEvent,
31+
});
32+
33+
dataLoader.loadFromUrl(null, null, null);
34+
expect(triggerEvent).not.toHaveBeenCalled();
35+
});
36+
37+
it("parses json when the response is a string", async () => {
38+
server.use(
39+
http.get(
40+
"/test",
41+
() =>
42+
new HttpResponse('{ "key1": "value1" }', {
43+
headers: {
44+
"Content-Type": "text/plain",
45+
},
46+
}),
47+
{},
48+
),
49+
);
50+
51+
const loadData = jest.fn();
52+
const treeElement = document.createElement("div");
53+
const triggerEvent = jest.fn();
54+
55+
const dataLoader = new DataLoader({
56+
loadData,
57+
treeElement,
58+
triggerEvent,
59+
});
60+
dataLoader.loadFromUrl({ dataType: "text", url: "/test" }, null, null);
61+
62+
await waitFor(() => {
63+
expect(loadData).toHaveBeenCalledWith({ key1: "value1" }, null);
64+
});
65+
});
66+
});
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import DragElement from "../../dragAndDropHandler/dragElement";
2+
3+
it("creates an element with autoEscape is true", () => {
4+
const treeElement = document.createElement("div");
5+
6+
new DragElement({
7+
autoEscape: true,
8+
nodeName: "abc & def",
9+
offsetX: 0,
10+
offsetY: 0,
11+
treeElement,
12+
});
13+
14+
expect(treeElement.children.length).toBe(1);
15+
16+
const childElement = treeElement.children[0];
17+
expect(childElement).toHaveClass("jqtree-title");
18+
expect(childElement).toHaveClass("jqtree-dragging");
19+
expect(childElement).toHaveTextContent("abc & def");
20+
});
21+
22+
it("creates an element with autoEscape is false", () => {
23+
const treeElement = document.createElement("div");
24+
25+
new DragElement({
26+
autoEscape: false,
27+
nodeName: "abc & def",
28+
offsetX: 0,
29+
offsetY: 0,
30+
treeElement,
31+
});
32+
33+
expect(treeElement.children.length).toBe(1);
34+
35+
const childElement = treeElement.children[0];
36+
expect(childElement).toHaveTextContent("abc & def");
37+
});

src/test/jqTree/methods.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,20 @@ describe("closeNode", () => {
300300
});
301301
});
302302

303+
describe("destroy", () => {
304+
it("clears the tree element", () => {
305+
const $tree = $("#tree1");
306+
307+
$tree.tree({
308+
data: exampleData,
309+
});
310+
311+
$tree.tree("destroy");
312+
313+
expect($tree.get(0)).toBeEmptyDOMElement();
314+
});
315+
});
316+
303317
describe("getNodeByCallback", () => {
304318
interface Vars {
305319
$tree: JQuery;

src/test/selectNodeHandler.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { Node } from "../node";
2+
import SelectNodeHandler from "../selectNodeHandler";
3+
4+
describe("getSelectedNodesUnder", () => {
5+
it("returns the nodes when the nodes have an id", () => {
6+
const node = new Node({ id: 1 });
7+
8+
const child = new Node({ id: 2 });
9+
node.addChild(child);
10+
11+
const nodeMap = new Map<NodeId, Node>();
12+
nodeMap.set(1, node);
13+
nodeMap.set(2, child);
14+
15+
const getNodeById = (id: NodeId) => nodeMap.get(id) ?? null;
16+
17+
const selectNodeHandler = new SelectNodeHandler({ getNodeById });
18+
selectNodeHandler.addToSelection(child);
19+
20+
expect(
21+
selectNodeHandler.getSelectedNodesUnder(node),
22+
).toIncludeAllMembers([child]);
23+
});
24+
});

0 commit comments

Comments
 (0)