| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- import { afterEach, describe, expect, it, vi } from "vitest";
- const ORIGINAL_SESSION_TOKEN_MODE = process.env.SESSION_TOKEN_MODE;
- function restoreSessionTokenModeEnv() {
- if (ORIGINAL_SESSION_TOKEN_MODE === undefined) {
- delete process.env.SESSION_TOKEN_MODE;
- return;
- }
- process.env.SESSION_TOKEN_MODE = ORIGINAL_SESSION_TOKEN_MODE;
- }
- describe("session token contract and migration flags", () => {
- afterEach(() => {
- restoreSessionTokenModeEnv();
- vi.resetModules();
- });
- it("SESSION_TOKEN_MODE defaults to opaque", async () => {
- delete process.env.SESSION_TOKEN_MODE;
- vi.resetModules();
- const { getSessionTokenMode } = await import("@/lib/auth");
- expect(getSessionTokenMode()).toBe("opaque");
- });
- it("getSessionTokenMode returns configured mode values", async () => {
- const modes = ["legacy", "dual", "opaque"] as const;
- for (const mode of modes) {
- process.env.SESSION_TOKEN_MODE = mode;
- vi.resetModules();
- const { getSessionTokenMode } = await import("@/lib/auth");
- expect(getSessionTokenMode()).toBe(mode);
- }
- });
- it("validates OpaqueSessionContract runtime shape strictly", async () => {
- vi.resetModules();
- const { isOpaqueSessionContract } = await import("@/lib/auth");
- const validContract = {
- sessionId: "sid_opaque_session_123",
- keyFingerprint: "sha256:abc123",
- createdAt: 1_700_000_000,
- expiresAt: 1_700_000_300,
- userId: 42,
- userRole: "admin",
- };
- expect(isOpaqueSessionContract(validContract)).toBe(true);
- expect(
- isOpaqueSessionContract({
- ...validContract,
- keyFingerprint: "",
- })
- ).toBe(false);
- expect(
- isOpaqueSessionContract({
- ...validContract,
- expiresAt: validContract.createdAt,
- })
- ).toBe(false);
- expect(
- isOpaqueSessionContract({
- ...validContract,
- userId: 3.14,
- })
- ).toBe(false);
- });
- it("accepts both legacy cookie and opaque session in dual mode", async () => {
- process.env.SESSION_TOKEN_MODE = "dual";
- vi.resetModules();
- const { getSessionTokenMode, getSessionTokenMigrationFlags, isSessionTokenAccepted } =
- await import("@/lib/auth");
- const mode = getSessionTokenMode();
- expect(mode).toBe("dual");
- expect(getSessionTokenMigrationFlags(mode)).toEqual({
- dualReadWindowEnabled: true,
- hardCutoverEnabled: false,
- emergencyRollbackEnabled: false,
- });
- expect(isSessionTokenAccepted("sk-legacy-cookie", mode)).toBe(true);
- expect(isSessionTokenAccepted("sid_opaque_session_cookie", mode)).toBe(true);
- });
- it("accepts only legacy cookie in legacy mode", async () => {
- process.env.SESSION_TOKEN_MODE = "legacy";
- vi.resetModules();
- const { getSessionTokenMode, getSessionTokenMigrationFlags, isSessionTokenAccepted } =
- await import("@/lib/auth");
- const mode = getSessionTokenMode();
- expect(mode).toBe("legacy");
- expect(getSessionTokenMigrationFlags(mode)).toEqual({
- dualReadWindowEnabled: false,
- hardCutoverEnabled: false,
- emergencyRollbackEnabled: true,
- });
- expect(isSessionTokenAccepted("sk-legacy-cookie", mode)).toBe(true);
- expect(isSessionTokenAccepted("sid_opaque_session_cookie", mode)).toBe(false);
- });
- });
|