import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; import { DemoteAdminUseCase } from './DemoteAdminUseCase'; import { LeagueRepository } from '../ports/LeagueRepository'; import { DriverRepository } from '../../../racing/domain/repositories/DriverRepository'; import { LeagueEventPublisher } from '../ports/LeagueEventPublisher'; describe('DemoteAdminUseCase', () => { let mockLeagueRepository: LeagueRepository; let mockDriverRepository: DriverRepository; let mockEventPublisher: LeagueEventPublisher; let useCase: DemoteAdminUseCase; beforeEach(() => { mockLeagueRepository = { updateLeagueMember: vi.fn().mockResolvedValue(undefined) as unknown as Mock, create: vi.fn() 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() 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() as unknown as Mock, getPendingRequests: vi.fn() as unknown as Mock, addLeagueMembers: 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, }; mockDriverRepository = { findById: vi.fn() as unknown as Mock, findByIRacingId: vi.fn() as unknown as Mock, findAll: vi.fn() as unknown as Mock, create: vi.fn() as unknown as Mock, update: vi.fn() as unknown as Mock, delete: vi.fn() as unknown as Mock, exists: vi.fn() as unknown as Mock, existsByIRacingId: 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() 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 DemoteAdminUseCase(mockLeagueRepository, mockDriverRepository, mockEventPublisher); }); it('should update member role to member', async () => { const command = { leagueId: 'l1', targetDriverId: 'd1', actorId: 'owner-1', }; await useCase.execute(command); expect(mockLeagueRepository.updateLeagueMember).toHaveBeenCalledWith('l1', 'd1', { role: 'member' }); }); });