/** * Unit tests for the auth server actions in src/actions/auth-actions.ts. * * Mocks `@/lib/auth` to test the action wrappers in isolation from the * network and the Auth.js runtime. */ import { describe, it, expect, vi, beforeEach } from "vitest"; const signOutMock = vi.fn(); const getSessionMock = vi.fn(); vi.mock("@/lib/auth", () => ({ signOut: signOutMock, // signOutAction first calls getSession() to bail early when there // is no active session — mock a non-null session so the test // exercises the full signOut path. getSession: getSessionMock, })); // `server-only` is a runtime guard that throws if imported outside a // server context. Vitest is a Node env, so the guard fires — stub it. vi.mock("server-only", () => ({})); // Import after mocks. const { signOutAction } = await import("@/actions/auth-actions"); beforeEach(() => { signOutMock.mockReset(); getSessionMock.mockReset(); }); describe("signOutAction", () => { it("calls signOut and redirects to login", async () => { getSessionMock.mockResolvedValue({ data: { session: { id: "sess-1", userId: "u-1" } }, }); signOutMock.mockResolvedValue(undefined); // Note: signOutAction calls redirect() which throws in test context // We just verify signOut was called try { await signOutAction(); } catch { // Expected - redirect() throws } expect(signOutMock).toHaveBeenCalled(); }); });