import { vi } from "vitest"; import type { Db } from "@/infra/db/types"; import { MemoryCoordinator } from "@/infra/redis/memory"; import { MemoryStorage } from "@/infra/storage/memory"; import { signDevSession } from "@/server/auth/dev-session"; export type FakeCookie = { name: string; value: string }; /** * Jar de cookies no formato que `next/headers` entrega. Permite exercitar as * rotas reais, com o caminho real de autenticação, sem subir um servidor. */ export class FakeJar { private readonly store = new Map(); get(name: string): FakeCookie | undefined { const value = this.store.get(name); return value === undefined ? undefined : { name, value }; } getAll(): FakeCookie[] { return [...this.store.entries()].map(([name, value]) => ({ name, value })); } set(name: string, value: string): void { this.store.set(name, value); } delete(name: string): void { this.store.delete(name); } has(name: string): boolean { return this.store.has(name); } } export const jar = new FakeJar(); /** Sessão local assinada. Só existe porque os testes rodam em development. */ export function signIn(userId: string, workspaceId: string): void { jar.set("adapter_dev_session", signDevSession(userId, workspaceId)); } export function signOut(): void { for (const cookie of jar.getAll()) jar.delete(cookie.name); } /** Dependências do módulo em memória, para não escrever em disco nos testes. */ export function makeRuntimeDeps(db: Db) { const storage = new MemoryStorage(); const coordinator = new MemoryCoordinator(); return { deps: { db, storage, coordinator, ttlSeconds: 3600 }, storage, coordinator, }; } export function installNextHeadersMock(): void { vi.mock("next/headers", () => ({ cookies: async () => jar, headers: async () => new Headers(), })); } export async function readJson(response: Response): Promise { return (await response.json()) as T; }