import { describe, test, expect, vi } from "vitest";
import RootLayout from "../../app/layout";
// Mock the font imports since they're Next.js specific
vi.mock("next/font/google", () => ({
Inter: vi.fn(() => ({
variable: "--font-inter",
style: { fontFamily: "Inter" },
})),
Bricolage_Grotesque: vi.fn(() => ({
variable: "--font-bricolage-grotesque",
style: { fontFamily: "Bricolage Grotesque" },
})),
Space_Grotesk: vi.fn(() => ({
variable: "--font-space-grotesk",
style: { fontFamily: "Space Grotesk" },
})),
}));
function findChildByType(node, type) {
if (!node || typeof node !== "object") return null;
const children = Array.isArray(node.props?.children)
? node.props.children
: [node.props?.children].filter(Boolean);
for (const child of children) {
if (child?.type === type) return child;
}
return null;
}
function findDescendant(node, predicate) {
if (predicate(node)) return node;
if (!node || typeof node !== "object") return null;
const children = Array.isArray(node.props?.children)
? node.props.children
: [node.props?.children].filter(Boolean);
for (const child of children) {
const found = findDescendant(child, predicate);
if (found) return found;
}
return null;
}
describe("RootLayout", () => {
test("renders HTML structure with correct attributes", () => {
const tree = RootLayout({ children:
Test content
});
expect(tree.type).toBe("html");
expect(tree.props.lang).toBe("en");
expect(tree.props.className).toContain("font-sans");
});
test("renders body with font variables", () => {
const tree = RootLayout({ children: Test content
});
const body = findChildByType(tree, "body");
expect(body).toBeTruthy();
expect(body.props.className).toContain("--font-inter");
expect(body.props.className).toContain("--font-bricolage-grotesque");
expect(body.props.className).toContain("--font-space-grotesk");
});
test("renders main layout structure", () => {
const tree = RootLayout({ children: Test content
});
const container = findDescendant(
tree,
(n) => n.type === "div" && n.props?.className?.includes("min-h-screen"),
);
expect(container).toBeTruthy();
});
test("renders main content area", () => {
const testContent = "Test content";
const tree = RootLayout({ children: {testContent}
});
const main = findDescendant(
tree,
(n) => n.type === "main" && n.props?.className?.includes("flex-1"),
);
expect(main).toBeTruthy();
const childText = findDescendant(
main,
(n) => typeof n === "string" && n.includes(testContent),
);
expect(childText).toBeTruthy();
});
test("renders children content correctly", () => {
const testContent = "This is test content";
const tree = RootLayout({ children: {testContent}
});
const main = findDescendant(tree, (n) => n.type === "main");
const childText = findDescendant(
main,
(n) => typeof n === "string" && n.includes(testContent),
);
expect(childText).toBeTruthy();
});
});