import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; import { CreateLeagueUseCase } from './CreateLeagueUseCase'; import { LeagueCreateCommand } from '../ports/LeagueCreateCommand'; import { LeagueRepository } from '../ports/LeagueRepository'; import { LeagueEventPublisher } from '../ports/LeagueEventPublisher'; describe('CreateLeagueUseCase', () => { let mockLeagueRepository: LeagueRepository; let mockEventPublisher: LeagueEventPublisher; let useCase: CreateLeagueUseCase; beforeEach(() => { mockLeagueRepository = { create: vi.fn().mockImplementation((data) => Promise.resolve(data)) as unknown as Mock, findById: vi.fn() 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().mockResolvedValue(undefined) as unknown as Mock, getFinancials: vi.fn() as unknown as Mock, updateFinancials: vi.fn().mockResolvedValue(undefined) as unknown as Mock, getStewardingMetrics: vi.fn() as unknown as Mock, updateStewardingMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock, getPerformanceMetrics: vi.fn() as unknown as Mock, updatePerformanceMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock, getRatingMetrics: vi.fn() as unknown as Mock, updateRatingMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock, getTrendMetrics: vi.fn() as unknown as Mock, updateTrendMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock, getSuccessRateMetrics: vi.fn() as unknown as Mock, updateSuccessRateMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock, getResolutionTimeMetrics: vi.fn() as unknown as Mock, updateResolutionTimeMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock, getComplexSuccessRateMetrics: vi.fn() as unknown as Mock, updateComplexSuccessRateMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock, getComplexResolutionTimeMetrics: vi.fn() as unknown as Mock, updateComplexResolutionTimeMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock, getLeagueMembers: vi.fn() as unknown as Mock, getPendingRequests: vi.fn() 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().mockResolvedValue(undefined) 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() as unknown as Mock, getLeagueCreatedEventCount: vi.fn().mockReturnValue(0) as unknown as Mock, getLeagueUpdatedEventCount: vi.fn().mockReturnValue(0) as unknown as Mock, getLeagueDeletedEventCount: vi.fn().mockReturnValue(0) as unknown as Mock, getLeagueAccessedEventCount: vi.fn().mockReturnValue(0) as unknown as Mock, getLeagueRosterAccessedEventCount: vi.fn().mockReturnValue(0) as unknown as Mock, clear: vi.fn() as unknown as Mock, }; useCase = new CreateLeagueUseCase(mockLeagueRepository, mockEventPublisher); }); it('should create a league and initialize all metrics', async () => { const command: LeagueCreateCommand = { name: 'New League', ownerId: 'owner-1', visibility: 'public', approvalRequired: false, lateJoinAllowed: true, bonusPointsEnabled: true, penaltiesEnabled: true, protestsEnabled: true, appealsEnabled: true, }; const result = await useCase.execute(command); expect(result.name).toBe('New League'); expect(result.ownerId).toBe('owner-1'); expect(mockLeagueRepository.create).toHaveBeenCalled(); expect(mockLeagueRepository.updateStats).toHaveBeenCalled(); expect(mockLeagueRepository.updateFinancials).toHaveBeenCalled(); expect(mockEventPublisher.emitLeagueCreated).toHaveBeenCalled(); }); it('should throw error if name is missing', async () => { const command = { ownerId: 'owner-1' } as unknown as LeagueCreateCommand; await expect(useCase.execute(command)).rejects.toThrow('League name is required'); }); it('should throw error if ownerId is missing', async () => { const command = { name: 'League' } as unknown as LeagueCreateCommand; await expect(useCase.execute(command)).rejects.toThrow('Owner ID is required'); }); });