Skip to content

Commit b6af0cc

Browse files
test: fix unit tests related to add instance button
1 parent 11e3862 commit b6af0cc

3 files changed

Lines changed: 140 additions & 37 deletions

File tree

src/visualBuilder/components/__test__/addInstanceButton.test.tsx

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import React from "preact/compat";
12
import {
23
act,
34
cleanup,
@@ -7,6 +8,21 @@ import {
78
} from "@testing-library/preact";
89
import { singleLineFieldSchema } from "../../../__test__/data/fields";
910
import AddInstanceButtonComponent from "../addInstanceButton";
11+
import visualBuilderPostMessageActual from "../../utils/visualBuilderPostMessage";
12+
import { getDiscussionIdByFieldMetaData } from "../../utils/getDiscussionIdByFieldMetaData";
13+
14+
const visualBuilderPostMessage = vi.mocked(visualBuilderPostMessageActual);
15+
16+
vi.mock("../../utils/visualBuilderPostMessage", async () => {
17+
return {
18+
default: {
19+
send: vi.fn().mockImplementation((_eventName: string) => {
20+
return Promise.resolve({});
21+
}),
22+
on: vi.fn(),
23+
},
24+
};
25+
});
1026

1127
describe("AddInstanceButtonComponent", () => {
1228
afterEach(cleanup);
@@ -18,10 +34,16 @@ describe("AddInstanceButtonComponent", () => {
1834
<AddInstanceButtonComponent
1935
value={[]}
2036
fieldSchema={singleLineFieldSchema}
37+
// @ts-expect-error mocking fieldMetadata
38+
fieldMetadata={{}}
39+
index={0}
2140
onClick={onClickCallback}
41+
label="Add instance"
42+
// @ts-expect-error mocking signal
43+
loading={{ value: false }}
2244
/>
2345
);
24-
})
46+
});
2547
const buttonElement = getByTestId(
2648
document.body,
2749
"visual-builder-add-instance-button"
@@ -33,22 +55,63 @@ describe("AddInstanceButtonComponent", () => {
3355
expect(buttonElement.querySelector("path")).toBeTruthy();
3456
});
3557

36-
test("calls onClickCallback when button is clicked", async () => {
58+
test("sends add-instance message when clicked", async () => {
3759
const onClickCallback = vi.fn();
3860
await act(() => {
3961
render(
4062
<AddInstanceButtonComponent
4163
value={[]}
4264
fieldSchema={singleLineFieldSchema}
65+
// @ts-expect-error mocking fieldMetadata
66+
fieldMetadata={{}}
67+
index={0}
4368
onClick={onClickCallback}
69+
label="Add instance"
70+
// @ts-expect-error mocking signal
71+
loading={{ value: false }}
4472
/>
4573
);
46-
})
74+
});
4775
const buttonElement = getByTestId(
4876
document.body,
4977
"visual-builder-add-instance-button"
5078
);
51-
fireEvent.click(buttonElement);
79+
await act(() => {
80+
fireEvent.click(buttonElement);
81+
});
82+
expect(visualBuilderPostMessage?.send).toHaveBeenCalledWith(
83+
"add-instance",
84+
{
85+
fieldMetadata: {},
86+
index: 0,
87+
}
88+
);
89+
});
90+
91+
test("calls onClick callback when clicked", async () => {
92+
const onClickCallback = vi.fn();
93+
await act(() => {
94+
render(
95+
<AddInstanceButtonComponent
96+
value={[]}
97+
fieldSchema={singleLineFieldSchema}
98+
// @ts-expect-error mocking fieldMetadata
99+
fieldMetadata={{}}
100+
index={0}
101+
onClick={onClickCallback}
102+
label="Add instance"
103+
// @ts-expect-error mocking signal
104+
loading={{ value: false }}
105+
/>
106+
);
107+
});
108+
const buttonElement = getByTestId(
109+
document.body,
110+
"visual-builder-add-instance-button"
111+
);
112+
await act(() => {
113+
fireEvent.click(buttonElement);
114+
});
52115
expect(onClickCallback).toHaveBeenCalled();
53116
});
54117
});

src/visualBuilder/utils/__test__/instanceButtons.test.ts renamed to src/visualBuilder/generators/__test__/generateAddInstanceButtons.test.tsx

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,67 @@
1+
import React from "preact/compat";
12
import { singleLineFieldSchema } from "../../../__test__/data/fields";
2-
import { ISchemaFieldMap } from "../types/index.types";
33
import {
44
getAddInstanceButtons,
55
generateAddInstanceButton,
6-
} from "./../../generators/generateAddInstanceButtons";
6+
} from "../generateAddInstanceButtons";
7+
import AddInstanceButtonComponentActual from "../../components/addInstanceButton";
8+
9+
const AddInstanceButtonComponent = vi.mocked(AddInstanceButtonComponentActual);
10+
11+
vi.mock("../../components/addInstanceButton", async () => {
12+
return {
13+
default: vi.fn().mockImplementation(() => {
14+
return (
15+
<button data-testid="add-instance-button">
16+
Add instance button
17+
</button>
18+
);
19+
}),
20+
};
21+
});
722

