import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; import { GetLeagueRosterUseCase } from './GetLeagueRosterUseCase'; import { LeagueRepository } from '../ports/LeagueRepository'; import { LeagueEventPublisher } from '../ports/LeagueEventPublisher'; describe('GetLeagueRosterUseCase', () => { let mockLeagueRepository: LeagueRepository; let mockEventPublisher: LeagueEventPublisher; 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 = { create: vi.fn() as unknown as Mock, findById: vi.fn().mockResolvedValue(mockLeague) as unknown as Mock, findByName: vi.fn() as unknown as Mock, findByOwner: vi.fn() as unknown as Mock, search: vi.fn() as unknown as Mock, update: vi.fn() as unknown as Mock, delete: vi.fn() as unknown as Mock, getStats: vi.fn() as unknown as Mock, updateStats: vi.fn() as unknown as Mock, getFinancials: vi.fn() as unknown as Mock, updateFinancials: vi.fn() as unknown as Mock, getStewardingMetrics: vi.fn() as unknown as Mock, updateStewardingMetrics: vi.fn() as unknown as Mock, getPerformanceMetrics: vi.fn() as unknown as Mock, updatePerformanceMetrics: vi.fn() as unknown as Mock, getRatingMetrics: vi.fn() as unknown as Mock, updateRatingMetrics: vi.fn() as unknown as Mock, getTrendMetrics: vi.fn() as unknown as Mock, updateTrendMetrics: vi.fn() as unknown as Mock, getSuccessRateMetrics: vi.fn() as unknown as Mock, updateSuccessRateMetrics: vi.fn() as unknown as Mock, getResolutionTimeMetrics: vi.fn() as unknown as Mock, updateResolutionTimeMetrics: vi.fn() as unknown as Mock, getComplexSuccessRateMetrics: vi.fn() as unknown as Mock, updateComplexSuccessRateMetrics: vi.fn() as unknown as Mock, getComplexResolutionTimeMetrics: vi.fn() as unknown as Mock, updateComplexResolutionTimeMetrics: vi.fn() as unknown as Mock, getLeagueMembers: vi.fn().mockResolvedValue(mockMembers) as unknown as Mock, getPendingRequests: vi.fn().mockResolvedValue(mockRequests) as unknown as Mock, addLeagueMembers: vi.fn() as unknown as Mock, updateLeagueMember: vi.fn() as unknown as Mock, removeLeagueMember: vi.fn() as unknown as Mock, addPendingRequests: vi.fn() as unknown as Mock, removePendingRequest: vi.fn() as unknown as Mock, }; mockEventPublisher = { emitLeagueCreated: vi.fn() as unknown as Mock, emitLeagueUpdated: vi.fn() as unknown as Mock, emitLeagueDeleted: vi.fn() as unknown as Mock, emitLeagueAccessed: vi.fn() as unknown as Mock, emitLeagueRosterAccessed: vi.fn().mockResolvedValue(undefined) as unknown as Mock, getLeagueCreatedEventCount: vi.fn() as unknown as Mock, getLeagueUpdatedEventCount: vi.fn() as unknown as Mock, getLeagueDeletedEventCount: vi.fn() as unknown as Mock, getLeagueAccessedEventCount: vi.fn() as unknown as Mock, getLeagueRosterAccessedEventCount: vi.fn() as unknown as Mock, clear: vi.fn() as unknown as Mock, }; 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 as Mock).mockResolvedValue(null); await expect(useCase.execute({ leagueId: 'invalid' })).rejects.toThrow('League with id invalid not found'); }); });