import { describe, it, expect, beforeAll, beforeEach } from 'vitest'; import { RacesTestContext } from '../RacesTestContext'; import { GetRacePenaltiesUseCase } from '../../../../core/racing/application/use-cases/GetRacePenaltiesUseCase'; import { Driver } from '../../../../core/racing/domain/entities/Driver'; import { Penalty } from '../../../../core/racing/domain/entities/penalty/Penalty'; describe('GetRacePenaltiesUseCase', () => { let context: RacesTestContext; let getRacePenaltiesUseCase: GetRacePenaltiesUseCase; beforeAll(() => { context = RacesTestContext.create(); getRacePenaltiesUseCase = new GetRacePenaltiesUseCase( context.penaltyRepository, context.driverRepository ); }); beforeEach(async () => { await context.clear(); }); it('should retrieve race penalties with driver information', async () => { // Given: A race with penalties const leagueId = 'l1'; const raceId = 'r1'; const driverId = 'd1'; const stewardId = 's1'; const driver = Driver.create({ id: driverId, iracingId: '100', name: 'John Doe', country: 'US' }); await context.driverRepository.create(driver); const steward = Driver.create({ id: stewardId, iracingId: '200', name: 'Steward', country: 'UK' }); await context.driverRepository.create(steward); const penalty = Penalty.create({ id: 'p1', leagueId, raceId, driverId, type: 'time_penalty', value: 5, reason: 'Track limits', issuedBy: stewardId, status: 'applied' }); await context.penaltyRepository.create(penalty); // When: GetRacePenaltiesUseCase.execute() is called const result = await getRacePenaltiesUseCase.execute({ raceId }); // Then: It should return penalties and drivers expect(result.isOk()).toBe(true); const data = result.unwrap(); expect(data.penalties).toHaveLength(1); expect(data.drivers.some(d => d.id === driverId)).toBe(true); expect(data.drivers.some(d => d.id === stewardId)).toBe(true); }); });