// @vitest-environment happy-dom import { afterEach, describe, expect, it } from "vitest"; import { isTypingTarget } from "./typingTarget"; import { isEditableTarget } from "./timelineDiscovery"; afterEach(() => { document.body.innerHTML = ""; }); function mount(html: string): HTMLElement { document.body.innerHTML = html; return document.body.firstElementChild as HTMLElement; } describe("isTypingTarget", () => { it("keeps the legacy import on the same canonical decision", () => { expect(isEditableTarget).toBe(isTypingTarget); }); // The bug this exists for: inline text editing uses plaintext-only, an // attribute selector for 'true' missed it, and the playback shortcuts ate // every letter typed into the composition. it("recognises a plaintext-only editable, not just contenteditable=true", () => { expect(isTypingTarget(mount('

Hi

'))).toBe(true); expect(isTypingTarget(mount('

Hi

'))).toBe(true); expect(isTypingTarget(mount("

Hi

"))).toBe(true); }); it("recognises a child of an editable, which a selector on the target alone misses", () => { const host = mount('
inner
'); expect(isTypingTarget(host.querySelector("span"))).toBe(true); }); it("recognises the ordinary fields too", () => { expect(isTypingTarget(mount(""))).toBe(true); expect(isTypingTarget(mount(""))).toBe(true); expect(isTypingTarget(mount(""))).toBe(true); expect(isTypingTarget(mount('
'))).toBe(true); expect(isTypingTarget(mount('
'))).toBe(true); expect(isTypingTarget(mount('
'))).toBe(true); }); it("leaves the keys alone for anything that is not being typed into", () => { expect(isTypingTarget(mount("
plain
"))).toBe(false); expect(isTypingTarget(mount(""))).toBe(false); expect(isTypingTarget(mount('

Hi

'))).toBe(false); }); it("says no to nothing at all", () => { expect(isTypingTarget(null)).toBe(false); expect(isTypingTarget({} as EventTarget)).toBe(false); }); });