823
describe("generateAddInstanceButton", () => {
9-
test("should generate a button", () => {
24+
afterEach(() => {
25+
vi.clearAllMocks();
26+
});
27+
28+
test("should generate and return a button", () => {
1029
const button = generateAddInstanceButton({
1130
fieldSchema: singleLineFieldSchema,
1231
value: "",
13-
onClick: () => {},
32+
// @ts-expect-error mock field metadata
33+
fieldMetadata: { hello: "world" },
34+
onClick: vi.fn(),
35+
// @ts-expect-error mocking preact signal
36+
loading: { value: false },
37+
index: 0,
38+
label: "Add Instance",
1439
});
1540
expect(button).toBeInstanceOf(HTMLButtonElement);
1641
});
1742

18-
test("should call the callback when clicked", () => {
19-
const callback = vi.fn();
20-
const button = generateAddInstanceButton({
43+
test("should call the AddInstanceButtonComponent with the correct props", () => {
44+
generateAddInstanceButton({
45+
fieldSchema: singleLineFieldSchema,
46+
value: "",
47+
// @ts-expect-error mock field metadata
48+
fieldMetadata: { hello: "world" },
49+
onClick: vi.fn(),
50+
// @ts-expect-error mocking preact signal
51+
loading: { value: false },
52+
index: 0,
53+
label: "Add Instance",
54+
});
55+
const args = AddInstanceButtonComponent.mock.calls[0][0];
56+
expect(args).toStrictEqual({
2157
fieldSchema: singleLineFieldSchema,
2258
value: "",
23-
onClick: callback,
59+
fieldMetadata: { hello: "world" },
60+
onClick: expect.any(Function),
61+
loading: { value: false },
62+
index: 0,
63+
label: "Add Instance",
2464
});
25-
button.click();
26-
expect(callback).toHaveBeenCalledTimes(1);
2765
});
2866
});
2967

src/visualBuilder/utils/__test__/multipleElementAddButton.test.ts

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import getChildrenDirection from "../getChildrenDirection";
1313
import visualBuilderPostMessage from "../visualBuilderPostMessage";
1414
import { VisualBuilderPostMessageEvents } from "../types/postMessage.types";
1515
import { singleLineFieldSchema } from "../../../__test__/data/fields";
16+
import { signal } from "@preact/signals";
1617

1718
Object.defineProperty(globalThis, "crypto", {
1819
value: {
@@ -46,27 +47,16 @@ vi.mock("../visualBuilderPostMessage", async () => {
4647
};
4748
});
4849

49-
describe("generateAddInstanceButton", () => {
50-
test("should generate a button", () => {
51-
const button = generateAddInstanceButton({
52-
fieldSchema: singleLineFieldSchema,
53-
value: "",
54-
onClick: () => {},
55-
});
56-
expect(button.tagName).toBe("BUTTON");
57-
});
58-
59-
test("should run the callback when the button is clicked", () => {
60-
const mockCallback = vi.fn();
61-
const button = generateAddInstanceButton({
62-
fieldSchema: singleLineFieldSchema,
63-
value: "",
64-
onClick: mockCallback,
65-
});
66-
67-
button.click();
68-
expect(mockCallback).toHaveBeenCalled();
69-
});
50+
vi.mock("@preact/signals", async (importOriginal) => {
51+
const actual = await importOriginal();
52+
return {
53+
...(actual as unknown as Record<string, any>),
54+
signal: (initialValue: any) => {
55+
return {
56+
value: initialValue,
57+
};
58+
},
59+
};
7060
});
7161

7262
// TODO: rewrite this
@@ -577,13 +567,19 @@ describe("removeAddInstanceButtons", () => {
577567

578568
previousButton = generateAddInstanceButton({
579569
fieldSchema: singleLineFieldSchema,
570+
// @ts-expect-error mock field metadata
571+
fieldMetadata: { hello: "world" },
580572
value: "",
581573
onClick: vi.fn(),
574+
loading: signal(false),
582575
});
583576
nextButton = generateAddInstanceButton({
584577
fieldSchema: singleLineFieldSchema,
585578
value: "",
579+
// @ts-expect-error mock field metadata
580+
fieldMetadata: { hello: "world" },
586581
onClick: vi.fn(),
582+
loading: signal(false),
587583
});
588584
overlayWrapper = document.createElement("div");
589585
eventTarget = document.createElement("div");
@@ -672,7 +668,10 @@ describe("removeAddInstanceButtons", () => {
672668
const button = generateAddInstanceButton({
673669
fieldSchema: singleLineFieldSchema,
674670
value: "",
675-
onClick: () => {},
671+
// @ts-expect-error mock field metadata
672+
fieldMetadata: { hello: "world" },
673+
onClick: vi.fn(),
674+
loading: signal(false),
676675
});
677676
visualBuilderContainer.appendChild(button);
678677
}
@@ -704,7 +703,10 @@ describe("removeAddInstanceButtons", () => {
704703
const button = generateAddInstanceButton({
705704
fieldSchema: singleLineFieldSchema,
706705
value: "",
707-
onClick: () => {},
706+
// @ts-expect-error mock field metadata
707+
fieldMetadata: { hello: "world" },
708+
onClick: vi.fn(),
709+
loading: signal(false),
708710
});
709711
visualBuilderContainer.appendChild(button);
710712
}

0 commit comments

Comments
 (0)