refactor use cases

This commit is contained in:
2026-01-08 15:34:51 +01:00
parent d984ab24a8
commit 52e9a2f6a7
362 changed files with 5192 additions and 8409 deletions

View File

@@ -11,7 +11,6 @@ import type { IResultRepository } from '../../domain/repositories/IResultReposit
import type { ILeagueRepository } from '../../domain/repositories/ILeagueRepository';
import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository';
import type { IDriverRepository } from '../../domain/repositories/IDriverRepository';
import type { UseCaseOutputPort } from '@core/shared/application';
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
import { Result } from '@core/shared/application/Result';
import type { Logger } from '@core/shared/application/Logger';
@@ -31,7 +30,6 @@ describe('SendPerformanceSummaryUseCase', () => {
let membershipRepository: { getMembership: Mock };
let driverRepository: { findById: Mock };
let logger: Logger;
let output: UseCaseOutputPort<SendPerformanceSummaryResult> & { present: Mock };
let useCase: SendPerformanceSummaryUseCase;
beforeEach(() => {
@@ -47,18 +45,13 @@ describe('SendPerformanceSummaryUseCase', () => {
warn: vi.fn(),
error: vi.fn(),
};
output = { present: vi.fn() } as unknown as UseCaseOutputPort<SendPerformanceSummaryResult> & { present: Mock };
useCase = new SendPerformanceSummaryUseCase(
notificationService as unknown as NotificationService,
useCase = new SendPerformanceSummaryUseCase(notificationService as unknown as NotificationService,
raceEventRepository as unknown as IRaceEventRepository,
resultRepository as unknown as IResultRepository,
leagueRepository as unknown as ILeagueRepository,
membershipRepository as unknown as ILeagueMembershipRepository,
driverRepository as unknown as IDriverRepository,
logger,
output,
);
logger);
});
const createInput = (overrides: Partial<SendPerformanceSummaryInput> = {}): SendPerformanceSummaryInput => ({
@@ -116,9 +109,7 @@ describe('SendPerformanceSummaryUseCase', () => {
}),
);
expect(output.present).toHaveBeenCalledTimes(1);
const presentedRaw = output.present.mock.calls[0]?.[0];
expect(presentedRaw).toBeDefined();
const presentedRaw = expect(presentedRaw).toBeDefined();
const presented = presentedRaw as SendPerformanceSummaryResult;
expect(presented).toEqual({
leagueId: 'league-1',
@@ -136,8 +127,7 @@ describe('SendPerformanceSummaryUseCase', () => {
const error = unwrapError(result);
expect(error.code).toBe('LEAGUE_NOT_FOUND');
expect(error.details?.message).toBe('League not found');
expect(output.present).not.toHaveBeenCalled();
});
});
it('returns RACE_NOT_FOUND when race event does not exist', async () => {
leagueRepository.findById.mockResolvedValue({ id: 'league-1' });
@@ -148,8 +138,7 @@ describe('SendPerformanceSummaryUseCase', () => {
const error = unwrapError(result);
expect(error.code).toBe('RACE_NOT_FOUND');
expect(error.details?.message).toBe('Race event not found');
expect(output.present).not.toHaveBeenCalled();
});
});
it('returns DRIVER_NOT_FOUND when driver does not exist', async () => {
leagueRepository.findById.mockResolvedValue({ id: 'league-1' });
@@ -166,8 +155,7 @@ describe('SendPerformanceSummaryUseCase', () => {
const error = unwrapError(result);
expect(error.code).toBe('DRIVER_NOT_FOUND');
expect(error.details?.message).toBe('Driver not found');
expect(output.present).not.toHaveBeenCalled();
});
});
it('returns INSUFFICIENT_PERMISSIONS when triggeredBy is not driver and not steward or higher', async () => {
leagueRepository.findById.mockResolvedValue({ id: 'league-1' });
@@ -185,8 +173,7 @@ describe('SendPerformanceSummaryUseCase', () => {
const error = unwrapError(result);
expect(error.code).toBe('INSUFFICIENT_PERMISSIONS');
expect(error.details?.message).toBe('Insufficient permissions to send performance summary');
expect(output.present).not.toHaveBeenCalled();
});
});
it('returns SUMMARY_NOT_AVAILABLE when main race session is missing or not completed', async () => {
leagueRepository.findById.mockResolvedValue({ id: 'league-1' });
@@ -203,8 +190,7 @@ describe('SendPerformanceSummaryUseCase', () => {
const error = unwrapError(result);
expect(error.code).toBe('SUMMARY_NOT_AVAILABLE');
expect(error.details?.message).toBe('Performance summary is not available for this race');
expect(output.present).not.toHaveBeenCalled();
});
});
it('returns SUMMARY_NOT_AVAILABLE when no result exists for driver', async () => {
leagueRepository.findById.mockResolvedValue({ id: 'league-1' });
@@ -223,8 +209,7 @@ describe('SendPerformanceSummaryUseCase', () => {
const error = unwrapError(result);
expect(error.code).toBe('SUMMARY_NOT_AVAILABLE');
expect(error.details?.message).toBe('Performance summary is not available for this driver');
expect(output.present).not.toHaveBeenCalled();
});
});
it('wraps repository errors into REPOSITORY_ERROR and does not present output', async () => {
const mockError = new Error('Repository failure');
@@ -235,7 +220,6 @@ describe('SendPerformanceSummaryUseCase', () => {
const error = unwrapError(result);
expect(error.code).toBe('REPOSITORY_ERROR');
expect(error.details?.message).toBe('Repository failure');
expect(output.present).not.toHaveBeenCalled();
expect(logger.error).toHaveBeenCalled();
});
});