import { describe, it, expect, vi, beforeEach } from 'vitest' const { mockGetSession } = vi.hoisted(() => ({ mockGetSession: vi.fn() })) vi.mock('@/lib/auth', () => ({ getSession: mockGetSession, })) vi.mock('@/lib/prisma', () => ({ prisma: { product: { findMany: vi.fn() }, claudeQuestion: { findMany: vi.fn() }, }, })) vi.mock('@/lib/product-access', () => ({ productAccessFilter: vi.fn().mockReturnValue({}), getAccessibleProduct: vi.fn(), })) import { prisma } from '@/lib/prisma' import type { NextRequest } from 'next/server' import { GET } from '@/app/api/realtime/notifications/route' const mockPrisma = prisma as unknown as { product: { findMany: ReturnType } claudeQuestion: { findMany: ReturnType } } function makeReq(): NextRequest { // Minimaal NextRequest-shape voor de auth-pad — we komen niet bij de // pg-stream-setup omdat de auth-fail vóór dat punt gebeurt. return { signal: new AbortController().signal } as unknown as NextRequest } beforeEach(() => { vi.clearAllMocks() }) describe('GET /api/realtime/notifications', () => { it('401 zonder iron-session cookie, geen DB-call', async () => { mockGetSession.mockResolvedValue({ userId: undefined, isDemo: false }) const res = await GET(makeReq()) expect(res.status).toBe(401) expect(mockPrisma.product.findMany).not.toHaveBeenCalled() }) }) // Solo-route filter (entity='question' uitgesloten) is een 1-regel-fix in // app/api/realtime/solo/route.ts. Visueel reviewbaar in de diff; full-stream- // regressie wordt handmatig gedekt in ST-1108-acceptatie.