/**
* @vitest-environment happy-dom
*/
import fs from "node:fs";
import path from "node:path";
import type { ReactNode } from "react";
import { act } from "react";
import { createRoot } from "react-dom/client";
import { NextIntlClientProvider } from "next-intl";
import { describe, expect, test, vi } from "vitest";
import { UsageDocAuthProvider } from "@/app/[locale]/usage-doc/_components/usage-doc-auth-context";
import { QuickLinks } from "@/app/[locale]/usage-doc/_components/quick-links";
vi.mock("@/i18n/routing", () => ({
Link: ({
href,
children,
...rest
}: {
href: string;
children: ReactNode;
className?: string;
}) => (
{children}
),
}));
function loadUsageMessages() {
return JSON.parse(
fs.readFileSync(path.join(process.cwd(), "messages", "en", "usage.json"), "utf8")
);
}
function renderWithAuth(node: ReactNode) {
const container = document.createElement("div");
document.body.appendChild(container);
const root = createRoot(container);
const usageMessages = loadUsageMessages();
act(() => {
root.render(
{node}
);
});
return {
container,
unmount: () => {
act(() => root.unmount());
container.remove();
},
};
}
describe("usage-doc auth state - HttpOnly cookie alignment", () => {
test("logged-in: QuickLinks renders dashboard link when isLoggedIn=true", () => {
Object.defineProperty(window, "scrollTo", { value: vi.fn(), writable: true });
const { container, unmount } = renderWithAuth(
);
const dashboardLink = container.querySelector('a[href="/dashboard"]');
expect(dashboardLink).not.toBeNull();
unmount();
});
test("logged-out: QuickLinks does NOT render dashboard link when isLoggedIn=false", () => {
Object.defineProperty(window, "scrollTo", { value: vi.fn(), writable: true });
const { container, unmount } = renderWithAuth(
);
const dashboardLink = container.querySelector('a[href="/dashboard"]');
expect(dashboardLink).toBeNull();
unmount();
});
test("default context value is isLoggedIn=false (no provider ancestor)", () => {
Object.defineProperty(window, "scrollTo", { value: vi.fn(), writable: true });
const { container, unmount } = renderWithAuth();
const dashboardLink = container.querySelector('a[href="/dashboard"]');
expect(dashboardLink).toBeNull();
unmount();
});
test("page.tsx no longer reads document.cookie for auth state", async () => {
const srcContent = fs.readFileSync(
path.join(process.cwd(), "src", "app", "[locale]", "usage-doc", "page.tsx"),
"utf8"
);
expect(srcContent).not.toContain("document.cookie");
});
test("page.tsx uses useUsageDocAuth hook for session state", async () => {
const srcContent = fs.readFileSync(
path.join(process.cwd(), "src", "app", "[locale]", "usage-doc", "page.tsx"),
"utf8"
);
expect(srcContent).toContain("useUsageDocAuth");
});
test("layout.tsx wraps children with UsageDocAuthProvider", async () => {
const srcContent = fs.readFileSync(
path.join(process.cwd(), "src", "app", "[locale]", "usage-doc", "layout.tsx"),
"utf8"
);
expect(srcContent).toContain("UsageDocAuthProvider");
expect(srcContent).toContain("isLoggedIn={!!session}");
});
});