import { afterEach, beforeEach, describe, expect, it, rs } from "@rstest/core";
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
const state = rs.hoisted(() => ({
result: {
rows: [] as string[][],
columnCount: 2,
limited: false,
unevenRows: false,
},
status: "ready",
retry: rs.fn(),
}));
rs.mock("@/core/artifacts/use-delimited-preview", () => ({
useDelimitedPreview: () => state,
}));
import { ArtifactTablePreview } from "@/components/workspace/artifacts/artifact-table-preview";
import { I18nProvider } from "@/core/i18n/context";
function mount() {
return render(
,
);
}
afterEach(cleanup);
beforeEach(() => {
state.status = "ready";
state.result = {
rows: [
["ID", "Note"],
["00123", ""],
],
columnCount: 2,
limited: false,
unevenRows: false,
};
});
describe("ArtifactTablePreview", () => {
it("preserves literal data and lets the first row become data", () => {
const { container } = mount();
expect(screen.getByRole("columnheader", { name: "ID" })).toBeTruthy();
expect(screen.getByText("00123")).toBeTruthy();
expect(container.querySelector("script")).toBeNull();
fireEvent.click(
screen.getByRole("checkbox", { name: "First row as header" }),
);
expect(screen.getByRole("columnheader", { name: "Column 1" })).toBeTruthy();
expect(screen.getByRole("cell", { name: "ID" })).toBeTruthy();
});
it("paginates locally and labels bounded samples honestly", () => {
state.result.rows = [
["ID", "Note"],
...Array.from({ length: 202 }, (_, i) => [String(i + 1), "note"]),
];
mount();
expect(screen.getByText("Preview of first 200 rows")).toBeTruthy();
expect(screen.getByText("1–50 of preview")).toBeTruthy();
fireEvent.click(screen.getByRole("button", { name: "Next page" }));
expect(screen.getByText("51–100 of preview")).toBeTruthy();
expect(screen.getByRole("cell", { name: "51" })).toBeTruthy();
expect(screen.queryByRole("cell", { name: "1" })).toBeNull();
});
it("keeps long fields available without enlarging every row", () => {
const longText = "first line\n" + "x".repeat(200);
state.result.rows = [
["ID", "Note"],
["00123", longText],
];
mount();
fireEvent.click(
screen.getByRole("button", { name: "View cell: row 1, column 2" }),
);
expect(
screen.getByRole("textbox", {
name: "Cell value",
}).value,
).toBe(longText);
});
it("offers an explicit retry without displaying stale data on failure", () => {
state.status = "error";
mount();
expect(screen.queryByRole("table")).toBeNull();
fireEvent.click(screen.getByRole("button", { name: "Retry preview" }));
expect(state.retry).toHaveBeenCalled();
});
});