import { render, screen } from "@testing-library/react";
import { describe, it, expect } from "vitest";
import { MarkdownRenderer } from "#/components/features/markdown/markdown-renderer";
const GFM_TABLE = [
"| Feature | OpenAI Codex | Claude Code |",
"|---------|--------------|-------------|",
"| CLI | ✅ | ✅ |",
"| Mobile | ❌ | ✅ |",
].join("\n");
describe("table (markdown)", () => {
it("should render a GFM pipe table as a
element", () => {
render({GFM_TABLE});
const table = screen.getByRole("table");
expect(table).toBeInTheDocument();
// border-collapse + border is what makes columns visually separate
expect(table).toHaveClass("border-collapse");
expect(table).toHaveClass("border");
});
it("should wrap the table in a horizontally scrollable container", () => {
const { container } = render(
{GFM_TABLE},
);
// Wide tables must not break chat layout — wrapper enables overflow
const wrapper = container.querySelector(".overflow-x-auto");
expect(wrapper).not.toBeNull();
expect(wrapper?.querySelector("table")).not.toBeNull();
});
it("should render header cells as styled | elements", () => {
render({GFM_TABLE});
const headers = screen.getAllByRole("columnheader");
expect(headers).toHaveLength(3);
expect(headers[0]).toHaveTextContent("Feature");
expect(headers[1]).toHaveTextContent("OpenAI Codex");
expect(headers[2]).toHaveTextContent("Claude Code");
// Padding + border is what was missing before the fix
headers.forEach((h) => {
expect(h).toHaveClass("border");
expect(h).toHaveClass("px-3");
expect(h).toHaveClass("py-2");
});
});
it("should render body cells as styled | elements", () => {
render({GFM_TABLE});
const cells = screen.getAllByRole("cell");
expect(cells).toHaveLength(6);
expect(cells[0]).toHaveTextContent("CLI");
expect(cells[3]).toHaveTextContent("Mobile");
cells.forEach((c) => {
expect(c).toHaveClass("border");
expect(c).toHaveClass("px-3");
expect(c).toHaveClass("py-2");
});
});
it("should not render table markdown as plain paragraph text", () => {
// Regression guard: before the fix, missing component overrides made the
// table render with no visible borders/padding so columns looked like
// space-separated text. Ensure a real exists now.
const { container } = render(
{GFM_TABLE},
);
expect(container.querySelectorAll("table")).toHaveLength(1);
expect(container.querySelectorAll("th")).toHaveLength(3);
expect(container.querySelectorAll("td")).toHaveLength(6);
});
});
|