// @vitest-environment happy-dom
import type { ReactNode } from "react";
import { renderToStaticMarkup } from "react-dom/server";
import { describe, expect, it, vi } from "vitest";
import { createExtraSheet, mergeExtraSheetRange, updateExtraSheetCells } from "@/lib/guides/extra-sheet";
import type { PublicGuide } from "@/lib/guides/queries";
vi.mock("next/font/local", () => ({ default: () => ({ className: "font" }) }));
vi.mock("./guide-page-shell", () => ({
GuidePageShell: ({ children }: { children: ReactNode }) => {children},
publicSectionTitle: (title: string) => title,
}));
vi.mock("./guide-image-export", () => ({
GuideImageExport: ({ children }: { children: ReactNode }) => ,
}));
vi.mock("./guide-export-branding", () => ({ GuideExportBranding: () => null }));
const { StructuredGuideShell } = await import("./structured-guide");
describe("extra sheet public rendering", () => {
it("renders full merged bounds and vertical alignment in both the guide and export", () => {
let sequence = 0;
let sheet = createExtraSheet((prefix) => `${prefix}-${++sequence}`);
sheet = mergeExtraSheetRange(sheet, { start: { row: 1, column: 1 }, end: { row: 2, column: 3 } });
sheet = updateExtraSheetCells(sheet, [{ row: 1, column: 1 }], {
value: "
Merged text
", alignment: "center", verticalAlignment: "middle", backgroundColor: "#123456",
});
const guide = {
id: "guide", slug: "guide", coverUrl: "/cover.png", character: { splashImageUrl: null },
availableSections: [{ id: "extra", slug: "notes", title: "Notes" }],
extras: [{ id: "extra", slug: "notes", title: "Notes", rows: [{
id: "row", heading: "Details", body: "", percent: null, highlights: [], catalogItems: [],
imageUrl: null, backgroundColor: null, sheet,
}] }],
} as unknown as PublicGuide;
const container = document.createElement("div");
container.innerHTML = renderToStaticMarkup();
const tables = container.querySelectorAll("table");
expect(tables).toHaveLength(2);
for (const table of tables) {
expect(table.querySelectorAll("col")).toHaveLength(3);
expect(table.querySelectorAll("tbody tr")).toHaveLength(2);
expect(table.querySelectorAll("td")).toHaveLength(1);
const cell = table.querySelector("td")!;
expect(cell.rowSpan).toBe(2);
expect(cell.colSpan).toBe(3);
expect(cell.style.verticalAlign).toBe("middle");
expect(cell.style.textAlign).toBe("center");
expect(cell.querySelector("strong")?.textContent).toBe("Merged text");
}
});
});