import { describe, it, expect } from "vitest";
import { render } from "@testing-library/react";
import { CodeBlock, CopyButton } from "./code-block";
describe("CodeBlock", () => {
it("renders the code through the syntax highlighter", () => {
const { container } = render();
expect(container.querySelector("code")).not.toBeNull();
});
it("uses `label` as the header text, overriding `language`", () => {
const { getByText, queryByText } = render(
,
);
expect(getByText("config.ts")).toBeInTheDocument();
expect(queryByText("typescript")).toBeNull();
});
it("falls back to `language` for the header when no `label` is given", () => {
const { getByText } = render();
expect(getByText("python")).toBeInTheDocument();
});
it("renders no header when neither label nor language is set", () => {
const { container } = render();
// The header is the only element carrying a bottom border.
expect(container.querySelector(".border-b")).toBeNull();
});
it("treats an explicit empty label as 'no header', even with a language", () => {
const { container, queryByText } = render(
,
);
expect(container.querySelector(".border-b")).toBeNull();
expect(queryByText("python")).toBeNull();
});
it("places children in the header when a header is shown", () => {
const { container } = render(
,
);
const copyButton = container.querySelector('button[title="Copy to clipboard"]');
expect(copyButton).not.toBeNull();
// Inside the bordered header, not the absolute hover overlay.
expect(copyButton?.closest(".border-b")).not.toBeNull();
expect(copyButton?.closest(".absolute")).toBeNull();
});
it("moves children to a hover overlay when no header is shown", () => {
const { container } = render(
,
);
const copyButton = container.querySelector('button[title="Copy to clipboard"]');
expect(copyButton).not.toBeNull();
expect(copyButton?.closest(".absolute")).not.toBeNull();
expect(copyButton?.closest(".border-b")).toBeNull();
});
});