diff --git a/src/web/__tests__/fake-react.ts b/src/web/__tests__/fake-react.ts index 2dfcbe108..a411590a2 100644 --- a/src/web/__tests__/fake-react.ts +++ b/src/web/__tests__/fake-react.ts @@ -111,10 +111,11 @@ export function mount

( let tree: unknown = null; let shown = props; let running = false; + let gone = false; const inst: Instance = { slots: [], effects: [], queued: [], cursor: 0, effectCursor: 0, dirty: false, update() { - if (running) return; + if (running || gone) return; running = true; try { let passes = 0; @@ -144,6 +145,12 @@ export function mount

( return { get tree() { return tree; }, rerender(next: P = shown) { shown = next; inst.update(); }, + /** Takes the component away, the way a dialog closing does: every + * effect's cleanup runs, and a state set afterwards draws nothing. */ + unmount() { + gone = true; + for (const e of inst.effects) if (typeof e?.cleanup === "function") e.cleanup(); + }, }; } diff --git a/src/web/__tests__/feedback-dialog-form.test.ts b/src/web/__tests__/feedback-dialog-form.test.ts index 9473f2d8c..04656b92a 100644 --- a/src/web/__tests__/feedback-dialog-form.test.ts +++ b/src/web/__tests__/feedback-dialog-form.test.ts @@ -297,7 +297,7 @@ describe("Send feedback is never greyed out, and never drops focus (#518)", () = }); it("says aria-busy while the request is out, and refuses a second press itself", () => { - expect(flatDialog).toMatch(/ -