import { describe, it, expect, afterEach } from "vitest";
import { render, cleanup, screen } from "@testing-library/react";
import { MailboxMessageContent } from "../MailboxMessageContent";
afterEach(() => {
cleanup();
});
describe("MailboxMessageContent", () => {
it("renders plain-text messages unchanged", () => {
render(
wrapper", () => {
const content = "```\nnpm install\n```";
const { container } = render( );
const pre = container.querySelector("pre.mailbox-markdown-pre");
expect(pre).not.toBeNull();
expect(pre?.textContent).toContain("npm install");
});
it("renders links with target=_blank and noopener noreferrer", () => {
render(
,
);
const link = screen.getByRole("link", { name: "docs" });
expect(link.getAttribute("href")).toBe("https://example.com/docs");
expect(link.getAttribute("target")).toBe("_blank");
expect(link.getAttribute("rel")).toContain("noopener");
expect(link.getAttribute("rel")).toContain("noreferrer");
});
it("renders GFM tables with the mailbox-scoped class", () => {
const content = ["| col a | col b |", "| --- | --- |", "| 1 | 2 |"].join("\n");
const { container } = render( );
const table = container.querySelector("table.mailbox-markdown-table");
expect(table).not.toBeNull();
expect(table?.querySelectorAll("th")).toHaveLength(2);
expect(table?.querySelectorAll("tbody td")).toHaveLength(2);
});
it("does NOT execute raw HTML in messages", () => {
const content = "Hello";
const { container } = render( );
// ReactMarkdown defaults disallow raw HTML — the