import { resolve } from "node:path"; import { describe, expect, it } from "vitest"; import { render } from "@testing-library/preact"; import { CodeBlock } from "./CodeBlock.js"; describe("CodeBlock", () => { // ── Rendering ── it("renders code content", () => { const { getByText } = render( , ); expect(getByText("console.log('hello')")).toBeTruthy(); }); it("renders as a div element", () => { const { container } = render( , ); expect(container.firstElementChild?.tagName).toBe("DIV"); }); it("renders a pre element containing code", () => { const { container } = render( , ); const pre = container.querySelector(".strand-code-block__pre"); expect(pre).toBeTruthy(); expect(pre?.tagName).toBe("PRE"); expect(pre?.querySelector("code")).toBeTruthy(); }); // ── Base class ── // ── Language label ── it("renders language label when provided", () => { const { container } = render( , ); const label = container.querySelector(".strand-code-block__label"); expect(label).toBeTruthy(); expect(label?.textContent).toBe("bash"); }); it("does not render label when language is omitted", () => { const { container } = render( , ); const label = container.querySelector(".strand-code-block__label"); expect(label).toBeNull(); }); // ── Custom className ── // ── Code whitespace ── it("preserves whitespace in code content", () => { const code = "function hello() {\n return 'world';\n}"; const { container } = render( , ); const codeEl = container.querySelector("code"); expect(codeEl?.textContent).toBe(code); }); // ── Forwarded props ── it("forwards additional props", () => { const { container } = render( , ); expect(container.firstElementChild?.getAttribute("id")).toBe("my-code"); }); }); import { snapshotFixtures } from "../../test/snapshot.js"; import { snapshotStylesheet } from "../../test/stylesheet.js"; import { fixtures } from "./CodeBlock.fixtures.js"; snapshotFixtures(CodeBlock, fixtures); snapshotStylesheet(resolve(__dirname, "./CodeBlock.css"));