import { describe, it, expect, vi, type Mock } from 'vitest'; import { HandleAuthCallbackUseCase } from './HandleAuthCallbackUseCase'; import type { IdentityProviderPort } from '../ports/IdentityProviderPort'; import type { IdentitySessionPort } from '../ports/IdentitySessionPort'; import type { AuthCallbackCommandDTO } from '../dto/AuthCallbackCommandDTO'; import type { AuthenticatedUserDTO } from '../dto/AuthenticatedUserDTO'; import type { AuthSessionDTO } from '../dto/AuthSessionDTO'; describe('HandleAuthCallbackUseCase', () => { let provider: { completeAuth: Mock; }; let sessionPort: { createSession: Mock; getCurrentSession: Mock; clearSession: Mock; }; let useCase: HandleAuthCallbackUseCase; beforeEach(() => { provider = { completeAuth: vi.fn(), }; sessionPort = { createSession: vi.fn(), getCurrentSession: vi.fn(), clearSession: vi.fn(), }; useCase = new HandleAuthCallbackUseCase( provider as unknown as IdentityProviderPort, sessionPort as unknown as IdentitySessionPort, ); }); it('completes auth and creates a session', async () => { const command: AuthCallbackCommandDTO = { code: 'auth-code', state: 'state-123', redirectUri: 'https://app/callback', }; const user: AuthenticatedUserDTO = { id: 'user-1', email: 'test@example.com', displayName: 'Test User', }; const session: AuthSessionDTO = { user, issuedAt: Date.now(), expiresAt: Date.now() + 1000, token: 'session-token', }; provider.completeAuth.mockResolvedValue(user); sessionPort.createSession.mockResolvedValue(session); const result = await useCase.execute(command); expect(provider.completeAuth).toHaveBeenCalledWith(command); expect(sessionPort.createSession).toHaveBeenCalledWith(user); expect(result).toEqual(session); }); });