import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { act, fireEvent, render, screen } from "@testing-library/react";
// Tiptap's NodeView primitives are hard to instantiate in jsdom without a
// full editor. Stub them so the test can render
mounted (hidden)", () => {
render(hello")} />);
act(() => {
vi.advanceTimersByTime(250);
});
const frame = document.querySelector("iframe");
expect(frame).toBeTruthy();
expect(frame?.getAttribute("sandbox")).toBe("allow-scripts");
// NodeViewContent (and its enclosing ) MUST remain mounted —
// unmounting would break Tiptap's bindings and prevent editing.
const nvc = screen.getByTestId("nvc");
expect(nvc).toBeTruthy();
const pre = nvc.closest("pre");
expect(pre).toBeTruthy();
expect(pre?.className).toContain("sr-only");
});
it("toggles to source view: iframe is removed and the is no longer hidden", () => {
render(hello")} />);
act(() => {
vi.advanceTimersByTime(250);
});
expect(document.querySelector("iframe")).toBeTruthy();
const toggle = screen.getByTitle("Show source");
fireEvent.click(toggle);
expect(document.querySelector("iframe")).toBeNull();
const nvc = screen.getByTestId("nvc");
const pre = nvc.closest("pre")!;
expect(pre.className).not.toContain("sr-only");
});
it("does not show the toggle or an iframe for a non-html language", () => {
render( );
expect(screen.queryByTitle("Show source")).toBeNull();
expect(screen.queryByTitle("Show preview")).toBeNull();
expect(document.querySelector("iframe")).toBeNull();
});
});