Spaces:
Sleeping
Sleeping
| import { describe, expect, it } from "vitest"; | |
| import { appRouter } from "./routers"; | |
| import { COOKIE_NAME } from "../shared/const"; | |
| import type { TrpcContext } from "./_core/context"; | |
| type CookieCall = { | |
| name: string; | |
| options: Record<string, unknown>; | |
| }; | |
| type AuthenticatedUser = NonNullable<TrpcContext["user"]>; | |
| function createAuthContext(): { ctx: TrpcContext; clearedCookies: CookieCall[] } { | |
| const clearedCookies: CookieCall[] = []; | |
| const user: AuthenticatedUser = { | |
| id: 1, | |
| openId: "sample-user", | |
| email: "sample@example.com", | |
| name: "Sample User", | |
| loginMethod: "manus", | |
| role: "user", | |
| createdAt: new Date(), | |
| updatedAt: new Date(), | |
| lastSignedIn: new Date(), | |
| }; | |
| const ctx: TrpcContext = { | |
| user, | |
| req: { | |
| protocol: "https", | |
| headers: {}, | |
| } as TrpcContext["req"], | |
| res: { | |
| clearCookie: (name: string, options: Record<string, unknown>) => { | |
| clearedCookies.push({ name, options }); | |
| }, | |
| } as TrpcContext["res"], | |
| }; | |
| return { ctx, clearedCookies }; | |
| } | |
| describe("auth.logout", () => { | |
| it("clears the session cookie and reports success", async () => { | |
| const { ctx, clearedCookies } = createAuthContext(); | |
| const caller = appRouter.createCaller(ctx); | |
| const result = await caller.auth.logout(); | |
| expect(result).toEqual({ success: true }); | |
| expect(clearedCookies).toHaveLength(1); | |
| expect(clearedCookies[0]?.name).toBe(COOKIE_NAME); | |
| expect(clearedCookies[0]?.options).toMatchObject({ | |
| maxAge: -1, | |
| secure: true, | |
| sameSite: "none", | |
| httpOnly: true, | |
| path: "/", | |
| }); | |
| }); | |
| }); | |