import { describe, it, expect, vi, beforeEach } from 'vitest' beforeEach(() => { vi.resetModules() }) describe('POST /api/users/transfer-code', () => { it('transfers code to authenticated user when PIN valid or not required', async () => { vi.doMock('lib/logger', () => ({ logEvent: vi.fn() })) vi.doMock('lib/appSession', () => ({ getAppSession: async () => ({ userId: 'user-1' }) })) vi.doMock('lib/supabase/server', () => ({ isSupabaseConfigured: () => true })) // Mock persistence const codeRow = { id: 'code-1', code: 'ABCDE', used: 1, user_id: null, pin_hash: null, room_id: 'room-1' } const getCodeByCodeMock = vi.fn().mockResolvedValue(codeRow) const getCodeForUserInRoomMock = vi.fn().mockResolvedValue(null) const updateCodeMock = vi.fn().mockResolvedValue({ ...codeRow, user_id: 'user-1' }) vi.doMock('lib/persistence', () => ({ getCodeByCode: getCodeByCodeMock, getCodeForUserInRoom: getCodeForUserInRoomMock, updateCode: updateCodeMock })) const route = await import('./route') const req = { json: async () => ({ code: 'ABCDE' }) } as any const res: any = await route.POST(req) expect(res.status).toBe(200) expect(getCodeByCodeMock).toHaveBeenCalled() expect(updateCodeMock).toHaveBeenCalledWith('code-1', { user_id: 'user-1', session_hash: null }) }) })