import { describe, it, expect, beforeEach, vi, Mock } from 'vitest'; import { GetAllRacesPageDataUseCase } from './GetAllRacesPageDataUseCase'; import type { IRaceRepository } from '../../domain/repositories/IRaceRepository'; import type { ILeagueRepository } from '../../domain/repositories/ILeagueRepository'; import type { Logger } from '@core/shared/application'; describe('GetAllRacesPageDataUseCase', () => { let mockRaceRepo: { findAll: Mock }; let mockLeagueRepo: { findAll: Mock }; let mockLogger: Logger; beforeEach(() => { mockRaceRepo = { findAll: vi.fn() }; mockLeagueRepo = { findAll: vi.fn() }; mockLogger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), }; }); it('should return races and filters data', async () => { const useCase = new GetAllRacesPageDataUseCase( mockRaceRepo as unknown as IRaceRepository, mockLeagueRepo as unknown as ILeagueRepository, mockLogger, ); const race1 = { id: 'race1', track: 'Track A', car: 'Car A', scheduledAt: new Date('2023-01-01T10:00:00Z'), status: 'scheduled' as const, leagueId: 'league1', strengthOfField: 5, }; const race2 = { id: 'race2', track: 'Track B', car: 'Car B', scheduledAt: new Date('2023-01-02T10:00:00Z'), status: 'completed' as const, leagueId: 'league2', strengthOfField: null, }; const league1 = { id: 'league1', name: 'League One' }; const league2 = { id: 'league2', name: 'League Two' }; mockRaceRepo.findAll.mockResolvedValue([race1, race2]); mockLeagueRepo.findAll.mockResolvedValue([league1, league2]); const result = await useCase.execute(); expect(result.isOk()).toBe(true); expect(result.value).toEqual({ races: [ { id: 'race2', track: 'Track B', car: 'Car B', scheduledAt: '2023-01-02T10:00:00.000Z', status: 'completed', leagueId: 'league2', leagueName: 'League Two', strengthOfField: null, }, { id: 'race1', track: 'Track A', car: 'Car A', scheduledAt: '2023-01-01T10:00:00.000Z', status: 'scheduled', leagueId: 'league1', leagueName: 'League One', strengthOfField: 5, }, ], filters: { statuses: [ { value: 'all', label: 'All Statuses' }, { value: 'scheduled', label: 'Scheduled' }, { value: 'running', label: 'Live' }, { value: 'completed', label: 'Completed' }, { value: 'cancelled', label: 'Cancelled' }, ], leagues: [ { id: 'league1', name: 'League One' }, { id: 'league2', name: 'League Two' }, ], }, }); }); it('should return empty result when no races or leagues', async () => { const useCase = new GetAllRacesPageDataUseCase( mockRaceRepo as unknown as IRaceRepository, mockLeagueRepo as unknown as ILeagueRepository, mockLogger, ); mockRaceRepo.findAll.mockResolvedValue([]); mockLeagueRepo.findAll.mockResolvedValue([]); const result = await useCase.execute(); expect(result.isOk()).toBe(true); expect(result.value).toEqual({ races: [], filters: { statuses: [ { value: 'all', label: 'All Statuses' }, { value: 'scheduled', label: 'Scheduled' }, { value: 'running', label: 'Live' }, { value: 'completed', label: 'Completed' }, { value: 'cancelled', label: 'Cancelled' }, ], leagues: [], }, }); }); it('should return error when repository throws', async () => { const useCase = new GetAllRacesPageDataUseCase( mockRaceRepo as unknown as IRaceRepository, mockLeagueRepo as unknown as ILeagueRepository, mockLogger, ); const error = new Error('Repository error'); mockRaceRepo.findAll.mockRejectedValue(error); const result = await useCase.execute(); expect(result.isErr()).toBe(true); expect(result.unwrapErr().message).toBe('Repository error'); }); });