refactor racing use cases

This commit is contained in:
2025-12-21 00:43:42 +01:00
parent e9d6f90bb2
commit c12656d671
308 changed files with 14401 additions and 7419 deletions

View File

@@ -1,9 +1,10 @@
import { describe, it, expect, beforeEach, vi, Mock } from 'vitest';
import { CancelRaceUseCase } from './CancelRaceUseCase';
import { CancelRaceUseCase, type CancelRaceResult } from './CancelRaceUseCase';
import type { IRaceRepository } from '../../domain/repositories/IRaceRepository';
import type { Logger } from '@core/shared/application';
import { Race } from '../../domain/entities/Race';
import { SessionType } from '../../domain/value-objects/SessionType';
import type { UseCaseOutputPort } from '@core/shared/application/UseCaseOutputPort';
describe('CancelRaceUseCase', () => {
let useCase: CancelRaceUseCase;
@@ -17,6 +18,7 @@ describe('CancelRaceUseCase', () => {
info: Mock;
error: Mock;
};
let output: UseCaseOutputPort<CancelRaceResult> & { present: Mock };
beforeEach(() => {
raceRepository = {
@@ -29,7 +31,12 @@ describe('CancelRaceUseCase', () => {
info: vi.fn(),
error: vi.fn(),
};
useCase = new CancelRaceUseCase(raceRepository as unknown as IRaceRepository, logger as unknown as Logger);
output = { present: vi.fn() } as unknown as UseCaseOutputPort<CancelRaceResult> & { present: Mock };
useCase = new CancelRaceUseCase(
raceRepository as unknown as IRaceRepository,
logger as unknown as Logger,
output,
);
});
it('should cancel race successfully', async () => {
@@ -46,21 +53,25 @@ describe('CancelRaceUseCase', () => {
raceRepository.findById.mockResolvedValue(race);
const result = await useCase.execute({ raceId });
const result = await useCase.execute({ raceId, cancelledById: 'admin-1' });
expect(result.isOk()).toBe(true);
expect(result.unwrap()).toBeUndefined();
expect(raceRepository.findById).toHaveBeenCalledWith(raceId);
expect(raceRepository.update).toHaveBeenCalledWith(expect.objectContaining({ id: raceId, status: 'cancelled' }));
expect(output.present).toHaveBeenCalledTimes(1);
expect(output.present).toHaveBeenCalledWith({ race: expect.objectContaining({ id: raceId, status: 'cancelled' }) });
});
it('should return error if race not found', async () => {
const raceId = 'race-1';
raceRepository.findById.mockResolvedValue(null);
const result = await useCase.execute({ raceId });
const result = await useCase.execute({ raceId, cancelledById: 'admin-1' });
expect(result.isErr()).toBe(true);
expect(result.unwrapErr().code).toBe('RACE_NOT_FOUND');
expect(output.present).not.toHaveBeenCalled();
});
it('should return domain error if race is already cancelled', async () => {
@@ -77,10 +88,12 @@ describe('CancelRaceUseCase', () => {
raceRepository.findById.mockResolvedValue(race);
const result = await useCase.execute({ raceId });
const result = await useCase.execute({ raceId, cancelledById: 'admin-1' });
expect(result.isErr()).toBe(true);
expect(result.unwrapErr().code).toBe('RACE_ALREADY_CANCELLED');
expect(result.unwrapErr().code).toBe('NOT_AUTHORIZED');
expect(result.unwrapErr().details?.message).toContain('already cancelled');
expect(output.present).not.toHaveBeenCalled();
});
it('should return domain error if race is completed', async () => {
@@ -97,9 +110,11 @@ describe('CancelRaceUseCase', () => {
raceRepository.findById.mockResolvedValue(race);
const result = await useCase.execute({ raceId });
const result = await useCase.execute({ raceId, cancelledById: 'admin-1' });
expect(result.isErr()).toBe(true);
expect(result.unwrapErr().code).toBe('CANNOT_CANCEL_COMPLETED_RACE');
expect(result.unwrapErr().code).toBe('NOT_AUTHORIZED');
expect(result.unwrapErr().details?.message).toContain('completed race');
expect(output.present).not.toHaveBeenCalled();
});
});