Skip to content

Commit 93feb16

Browse files
committed
fix: passing all
1 parent 2a6c8f5 commit 93feb16

10 files changed

Lines changed: 501 additions & 203 deletions

File tree

.github/workflows/unit-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
- name: "Install Deps"
2222
run: npm install
2323
- name: "Test"
24-
run: npx vitest run --coverage.enabled true --reporter=verbose
24+
run: npm run test
2525
- name: "Report Coverage"
2626
# Set if: always() to also generate the report if tests are failing
2727
# Only works if you set `reportOnFailure: true` in your vite config as specified above

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
"sideEffects": false,
2626
"scripts": {
2727
"build": "NODE_OPTIONS='--max-old-space-size=16384' tsup",
28-
"test": "vitest",
28+
"test": "vitest --run",
29+
"test:watch": "vitest",
2930
"test:once": "vitest run",
3031
"test:coverage": "vitest --coverage",
3132
"dev": "NODE_OPTIONS='--max-old-space-size=16384' tsup --watch",

src/visualBuilder/__test__/hover/fields/all-hover.test.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,15 @@ vi.mock("../../../utils/visualBuilderPostMessage", async () => {
5353
});
5454

5555
// Mock fetchEntryPermissionsAndStageDetails to resolve immediately - this is called during hover
56-
// and causes delays for html-rte, json-rte, link, and other fields
56+
// Mock fetchEntryPermissionsAndStageDetails to resolve immediately - speeds up hover tests
5757
vi.mock("../../../utils/fetchEntryPermissionsAndStageDetails", () => ({
5858
fetchEntryPermissionsAndStageDetails: vi.fn().mockResolvedValue({
5959
acl: {
60-
update: {
61-
create: true,
62-
read: true,
63-
update: true,
64-
delete: true,
65-
publish: true,
66-
},
60+
create: true,
61+
read: true,
62+
update: true,
63+
delete: true,
64+
publish: true,
6765
},
6866
workflowStage: {
6967
stage: undefined,
@@ -213,8 +211,9 @@ describe("When an element is hovered in visual builder mode", () => {
213211
});
214212
});
215213

216-
afterEach(() => {
217-
vi.clearAllMocks();
214+
afterEach(async () => {
215+
// Wait longer for any pending async operations (like fetchEntryPermissionsAndStageDetails) to complete
216+
await new Promise((resolve) => setTimeout(resolve, 500));
218217
document.getElementsByTagName("html")[0].innerHTML = "";
219218
});
220219

src/visualBuilder/__test__/hover/fields/file.test.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,11 @@ vi.mock("../../../../utils/index.ts", async () => {
6666
vi.mock("../../../utils/fetchEntryPermissionsAndStageDetails", () => ({
6767
fetchEntryPermissionsAndStageDetails: vi.fn().mockResolvedValue({
6868
acl: {
69-
update: {
70-
create: true,
71-
read: true,
72-
update: true,
73-
delete: true,
74-
publish: true,
75-
},
69+
create: true,
70+
read: true,
71+
update: true,
72+
delete: true,
73+
publish: true,
7674
},
7775
workflowStage: {
7876
stage: undefined,
@@ -131,8 +129,9 @@ describe("When an element is hovered in visual builder mode", () => {
131129
document.getElementsByTagName("html")[0].innerHTML = "";
132130
});
133131

134-
afterEach(() => {
135-
vi.clearAllMocks();
132+
afterEach(async () => {
133+
// Wait longer for any pending async operations (like fetchEntryPermissionsAndStageDetails) to complete
134+
await new Promise((resolve) => setTimeout(resolve, 500));
136135
document.getElementsByTagName("html")[0].innerHTML = "";
137136
});
138137

src/visualBuilder/__test__/hover/fields/single-line.test.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,30 @@ vi.mock("../../../../utils/index.ts", async () => {
6767
};
6868
});
6969

70+
// Mock fetchEntryPermissionsAndStageDetails to resolve immediately - speeds up hover tests
71+
vi.mock("../../../utils/fetchEntryPermissionsAndStageDetails", () => ({
72+
fetchEntryPermissionsAndStageDetails: vi.fn().mockResolvedValue({
73+
acl: {
74+
create: true,
75+
read: true,
76+
update: true,
77+
delete: true,
78+
publish: true,
79+
},
80+
workflowStage: {
81+
stage: undefined,
82+
permissions: {
83+
entry: {
84+
update: true,
85+
},
86+
},
87+
},
88+
resolvedVariantPermissions: {
89+
update: true,
90+
},
91+
}),
92+
}));
93+
7094
describe("When an element is hovered in visual builder mode", () => {
7195
let mousemoveEvent: Event;
7296

@@ -86,8 +110,11 @@ describe("When an element is hovered in visual builder mode", () => {
86110
});
87111
});
88112

89-
afterEach(() => {
90-
vi.clearAllMocks();
113+
afterEach(async () => {
114+
// Wait longer for any pending async operations (like fetchEntryPermissionsAndStageDetails) to complete
115+
await new Promise((resolve) => setTimeout(resolve, 500));
116+
// Don't clear mocks here - it causes unhandled rejections in async code
117+
// vi.clearAllMocks();
91118
document.getElementsByTagName("html")[0].innerHTML = "";
92119
});
93120

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

Lines changed: 90 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import { describe, it, expect, vi, beforeEach, Mock } from "vitest";
2-
import { handleIndividualFields, cleanIndividualFieldResidual } from "../handleIndividualFields";
2+
import {
3+
handleIndividualFields,
4+
cleanIndividualFieldResidual,
5+
} from "../handleIndividualFields";
36
import { VisualBuilderCslpEventDetails } from "../../types/visualBuilder.types";
47
import { FieldSchemaMap } from "../fieldSchemaMap";
58
import { getFieldData } from "../getFieldData";
69
import { getFieldType } from "../getFieldType";
710
import { isFieldDisabled } from "../isFieldDisabled";
8-
import { handleAddButtonsForMultiple, removeAddInstanceButtons } from "../multipleElementAddButton";
11+
import {
12+
handleAddButtonsForMultiple,
13+
removeAddInstanceButtons,
14+
} from "../multipleElementAddButton";
915
import { VisualBuilderPostMessageEvents } from "../types/postMessage.types";
1016
import visualBuilderPostMessage from "../visualBuilderPostMessage";
1117
import { VisualBuilder } from "../..";
@@ -39,16 +45,16 @@ describe("handleIndividualFields", () => {
3945
fieldPath: "fieldPath",
4046
fieldPathWithIndex: "fieldPathWithIndex",
4147
instance: {
42-
fieldPathWithIndex: "fieldPathWithIndex.0"
43-
}
48+
fieldPathWithIndex: "fieldPathWithIndex.0",
49+
},
4450
},
45-
editableElement: document.createElement("div")
51+
editableElement: document.createElement("div"),
4652
};
4753

4854
elements = {
4955
visualBuilderContainer: document.createElement("div"),
5056
resizeObserver: new ResizeObserver(() => {}),
51-
lastEditedField: null
57+
lastEditedField: null,
5258
};
5359

5460
vi.clearAllMocks();
@@ -69,34 +75,46 @@ describe("handleIndividualFields", () => {
6975
await handleIndividualFields(eventDetails, elements);
7076
});
7177

72-
expect(FieldSchemaMap.getFieldSchema).toHaveBeenCalledWith("contentTypeUid", "fieldPath");
73-
expect(getFieldData).toHaveBeenCalledWith({ content_type_uid: "contentTypeUid", entry_uid: "entryUid", locale: "en-us" }, "fieldPathWithIndex");
78+
expect(FieldSchemaMap.getFieldSchema).toHaveBeenCalledWith(
79+
"contentTypeUid",
80+
"fieldPath"
81+
);
82+
expect(getFieldData).toHaveBeenCalledWith(
83+
{
84+
content_type_uid: "contentTypeUid",
85+
entry_uid: "entryUid",
86+
locale: "en-us",
87+
},
88+
"fieldPathWithIndex"
89+
);
7490
expect(getFieldType).toHaveBeenCalledWith(fieldSchema);
7591
expect(isFieldDisabled).toHaveBeenCalledWith(
76-
fieldSchema,
77-
eventDetails,
78-
{
79-
update: true,
80-
error: true
81-
},
82-
{
83-
read: true,
84-
update: true,
85-
delete: true,
86-
publish: true,
87-
},
88-
{
89-
permissions: {
90-
entry: {
91-
update: true,
92-
},
92+
fieldSchema,
93+
eventDetails,
94+
{
95+
update: true,
9396
},
94-
stage: {
95-
name: "Unknown"
97+
{
98+
create: true,
99+
read: true,
100+
update: true,
101+
delete: true,
102+
publish: true,
103+
},
104+
{
105+
permissions: {
106+
entry: {
107+
update: true,
108+
},
109+
},
110+
stage: undefined,
96111
}
97-
}
98112
);
99-
expect(eventDetails.editableElement.getAttribute(VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY)).toBe(fieldType);
113+
expect(
114+
eventDetails.editableElement.getAttribute(
115+
VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY
116+
)
117+
).toBe(fieldType);
100118
});
101119

102120
it("should handle multiple fields correctly", async () => {
@@ -116,7 +134,10 @@ describe("handleIndividualFields", () => {
116134
});
117135

118136
it("should handle inline editing for supported fields", async () => {
119-
const fieldSchema = { data_type: FieldDataType.SINGLELINE, multiple: false };
137+
const fieldSchema = {
138+
data_type: FieldDataType.SINGLELINE,
139+
multiple: false,
140+
};
120141
const expectedFieldData = "expectedFieldData";
121142
eventDetails.editableElement.textContent = expectedFieldData;
122143
const fieldType = FieldDataType.SINGLELINE;
@@ -129,12 +150,17 @@ describe("handleIndividualFields", () => {
129150

130151
await act(async () => {
131152
await handleIndividualFields(eventDetails, elements);
132-
})
153+
});
133154

134-
expect(eventDetails.editableElement.getAttribute(VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY)).toBe(fieldType);
135-
expect(eventDetails.editableElement.getAttribute("contenteditable")).toBe("true");
155+
expect(
156+
eventDetails.editableElement.getAttribute(
157+
VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY
158+
)
159+
).toBe(fieldType);
160+
expect(
161+
eventDetails.editableElement.getAttribute("contenteditable")
162+
).toBe("true");
136163
});
137-
138164
});
139165

140166
describe("cleanIndividualFieldResidual", () => {
@@ -150,45 +176,59 @@ describe("cleanIndividualFieldResidual", () => {
150176
overlayWrapper: document.createElement("div"),
151177
visualBuilderContainer: document.createElement("div"),
152178
focusedToolbar: document.createElement("div"),
153-
resizeObserver: new ResizeObserver(() => {})
179+
resizeObserver: new ResizeObserver(() => {}),
154180
};
155181

156182
vi.clearAllMocks();
157183
});
158184

159185
it("should clean individual field residuals correctly", () => {
160186
const previousSelectedEditableDOM = document.createElement("div");
161-
VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM = previousSelectedEditableDOM;
187+
VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM =
188+
previousSelectedEditableDOM;
162189

163190
cleanIndividualFieldResidual(elements);
164191

165192
expect(removeAddInstanceButtons).toHaveBeenCalled();
166-
expect(previousSelectedEditableDOM.getAttribute("contenteditable")).toBeNull();
167-
expect(elements.resizeObserver.unobserve).toHaveBeenCalledWith(previousSelectedEditableDOM);
193+
expect(
194+
previousSelectedEditableDOM.getAttribute("contenteditable")
195+
).toBeNull();
196+
expect(elements.resizeObserver.unobserve).toHaveBeenCalledWith(
197+
previousSelectedEditableDOM
198+
);
168199
});
169200

170201
it("should clean pseudo editable element correctly", () => {
171202
const pseudoEditableElement = document.createElement("div");
172-
pseudoEditableElement.classList.add("visual-builder__pseudo-editable-element");
203+
pseudoEditableElement.classList.add(
204+
"visual-builder__pseudo-editable-element"
205+
);
173206
elements.visualBuilderContainer?.appendChild(pseudoEditableElement);
174207

175208
cleanIndividualFieldResidual(elements);
176209

177-
expect(elements.resizeObserver.unobserve).toHaveBeenCalledWith(pseudoEditableElement);
210+
expect(elements.resizeObserver.unobserve).toHaveBeenCalledWith(
211+
pseudoEditableElement
212+
);
178213
expect(pseudoEditableElement.parentNode).toBeNull();
179214
});
180-
it("should clean focused toolbar correctly", () => {
181-
cleanIndividualFieldResidual(elements);
215+
it("should clean focused toolbar correctly", () => {
216+
cleanIndividualFieldResidual(elements);
182217

183-
expect(elements.focusedToolbar?.innerHTML).toBe("");
218+
expect(elements.focusedToolbar?.innerHTML).toBe("");
184219

185-
const toolbarEvents = [VisualBuilderPostMessageEvents.DELETE_INSTANCE, VisualBuilderPostMessageEvents.UPDATE_DISCUSSION_ID];
186-
toolbarEvents.forEach((event) => {
187-
//@ts-expect-error - We are accessing private method here, but it is necessary to clean up the event listeners.
188-
if (visualBuilderPostMessage?.requestMessageHandlers?.has(event)) {
220+
const toolbarEvents = [
221+
VisualBuilderPostMessageEvents.DELETE_INSTANCE,
222+
VisualBuilderPostMessageEvents.UPDATE_DISCUSSION_ID,
223+
];
224+
toolbarEvents.forEach((event) => {
189225
//@ts-expect-error - We are accessing private method here, but it is necessary to clean up the event listeners.
190-
expect(visualBuilderPostMessage?.unregisterEvent).toHaveBeenCalledWith(event);
191-
}
226+
if (visualBuilderPostMessage?.requestMessageHandlers?.has(event)) {
227+
//@ts-expect-error - We are accessing private method here, but it is necessary to clean up the event listeners.
228+
expect(
229+
visualBuilderPostMessage?.unregisterEvent
230+
).toHaveBeenCalledWith(event);
231+
}
232+
});
192233
});
193234
});
194-
});

0 commit comments

Comments
 (0)