refactor driver module (wip)

This commit is contained in:
2025-12-22 01:43:34 +01:00
parent b445d6dd37
commit e7dbec4a85
31 changed files with 379 additions and 395 deletions

View File

@@ -1,16 +1,13 @@
import { CompleteDriverOnboardingUseCase } from '@core/racing/application/use-cases/CompleteDriverOnboardingUseCase';
import type { Driver } from '@core/racing/domain/entities/Driver';
import { GetDriversLeaderboardUseCase, type GetDriversLeaderboardResult } from '@core/racing/application/use-cases/GetDriversLeaderboardUseCase';
import { GetTotalDriversUseCase } from '@core/racing/application/use-cases/GetTotalDriversUseCase';
import { IsDriverRegisteredForRaceUseCase } from '@core/racing/application/use-cases/IsDriverRegisteredForRaceUseCase';
import type { Logger } from '@core/shared/application';
import { Result } from '@core/shared/application/Result';
import { Test, TestingModule } from '@nestjs/testing';
import { vi } from 'vitest';
import { DriverService } from './DriverService';
import { GetDriversLeaderboardUseCase } from '@core/racing/application/use-cases/GetDriversLeaderboardUseCase';
import { GetTotalDriversUseCase } from '@core/racing/application/use-cases/GetTotalDriversUseCase';
import { CompleteDriverOnboardingUseCase } from '@core/racing/application/use-cases/CompleteDriverOnboardingUseCase';
import { IsDriverRegisteredForRaceUseCase } from '@core/racing/application/use-cases/IsDriverRegisteredForRaceUseCase';
import { UpdateDriverProfileUseCase } from '@core/racing/application/use-cases/UpdateDriverProfileUseCase';
import type { Logger } from '@core/shared/application';
import type { IDriverRepository } from '@core/racing/domain/repositories/IDriverRepository';
import { Result } from '@core/shared/application/Result';
import type { CompleteDriverOnboardingOutputPort } from '@core/racing/application/ports/output/CompleteDriverOnboardingOutputPort';
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
describe('DriverService', () => {
let service: DriverService;
@@ -18,10 +15,6 @@ describe('DriverService', () => {
let getTotalDriversUseCase: ReturnType<typeof vi.mocked<GetTotalDriversUseCase>>;
let completeDriverOnboardingUseCase: ReturnType<typeof vi.mocked<CompleteDriverOnboardingUseCase>>;
let isDriverRegisteredForRaceUseCase: ReturnType<typeof vi.mocked<IsDriverRegisteredForRaceUseCase>>;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
let updateDriverProfileUseCase: ReturnType<typeof vi.mocked<UpdateDriverProfileUseCase>>;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
let driverRepository: ReturnType<typeof vi.mocked<IDriverRepository>>;
let logger: ReturnType<typeof vi.mocked<Logger>>;
beforeEach(async () => {
@@ -58,6 +51,12 @@ describe('DriverService', () => {
execute: vi.fn(),
},
},
{
provide: 'GetProfileOverviewUseCase',
useValue: {
execute: vi.fn(),
},
},
{
provide: 'IDriverRepository',
useValue: {
@@ -79,8 +78,6 @@ describe('DriverService', () => {
getTotalDriversUseCase = vi.mocked(module.get('GetTotalDriversUseCase'));
completeDriverOnboardingUseCase = vi.mocked(module.get('CompleteDriverOnboardingUseCase'));
isDriverRegisteredForRaceUseCase = vi.mocked(module.get('IsDriverRegisteredForRaceUseCase'));
updateDriverProfileUseCase = vi.mocked(module.get('UpdateDriverProfileUseCase'));
driverRepository = vi.mocked(module.get('IDriverRepository'));
logger = vi.mocked(module.get('Logger'));
});
@@ -107,11 +104,27 @@ describe('DriverService', () => {
activeCount: 1,
};
getDriversLeaderboardUseCase.execute.mockResolvedValue(Result.ok(mockViewModel));
const businessResult = {
items: mockViewModel.drivers.map(dto => ({
driver: { id: dto.id, name: dto.name, country: dto.nationality },
rating: dto.rating,
skillLevel: dto.skillLevel,
racesCompleted: dto.racesCompleted,
wins: dto.wins,
podiums: dto.podiums,
isActive: dto.isActive,
rank: dto.rank,
avatarUrl: dto.avatarUrl,
})),
totalRaces: mockViewModel.totalRaces,
totalWins: mockViewModel.totalWins,
activeCount: mockViewModel.activeCount,
};
getDriversLeaderboardUseCase.execute.mockResolvedValue(Result.ok(businessResult as unknown as GetDriversLeaderboardResult));
const result = await service.getDriversLeaderboard();
expect(getDriversLeaderboardUseCase.execute).toHaveBeenCalledWith();
expect(getDriversLeaderboardUseCase.execute).toHaveBeenCalledWith({});
expect(logger.debug).toHaveBeenCalledWith('[DriverService] Fetching drivers leaderboard.');
expect(result).toEqual(mockViewModel);
});
@@ -125,7 +138,7 @@ describe('DriverService', () => {
const result = await service.getTotalDrivers();
expect(getTotalDriversUseCase.execute).toHaveBeenCalledWith();
expect(getTotalDriversUseCase.execute).toHaveBeenCalledWith({});
expect(logger.debug).toHaveBeenCalledWith('[DriverService] Fetching total drivers count.');
expect(result).toEqual(mockOutput);
});
@@ -138,12 +151,11 @@ describe('DriverService', () => {
lastName: 'Doe',
displayName: 'John Doe',
country: 'US',
timezone: 'America/New_York',
bio: 'Racing enthusiast',
};
completeDriverOnboardingUseCase.execute.mockResolvedValue(
Result.ok<CompleteDriverOnboardingOutputPort, ApplicationErrorCode<string>>({ driverId: 'user-123' })
Result.ok({ driver: { id: 'user-123' } as Driver })
);
const result = await service.completeOnboarding('user-123', input);
@@ -165,12 +177,11 @@ describe('DriverService', () => {
lastName: 'Doe',
displayName: 'John Doe',
country: 'US',
timezone: 'America/New_York',
bio: 'Racing enthusiast',
};
completeDriverOnboardingUseCase.execute.mockResolvedValue(
Result.err<CompleteDriverOnboardingOutputPort, ApplicationErrorCode<string>>({ code: 'DRIVER_ALREADY_EXISTS' })
Result.err({ code: 'DRIVER_ALREADY_EXISTS', details: { message: 'Driver already exists' } })
);
const result = await service.completeOnboarding('user-123', input);