import { describe, it, expect, beforeEach } from 'vitest'; import { LeaderboardsTestContext } from '../LeaderboardsTestContext'; describe('GetDriverRankingsUseCase - Success Path', () => { let context: LeaderboardsTestContext; beforeEach(() => { context = LeaderboardsTestContext.create(); context.clear(); }); it('should retrieve all drivers with complete data', async () => { context.repository.addDriver({ id: 'driver-1', name: 'John Smith', rating: 5.0, teamId: 'team-1', teamName: 'Racing Team A', raceCount: 50, }); context.repository.addDriver({ id: 'driver-2', name: 'Jane Doe', rating: 4.8, teamId: 'team-2', teamName: 'Speed Squad', raceCount: 45, }); context.repository.addDriver({ id: 'driver-3', name: 'Bob Johnson', rating: 4.5, teamId: 'team-1', teamName: 'Racing Team A', raceCount: 40, }); const result = await context.getDriverRankingsUseCase.execute({}); expect(result.drivers).toHaveLength(3); expect(result.drivers[0]).toMatchObject({ rank: 1, id: 'driver-1', name: 'John Smith', rating: 5.0, teamId: 'team-1', teamName: 'Racing Team A', raceCount: 50, }); expect(result.drivers[0].rating).toBe(5.0); expect(result.drivers[1].rating).toBe(4.8); expect(result.drivers[2].rating).toBe(4.5); expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1); }); it('should retrieve drivers with pagination', async () => { for (let i = 1; i <= 25; i++) { context.repository.addDriver({ id: `driver-${i}`, name: `Driver ${i}`, rating: 5.0 - i * 0.1, raceCount: 10 + i, }); } const result = await context.getDriverRankingsUseCase.execute({ page: 1, limit: 20 }); expect(result.drivers).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.getDriverRankingsAccessedEventCount()).toBe(1); }); it('should retrieve drivers with different page sizes', async () => { for (let i = 1; i <= 60; i++) { context.repository.addDriver({ id: `driver-${i}`, name: `Driver ${i}`, rating: 5.0 - i * 0.1, raceCount: 10 + i, }); } const result = await context.getDriverRankingsUseCase.execute({ limit: 50 }); expect(result.drivers).toHaveLength(50); expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1); }); it('should retrieve drivers with consistent ranking order', async () => { context.repository.addDriver({ id: 'driver-1', name: 'Driver A', rating: 5.0, raceCount: 10 }); context.repository.addDriver({ id: 'driver-2', name: 'Driver B', rating: 4.8, raceCount: 10 }); context.repository.addDriver({ id: 'driver-3', name: 'Driver C', rating: 4.5, raceCount: 10 }); const result = await context.getDriverRankingsUseCase.execute({}); expect(result.drivers[0].rank).toBe(1); expect(result.drivers[1].rank).toBe(2); expect(result.drivers[2].rank).toBe(3); const ranks = result.drivers.map((d) => d.rank); expect(new Set(ranks).size).toBe(ranks.length); for (let i = 0; i < ranks.length; i++) { expect(ranks[i]).toBe(i + 1); } expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1); }); it('should retrieve drivers with accurate data', async () => { context.repository.addDriver({ id: 'driver-1', name: 'John Smith', rating: 5.0, teamId: 'team-1', teamName: 'Racing Team A', raceCount: 50, }); const result = await context.getDriverRankingsUseCase.execute({}); expect(result.drivers[0].rating).toBeGreaterThan(0); expect(typeof result.drivers[0].rating).toBe('number'); expect(result.drivers[0].rank).toBe(1); expect(result.drivers[0].name).toBeTruthy(); expect(typeof result.drivers[0].name).toBe('string'); expect(result.drivers[0].teamId).toBe('team-1'); expect(result.drivers[0].teamName).toBe('Racing Team A'); expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1); }); });