diff --git a/core/admin/domain/errors/AdminDomainError.ts b/core/admin/domain/errors/AdminDomainError.ts index 00046fe4b..12cba6f0f 100644 --- a/core/admin/domain/errors/AdminDomainError.ts +++ b/core/admin/domain/errors/AdminDomainError.ts @@ -7,6 +7,7 @@ export abstract class AdminDomainError extends Error implements DomainError { id: 'race-2', trackName: 'Track B', carType: 'GT3', - scheduledDate: new Date('2026-01-25T10:00:00.000Z'), // Future + scheduledDate: new Date('2026-01-26T10:00:00.000Z'), // Future }, ] as RaceData[]); @@ -295,13 +295,13 @@ describe('GetDashboardUseCase', () => { id: 'race-1', trackName: 'Track A', carType: 'GT3', - scheduledDate: new Date('2026-01-25T10:00:00.000Z'), + scheduledDate: new Date('2026-01-26T10:00:00.000Z'), }, { id: 'race-2', trackName: 'Track B', carType: 'GT4', - scheduledDate: new Date('2026-01-26T10:00:00.000Z'), + scheduledDate: new Date('2026-01-27T10:00:00.000Z'), }, ] as RaceData[]); diff --git a/core/health/use-cases/CheckApiHealthUseCase.ts b/core/health/use-cases/CheckApiHealthUseCase.ts index e48e1d49e..b2b6743ea 100644 --- a/core/health/use-cases/CheckApiHealthUseCase.ts +++ b/core/health/use-cases/CheckApiHealthUseCase.ts @@ -34,15 +34,21 @@ export class CheckApiHealthUseCase { timestamp: result.timestamp, }); } else { + const error = result.error || 'Unknown error'; await eventPublisher.publishHealthCheckFailed({ - error: result.error || 'Unknown error', + error, timestamp: result.timestamp, }); + // Return result with error property + return { + ...result, + error, + }; } return result; } catch (error) { - const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + const errorMessage = error instanceof Error ? error.message : (error ? String(error) : 'Unknown error'); const timestamp = new Date(); // Emit failed event diff --git a/core/payments/application/use-cases/GetSponsorBillingUseCase.test.ts b/core/payments/application/use-cases/GetSponsorBillingUseCase.test.ts index a2d843273..b1513ca1e 100644 --- a/core/payments/application/use-cases/GetSponsorBillingUseCase.test.ts +++ b/core/payments/application/use-cases/GetSponsorBillingUseCase.test.ts @@ -5,11 +5,13 @@ import { describe, expect, it, vi, type Mock } from 'vitest'; import type { Payment } from '../../domain/entities/Payment'; import { PayerType, PaymentStatus, PaymentType } from '../../domain/entities/Payment'; import type { PaymentRepository } from '../../domain/repositories/PaymentRepository'; +import type { SponsorRepository } from '@core/racing/domain/repositories/SponsorRepository'; import { GetSponsorBillingUseCase, type GetSponsorBillingInput } from './GetSponsorBillingUseCase'; describe('GetSponsorBillingUseCase', () => { let paymentRepository: { findByFilters: Mock }; let seasonSponsorshipRepository: { findBySponsorId: Mock }; + let sponsorRepository: { findById: Mock }; let useCase: GetSponsorBillingUseCase; beforeEach(() => { @@ -21,15 +23,26 @@ describe('GetSponsorBillingUseCase', () => { findBySponsorId: vi.fn(), }; + sponsorRepository = { + findById: vi.fn(), + }; + useCase = new GetSponsorBillingUseCase( paymentRepository as unknown as PaymentRepository, seasonSponsorshipRepository as unknown as SeasonSponsorshipRepository, + sponsorRepository as unknown as SponsorRepository, ); }); it('derives invoices and stats from payments and sponsorships', async () => { const sponsorId = 'sponsor-1'; + // Mock sponsor exists + sponsorRepository.findById.mockResolvedValue({ + id: sponsorId, + name: 'Test Sponsor', + }); + const payments: Payment[] = [ { id: 'pay-1', diff --git a/core/racing/domain/entities/result/Position.ts b/core/racing/domain/entities/result/Position.ts index 9583f7e37..58d592ecb 100644 --- a/core/racing/domain/entities/result/Position.ts +++ b/core/racing/domain/entities/result/Position.ts @@ -4,8 +4,8 @@ export class Position { private constructor(private readonly value: number) {} static create(value: number): Position { - if (!Number.isInteger(value) || value < 0) { - throw new RacingDomainValidationError('Position must be a non-negative integer'); + if (!Number.isInteger(value) || value <= 0) { + throw new RacingDomainValidationError('Position must be a positive integer'); } return new Position(value); } diff --git a/core/racing/domain/entities/result/Result.test.ts b/core/racing/domain/entities/result/Result.test.ts index d2ad88f0f..ea0d1cc47 100644 --- a/core/racing/domain/entities/result/Result.test.ts +++ b/core/racing/domain/entities/result/Result.test.ts @@ -26,6 +26,7 @@ describe('Result', () => { fastestLap: validFastestLap, incidents: validIncidents, startPosition: validStartPosition, + points: 10, }; const result = Result.create(props); @@ -37,6 +38,7 @@ describe('Result', () => { expect(result.fastestLap.toNumber()).toBe(validFastestLap); expect(result.incidents.toNumber()).toBe(validIncidents); expect(result.startPosition.toNumber()).toBe(validStartPosition); + expect(result.points).toBe(10); }); it('should throw error for empty id', () => { @@ -48,6 +50,7 @@ describe('Result', () => { fastestLap: validFastestLap, incidents: validIncidents, startPosition: validStartPosition, + points: 10, }; expect(() => Result.create(props)).toThrow(RacingDomainValidationError); @@ -62,6 +65,7 @@ describe('Result', () => { fastestLap: validFastestLap, incidents: validIncidents, startPosition: validStartPosition, + points: 10, }; expect(() => Result.create(props)).toThrow(RacingDomainValidationError);