import { describe, it, expect, vi, beforeEach } from 'vitest'; import { GetLeagueRosterUseCase } from './GetLeagueRosterUseCase'; describe('GetLeagueRosterUseCase', () => { let mockLeagueRepository: any; let mockEventPublisher: any; let useCase: GetLeagueRosterUseCase; const mockLeague = { id: 'league-1' }; const mockMembers = [ { driverId: 'd1', name: 'Owner', role: 'owner', joinDate: new Date() }, { driverId: 'd2', name: 'Admin', role: 'admin', joinDate: new Date() }, { driverId: 'd3', name: 'Member', role: 'member', joinDate: new Date() }, ]; const mockRequests = [ { id: 'r1', driverId: 'd4', name: 'Requester', requestDate: new Date() }, ]; beforeEach(() => { mockLeagueRepository = { findById: vi.fn().mockResolvedValue(mockLeague), getLeagueMembers: vi.fn().mockResolvedValue(mockMembers), getPendingRequests: vi.fn().mockResolvedValue(mockRequests), }; mockEventPublisher = { emitLeagueRosterAccessed: vi.fn().mockResolvedValue(undefined), }; useCase = new GetLeagueRosterUseCase(mockLeagueRepository, mockEventPublisher); }); it('should return roster with members, requests and stats', async () => { const result = await useCase.execute({ leagueId: 'league-1' }); expect(result.members).toHaveLength(3); expect(result.pendingRequests).toHaveLength(1); expect(result.stats.adminCount).toBe(2); // owner + admin expect(result.stats.driverCount).toBe(1); expect(mockEventPublisher.emitLeagueRosterAccessed).toHaveBeenCalled(); }); it('should throw error if league not found', async () => { mockLeagueRepository.findById.mockResolvedValue(null); await expect(useCase.execute({ leagueId: 'invalid' })).rejects.toThrow('League with id invalid not found'); }); });