import { describe, it, expect, beforeEach } from 'vitest'; import { LeaderboardsTestContext } from '../LeaderboardsTestContext'; describe('GetTeamRankingsUseCase - Success Path', () => { let context: LeaderboardsTestContext; beforeEach(() => { context = LeaderboardsTestContext.create(); context.clear(); }); it('should retrieve all teams with complete data', async () => { context.repository.addTeam({ id: 'team-1', name: 'Racing Team A', rating: 4.9, memberCount: 5, raceCount: 100 }); context.repository.addTeam({ id: 'team-2', name: 'Speed Squad', rating: 4.7, memberCount: 3, raceCount: 80 }); context.repository.addTeam({ id: 'team-3', name: 'Champions League', rating: 4.3, memberCount: 4, raceCount: 60 }); const result = await context.getTeamRankingsUseCase.execute({}); expect(result.teams).toHaveLength(3); expect(result.teams[0]).toMatchObject({ rank: 1, id: 'team-1', name: 'Racing Team A', rating: 4.9, memberCount: 5, raceCount: 100, }); expect(result.teams[0].rating).toBe(4.9); expect(result.teams[1].rating).toBe(4.7); expect(result.teams[2].rating).toBe(4.3); expect(context.eventPublisher.getTeamRankingsAccessedEventCount()).toBe(1); }); it('should retrieve teams with pagination', async () => { for (let i = 1; i <= 25; i++) { context.repository.addTeam({ id: `team-${i}`, name: `Team ${i}`, rating: 5.0 - i * 0.1, memberCount: 2 + i, raceCount: 20 + i, }); } const result = await context.getTeamRankingsUseCase.execute({ page: 1, limit: 20 }); expect(result.teams).toHaveLength(20); expect(result.pagination.total).toBe(25); expect(result.pagination.page).toBe(1); expect(result.pagination.limit).toBe(20); expect(result.pagination.totalPages).toBe(2); expect(context.eventPublisher.getTeamRankingsAccessedEventCount()).toBe(1); }); it('should retrieve teams with accurate data', async () => { context.repository.addTeam({ id: 'team-1', name: 'Racing Team A', rating: 4.9, memberCount: 5, raceCount: 100 }); const result = await context.getTeamRankingsUseCase.execute({}); expect(result.teams[0].rating).toBeGreaterThan(0); expect(typeof result.teams[0].rating).toBe('number'); expect(result.teams[0].rank).toBe(1); expect(result.teams[0].name).toBeTruthy(); expect(typeof result.teams[0].name).toBe('string'); expect(result.teams[0].memberCount).toBeGreaterThan(0); expect(context.eventPublisher.getTeamRankingsAccessedEventCount()).toBe(1); }); });