import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { FreetextWidget } from "./FreetextWidget"; function reloadIsBlocked() { const event = new Event("beforeunload", { cancelable: true }); window.dispatchEvent(event); return event.defaultPrevented; } test("protects an answer draft until cleared or unmounted, including after sending", async () => { const onRespond = vi.fn(); const { unmount } = render(); expect(reloadIsBlocked()).toBe(false); await userEvent.type(screen.getByRole("textbox"), "Draft answer"); expect(reloadIsBlocked()).toBe(true); await userEvent.clear(screen.getByRole("textbox")); expect(reloadIsBlocked()).toBe(false); await userEvent.type(screen.getByRole("textbox"), "Answer{Enter}"); expect(onRespond).toHaveBeenCalledWith({ id: "u1", kind: "freetext", text: "Answer" }); expect(reloadIsBlocked()).toBe(true); await userEvent.type(screen.getByRole("textbox"), " updated"); expect(reloadIsBlocked()).toBe(true); unmount(); expect(reloadIsBlocked()).toBe(false); }); test("submits typed text", async () => { const onRespond = vi.fn(); render(); await userEvent.type(screen.getByRole("textbox"), "ciao"); await userEvent.click(screen.getByRole("button", { name: /send/i })); expect(onRespond).toHaveBeenCalledWith({ id: "u1", kind: "freetext", text: "ciao" }); });