Skip to content

Commit d968e05

Browse files
test: added remaining gap tests from VB-1504
1 parent 5b73339 commit d968e05

2 files changed

Lines changed: 92 additions & 4 deletions

File tree

src/visualBuilder/eventManager/__test__/useCollab.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,3 +410,51 @@ describe("cleanup", () => {
410410
});
411411
});
412412
});
413+
414+
// Integration tests using real Config to document the intentional read-only isolation design.
415+
// Share recipients receive COLLAB_ENABLE with fromShare:true, which sets pauseFeedback and
416+
// isFeedbackMode but intentionally does NOT set collab.enable. As a result, share recipients
417+
// never enter the collab block in mouseClick.ts (guarded by `collab.enable === true`) and
418+
// bypass the full collab flow by design.
419+
describe("read-only isolation — fromShare integration", () => {
420+
let realConfig: { get: () => any; set: (key: string, value: any) => void; reset: () => void };
421+
let collabEnableHandler: (data: any) => void;
422+
let collabDisableHandler: (data: any) => void;
423+
424+
beforeEach(async () => {
425+
vi.clearAllMocks();
426+
const realConfigModule = await vi.importActual<{ default: typeof realConfig }>(
427+
"../../../configManager/configManager"
428+
);
429+
realConfig = realConfigModule.default;
430+
realConfig.reset();
431+
vi.mocked(Config.set).mockImplementation((key, value) => realConfig.set(key, value));
432+
vi.mocked(Config.get).mockImplementation(() => realConfig.get());
433+
useCollab();
434+
collabEnableHandler = getHandler(0);
435+
collabDisableHandler = getHandler(2);
436+
});
437+
438+
afterEach(() => {
439+
realConfig.reset();
440+
vi.mocked(Config.get).mockReset();
441+
vi.mocked(Config.set).mockReset();
442+
});
443+
444+
it("should set pauseFeedback but not enable after COLLAB_ENABLE with fromShare:true", () => {
445+
collabEnableHandler({
446+
data: { collab: { fromShare: true, pauseFeedback: true, isFeedbackMode: true } },
447+
});
448+
449+
expect(realConfig.get().collab.pauseFeedback).toBe(true);
450+
expect(realConfig.get().collab.enable).not.toBe(true);
451+
});
452+
453+
it("should set collab.pauseFeedback when COLLAB_DISABLE fires with fromShare:true", () => {
454+
collabDisableHandler({
455+
data: { collab: { fromShare: true, pauseFeedback: true } },
456+
});
457+
458+
expect(realConfig.get().collab.pauseFeedback).toBe(true);
459+
});
460+
});

src/visualBuilder/listeners/__test__/mouseClick.test.ts

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,15 @@ vi.mock("../../components/FieldRevert/FieldRevertComponent", () => ({
7373

7474
vi.mock("get-xpath", () => ({ default: vi.fn().mockReturnValue("/div") }));
7575

76-
vi.mock("../../configManager/configManager", () => ({
76+
const hoistedConfigMocks = vi.hoisted(() => ({
77+
configGet: vi.fn().mockReturnValue({
78+
collab: { enable: false, isFeedbackMode: false, pauseFeedback: false },
79+
}),
80+
}));
81+
82+
vi.mock("../../../configManager/configManager", () => ({
7783
default: {
78-
get: vi.fn().mockReturnValue({
79-
collab: { enable: false, isFeedbackMode: false, pauseFeedback: false },
80-
}),
84+
get: hoistedConfigMocks.configGet,
8185
set: vi.fn(),
8286
},
8387
}));
@@ -110,6 +114,7 @@ const { getCsDataOfElement } = await import("../../utils/getCsDataOfElement");
110114
const { addFocusOverlay } = await import("../../generators/generateOverlay");
111115
const { handleIndividualFields } = await import("../../utils/handleIndividualFields");
112116
const { isCustomFieldMultipleInstance } = await import("../../utils/isCustomFieldMultipleInstance");
117+
const { generateThread, toggleCollabPopup } = await import("../../generators/generateThread");
113118

114119
function makeEditableElement(): HTMLElement {
115120
const el = document.createElement("div");
@@ -210,3 +215,38 @@ describe("handleBuilderInteraction — custom field multiple instance suppressio
210215
expect(addFocusOverlay).toHaveBeenCalled();
211216
});
212217
});
218+
219+
describe("handleBuilderInteraction — pauseFeedback guard", () => {
220+
let editableElement: HTMLElement;
221+
222+
beforeEach(() => {
223+
vi.clearAllMocks();
224+
document.body.innerHTML = "";
225+
editableElement = makeEditableElement();
226+
VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM = null;
227+
VisualBuilder.VisualBuilderGlobalState.value.isFocussed = false;
228+
});
229+
230+
it("should return early without processing click when collab is enabled and pauseFeedback is true", async () => {
231+
hoistedConfigMocks.configGet.mockReturnValue({
232+
collab: { enable: true, pauseFeedback: true, isFeedbackMode: true },
233+
});
234+
235+
await handleBuilderInteraction(makeParams(editableElement));
236+
237+
expect(getCsDataOfElement).not.toHaveBeenCalled();
238+
expect(generateThread).not.toHaveBeenCalled();
239+
expect(toggleCollabPopup).not.toHaveBeenCalled();
240+
expect(addFocusOverlay).not.toHaveBeenCalled();
241+
});
242+
243+
it("should call generateThread when collab is enabled and pauseFeedback is false", async () => {
244+
hoistedConfigMocks.configGet.mockReturnValue({
245+
collab: { enable: true, pauseFeedback: false, isFeedbackMode: true },
246+
});
247+
248+
await handleBuilderInteraction(makeParams(editableElement));
249+
250+
expect(generateThread).toHaveBeenCalled();
251+
});
252+
});

0 commit comments

Comments
 (0)