Files
gridpilot.gg/core/leagues/application/use-cases/GetLeagueRosterUseCase.test.ts
2026-01-26 11:02:19 +01:00

89 lines
4.2 KiB
TypeScript

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');
});
});