import { describe, it, expect, beforeEach } from 'vitest'; import { LeaderboardsTestContext } from '../LeaderboardsTestContext'; describe('GetDriverRankingsUseCase - Search Functionality', () => { let context: LeaderboardsTestContext; beforeEach(() => { context = LeaderboardsTestContext.create(); context.clear(); }); it('should search for drivers by name', async () => { context.repository.addDriver({ id: 'driver-1', name: 'John Smith', rating: 5.0, raceCount: 10 }); context.repository.addDriver({ id: 'driver-2', name: 'Jane Doe', rating: 4.8, raceCount: 10 }); context.repository.addDriver({ id: 'driver-3', name: 'Bob Johnson', rating: 4.5, raceCount: 10 }); const result = await context.getDriverRankingsUseCase.execute({ search: 'John' }); expect(result.drivers).toHaveLength(2); expect(result.drivers.map((d) => d.name)).toContain('John Smith'); expect(result.drivers.map((d) => d.name)).toContain('Bob Johnson'); expect(result.drivers.map((d) => d.name)).not.toContain('Jane Doe'); expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1); }); it('should search for drivers by partial name', async () => { context.repository.addDriver({ id: 'driver-1', name: 'Alexander', rating: 5.0, raceCount: 10 }); context.repository.addDriver({ id: 'driver-2', name: 'Alex', rating: 4.8, raceCount: 10 }); context.repository.addDriver({ id: 'driver-3', name: 'Alexandra', rating: 4.5, raceCount: 10 }); const result = await context.getDriverRankingsUseCase.execute({ search: 'Alex' }); expect(result.drivers).toHaveLength(3); expect(result.drivers.map((d) => d.name)).toContain('Alexander'); expect(result.drivers.map((d) => d.name)).toContain('Alex'); expect(result.drivers.map((d) => d.name)).toContain('Alexandra'); expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1); }); it('should handle case-insensitive search', async () => { context.repository.addDriver({ id: 'driver-1', name: 'John Smith', rating: 5.0, raceCount: 10 }); context.repository.addDriver({ id: 'driver-2', name: 'JOHN DOE', rating: 4.8, raceCount: 10 }); context.repository.addDriver({ id: 'driver-3', name: 'johnson', rating: 4.5, raceCount: 10 }); const result = await context.getDriverRankingsUseCase.execute({ search: 'john' }); expect(result.drivers).toHaveLength(3); expect(result.drivers.map((d) => d.name)).toContain('John Smith'); expect(result.drivers.map((d) => d.name)).toContain('JOHN DOE'); expect(result.drivers.map((d) => d.name)).toContain('johnson'); expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1); }); it('should return empty result when no drivers match search', async () => { context.repository.addDriver({ id: 'driver-1', name: 'John Smith', rating: 5.0, raceCount: 10 }); const result = await context.getDriverRankingsUseCase.execute({ search: 'NonExistentDriver' }); expect(result.drivers).toHaveLength(0); expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1); }); });