website refactor

This commit is contained in:
2026-01-16 11:18:30 +01:00
parent d6b94e21df
commit 63dfa58bcb

View File

@@ -1,41 +1,79 @@
import { describe, expect, it, vi } from 'vitest'; /* eslint-disable @typescript-eslint/no-explicit-any */
import { describe, expect, it, vi, beforeEach } from 'vitest';
import { Result } from '@core/shared/application/Result'; import { Result } from '@core/shared/application/Result';
import { DriverService } from './DriverService'; import { DriverService } from './DriverService';
describe('DriverService', () => { describe('DriverService', () => {
const logger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() }; const logger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() };
// Mocks for use cases
const getDriversLeaderboardUseCase = { execute: vi.fn() };
const getTotalDriversUseCase = { execute: vi.fn() };
const getDriverLiveriesUseCase = { execute: vi.fn() };
const completeDriverOnboardingUseCase = { execute: vi.fn() };
const isDriverRegisteredForRaceUseCase = { execute: vi.fn() };
const updateDriverProfileUseCase = { execute: vi.fn() };
const getProfileOverviewUseCase = { execute: vi.fn() };
// Mock for repository
const driverRepository = { findById: vi.fn() };
// Mocks for presenters
const driversLeaderboardPresenter = { present: vi.fn(), getResponseModel: vi.fn() };
const driverStatsPresenter = { present: vi.fn(), getResponseModel: vi.fn() };
const completeOnboardingPresenter = { getResponseModel: vi.fn() };
const driverRegistrationStatusPresenter = { getResponseModel: vi.fn() };
const driverPresenter = { present: vi.fn(), getResponseModel: vi.fn() };
const driverProfilePresenter = { getResponseModel: vi.fn() };
const getDriverLiveriesPresenter = { present: vi.fn(), getResponseModel: vi.fn() };
it('getDriversLeaderboard executes use case and returns presenter model', async () => { beforeEach(() => {
const getDriversLeaderboardUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; vi.clearAllMocks();
const driversLeaderboardPresenter = {
setMediaResolver: vi.fn(), // Default successful responses
setBaseUrl: vi.fn(), getDriversLeaderboardUseCase.execute.mockResolvedValue(Result.ok(undefined));
present: vi.fn(), getTotalDriversUseCase.execute.mockResolvedValue(Result.ok(undefined));
getResponseModel: vi.fn(() => ({ items: [] })) getDriverLiveriesUseCase.execute.mockResolvedValue(Result.ok(undefined));
}; completeDriverOnboardingUseCase.execute.mockResolvedValue(Result.ok(undefined));
const driverPresenter = { isDriverRegisteredForRaceUseCase.execute.mockResolvedValue(Result.ok(undefined));
setMediaResolver: vi.fn(), updateDriverProfileUseCase.execute.mockResolvedValue(Result.ok(undefined));
setBaseUrl: vi.fn(), getProfileOverviewUseCase.execute.mockResolvedValue(Result.ok(undefined));
present: vi.fn(),
getResponseModel: vi.fn(() => null) driverRepository.findById.mockResolvedValue(null);
};
driversLeaderboardPresenter.getResponseModel.mockReturnValue({ items: [] });
driverStatsPresenter.getResponseModel.mockReturnValue({ totalDrivers: 0 });
completeOnboardingPresenter.getResponseModel.mockReturnValue({ success: true });
driverRegistrationStatusPresenter.getResponseModel.mockReturnValue({ isRegistered: false });
driverPresenter.getResponseModel.mockReturnValue(null);
driverProfilePresenter.getResponseModel.mockReturnValue({ profile: {} });
getDriverLiveriesPresenter.getResponseModel.mockReturnValue({ liveries: [] });
});
const service = new DriverService( const createService = () => {
return new DriverService(
getDriversLeaderboardUseCase as any, getDriversLeaderboardUseCase as any,
{ execute: vi.fn() } as any, getTotalDriversUseCase as any,
{ execute: vi.fn() } as any, getDriverLiveriesUseCase as any,
{ execute: vi.fn() } as any, completeDriverOnboardingUseCase as any,
{ execute: vi.fn() } as any, isDriverRegisteredForRaceUseCase as any,
{ execute: vi.fn() } as any, updateDriverProfileUseCase as any,
{ findById: vi.fn() } as any, getProfileOverviewUseCase as any,
driverRepository as any,
logger as any, logger as any,
driversLeaderboardPresenter as any, driversLeaderboardPresenter as any,
{ getResponseModel: vi.fn(() => ({ totalDrivers: 0 })) } as any, driverStatsPresenter as any,
{ getResponseModel: vi.fn(() => ({ success: true })) } as any, completeOnboardingPresenter as any,
{ getResponseModel: vi.fn(() => ({ isRegistered: false })) } as any, driverRegistrationStatusPresenter as any,
driverPresenter as any, driverPresenter as any,
{ getResponseModel: vi.fn(() => ({ profile: {} })) } as any, driverProfilePresenter as any,
getDriverLiveriesPresenter as any,
); );
};
it('getDriversLeaderboard executes use case and returns presenter model', async () => {
const service = createService();
driversLeaderboardPresenter.getResponseModel.mockReturnValue({ items: [] });
await expect(service.getDriversLeaderboard()).resolves.toEqual({ items: [] }); await expect(service.getDriversLeaderboard()).resolves.toEqual({ items: [] });
expect(getDriversLeaderboardUseCase.execute).toHaveBeenCalledWith({}); expect(getDriversLeaderboardUseCase.execute).toHaveBeenCalledWith({});
@@ -43,34 +81,8 @@ describe('DriverService', () => {
}); });
it('getTotalDrivers executes use case and returns presenter model', async () => { it('getTotalDrivers executes use case and returns presenter model', async () => {
const getTotalDriversUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; const service = createService();
const driverStatsPresenter = { driverStatsPresenter.getResponseModel.mockReturnValue({ totalDrivers: 123 });
present: vi.fn(),
getResponseModel: vi.fn(() => ({ totalDrivers: 123 }))
};
const driverPresenter = {
setMediaResolver: vi.fn(),
setBaseUrl: vi.fn(),
present: vi.fn(),
getResponseModel: vi.fn(() => null)
};
const service = new DriverService(
{ execute: vi.fn() } as any,
getTotalDriversUseCase as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ findById: vi.fn() } as any,
logger as any,
{ getResponseModel: vi.fn(() => ({ items: [] })) } as any,
driverStatsPresenter as any,
{ getResponseModel: vi.fn(() => ({ success: true })) } as any,
{ getResponseModel: vi.fn(() => ({ isRegistered: false })) } as any,
driverPresenter as any,
{ getResponseModel: vi.fn(() => ({ profile: {} })) } as any,
);
await expect(service.getTotalDrivers()).resolves.toEqual({ totalDrivers: 123 }); await expect(service.getTotalDrivers()).resolves.toEqual({ totalDrivers: 123 });
expect(getTotalDriversUseCase.execute).toHaveBeenCalledWith({}); expect(getTotalDriversUseCase.execute).toHaveBeenCalledWith({});
@@ -78,30 +90,7 @@ describe('DriverService', () => {
}); });
it('completeOnboarding passes optional bio only when provided', async () => { it('completeOnboarding passes optional bio only when provided', async () => {
const completeDriverOnboardingUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; const service = createService();
const driverPresenter = {
setMediaResolver: vi.fn(),
setBaseUrl: vi.fn(),
present: vi.fn(),
getResponseModel: vi.fn(() => null)
};
const service = new DriverService(
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
completeDriverOnboardingUseCase as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ findById: vi.fn() } as any,
logger as any,
{ getResponseModel: vi.fn(() => ({ items: [] })) } as any,
{ getResponseModel: vi.fn(() => ({ totalDrivers: 0 })) } as any,
{ getResponseModel: vi.fn(() => ({ success: true })) } as any,
{ getResponseModel: vi.fn(() => ({ isRegistered: false })) } as any,
driverPresenter as any,
{ getResponseModel: vi.fn(() => ({ profile: {} })) } as any,
);
await service.completeOnboarding('u1', { await service.completeOnboarding('u1', {
firstName: 'F', firstName: 'F',
@@ -139,31 +128,8 @@ describe('DriverService', () => {
}); });
it('getDriverRegistrationStatus passes raceId and driverId and returns presenter model', async () => { it('getDriverRegistrationStatus passes raceId and driverId and returns presenter model', async () => {
const isDriverRegisteredForRaceUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; const service = createService();
const driverRegistrationStatusPresenter = { getResponseModel: vi.fn(() => ({ isRegistered: true })) }; driverRegistrationStatusPresenter.getResponseModel.mockReturnValue({ isRegistered: true });
const driverPresenter = {
setMediaResolver: vi.fn(),
setBaseUrl: vi.fn(),
present: vi.fn(),
getResponseModel: vi.fn(() => null)
};
const service = new DriverService(
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
isDriverRegisteredForRaceUseCase as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ findById: vi.fn() } as any,
logger as any,
{ getResponseModel: vi.fn(() => ({ items: [] })) } as any,
{ getResponseModel: vi.fn(() => ({ totalDrivers: 0 })) } as any,
{ getResponseModel: vi.fn(() => ({ success: true })) } as any,
driverRegistrationStatusPresenter as any,
driverPresenter as any,
{ getResponseModel: vi.fn(() => ({ profile: {} })) } as any,
);
await expect( await expect(
service.getDriverRegistrationStatus({ raceId: 'r1', driverId: 'd1' } as any), service.getDriverRegistrationStatus({ raceId: 'r1', driverId: 'd1' } as any),
@@ -174,30 +140,8 @@ describe('DriverService', () => {
}); });
it('getCurrentDriver calls repository and returns presenter model', async () => { it('getCurrentDriver calls repository and returns presenter model', async () => {
const driverRepository = { findById: vi.fn(async () => null) }; const service = createService();
const driverPresenter = { driverRepository.findById.mockResolvedValue(null);
setMediaResolver: vi.fn(),
setBaseUrl: vi.fn(),
present: vi.fn(),
getResponseModel: vi.fn(() => null)
};
const service = new DriverService(
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
driverRepository as any,
logger as any,
{ getResponseModel: vi.fn(() => ({ items: [] })) } as any,
{ getResponseModel: vi.fn(() => ({ totalDrivers: 0 })) } as any,
{ getResponseModel: vi.fn(() => ({ success: true })) } as any,
{ getResponseModel: vi.fn(() => ({ isRegistered: false })) } as any,
driverPresenter as any,
{ getResponseModel: vi.fn(() => ({ profile: {} })) } as any,
);
await expect(service.getCurrentDriver('u1')).resolves.toBeNull(); await expect(service.getCurrentDriver('u1')).resolves.toBeNull();
expect(driverRepository.findById).toHaveBeenCalledWith('u1'); expect(driverRepository.findById).toHaveBeenCalledWith('u1');
@@ -205,30 +149,8 @@ describe('DriverService', () => {
}); });
it('updateDriverProfile builds optional input and returns presenter model', async () => { it('updateDriverProfile builds optional input and returns presenter model', async () => {
const updateDriverProfileUseCase = { execute: vi.fn(async () => {}) }; const service = createService();
const driverPresenter = { driverPresenter.getResponseModel.mockReturnValue({ driver: { id: 'd1' } });
setMediaResolver: vi.fn(),
setBaseUrl: vi.fn(),
present: vi.fn(),
getResponseModel: vi.fn(() => ({ driver: { id: 'd1' } }))
};
const service = new DriverService(
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
updateDriverProfileUseCase as any,
{ execute: vi.fn() } as any,
{ findById: vi.fn() } as any,
logger as any,
{ getResponseModel: vi.fn(() => ({ items: [] })) } as any,
{ getResponseModel: vi.fn(() => ({ totalDrivers: 0 })) } as any,
{ getResponseModel: vi.fn(() => ({ success: true })) } as any,
{ getResponseModel: vi.fn(() => ({ isRegistered: false })) } as any,
driverPresenter as any,
{ getResponseModel: vi.fn(() => ({ profile: {} })) } as any,
);
await service.updateDriverProfile('d1'); await service.updateDriverProfile('d1');
expect(updateDriverProfileUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1' }); expect(updateDriverProfileUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1' });
@@ -252,66 +174,16 @@ describe('DriverService', () => {
}); });
it('getDriver calls repository and returns presenter model', async () => { it('getDriver calls repository and returns presenter model', async () => {
const driverRepository = { findById: vi.fn(async () => null) }; const service = createService();
const driverPresenter = { driverRepository.findById.mockResolvedValue(null);
setMediaResolver: vi.fn(),
setBaseUrl: vi.fn(),
present: vi.fn(),
getResponseModel: vi.fn(() => null)
};
const service = new DriverService(
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
driverRepository as any,
logger as any,
{ getResponseModel: vi.fn(() => ({ items: [] })) } as any,
{ getResponseModel: vi.fn(() => ({ totalDrivers: 0 })) } as any,
{ getResponseModel: vi.fn(() => ({ success: true })) } as any,
{ getResponseModel: vi.fn(() => ({ isRegistered: false })) } as any,
driverPresenter as any,
{ getResponseModel: vi.fn(() => ({ profile: {} })) } as any,
);
await expect(service.getDriver('d1')).resolves.toBeNull(); await expect(service.getDriver('d1')).resolves.toBeNull();
expect(driverRepository.findById).toHaveBeenCalledWith('d1'); expect(driverRepository.findById).toHaveBeenCalledWith('d1');
// When driver is not found, presenter is not called
}); });
it('getDriverProfile executes use case and returns presenter model', async () => { it('getDriverProfile executes use case and returns presenter model', async () => {
const getProfileOverviewUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; const service = createService();
const driverProfilePresenter = { driverProfilePresenter.getResponseModel.mockReturnValue({ profile: { id: 'd1' } });
setMediaResolver: vi.fn(),
setBaseUrl: vi.fn(),
getResponseModel: vi.fn(() => ({ profile: { id: 'd1' } }))
};
const driverPresenter = {
setMediaResolver: vi.fn(),
setBaseUrl: vi.fn(),
present: vi.fn(),
getResponseModel: vi.fn(() => null)
};
const service = new DriverService(
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
getProfileOverviewUseCase as any,
{ findById: vi.fn() } as any,
logger as any,
{ getResponseModel: vi.fn(() => ({ items: [] })) } as any,
{ getResponseModel: vi.fn(() => ({ totalDrivers: 0 })) } as any,
{ getResponseModel: vi.fn(() => ({ success: true })) } as any,
{ getResponseModel: vi.fn(() => ({ isRegistered: false })) } as any,
driverPresenter as any,
driverProfilePresenter as any,
);
await expect(service.getDriverProfile('d1')).resolves.toEqual({ profile: { id: 'd1' } }); await expect(service.getDriverProfile('d1')).resolves.toEqual({ profile: { id: 'd1' } });
expect(getProfileOverviewUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1' }); expect(getProfileOverviewUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1' });
@@ -319,39 +191,12 @@ describe('DriverService', () => {
}); });
it('getDriverLiveries executes use case and returns presenter model', async () => { it('getDriverLiveries executes use case and returns presenter model', async () => {
const getDriverLiveriesUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; const service = createService();
const getDriverLiveriesPresenter = { getDriverLiveriesPresenter.getResponseModel.mockReturnValue({ liveries: [] });
present: vi.fn(),
getResponseModel: vi.fn(() => ({ liveries: [] }))
};
const driverPresenter = {
setMediaResolver: vi.fn(),
setBaseUrl: vi.fn(),
present: vi.fn(),
getResponseModel: vi.fn(() => null)
};
const service = new DriverService(
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
getDriverLiveriesUseCase as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ execute: vi.fn() } as any,
{ findById: vi.fn() } as any,
logger as any,
{ getResponseModel: vi.fn(() => ({ items: [] })) } as any,
{ getResponseModel: vi.fn(() => ({ totalDrivers: 0 })) } as any,
{ getResponseModel: vi.fn(() => ({ success: true })) } as any,
{ getResponseModel: vi.fn(() => ({ isRegistered: false })) } as any,
driverPresenter as any,
{ getResponseModel: vi.fn(() => ({ profile: {} })) } as any,
getDriverLiveriesPresenter as any,
);
await expect(service.getDriverLiveries('d1')).resolves.toEqual({ liveries: [] }); await expect(service.getDriverLiveries('d1')).resolves.toEqual({ liveries: [] });
expect(getDriverLiveriesUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1' }); expect(getDriverLiveriesUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1' });
expect(getDriverLiveriesPresenter.present).toHaveBeenCalled(); expect(getDriverLiveriesPresenter.present).toHaveBeenCalled();
expect(getDriverLiveriesPresenter.getResponseModel).toHaveBeenCalled(); expect(getDriverLiveriesPresenter.getResponseModel).toHaveBeenCalled();
}); });
}); });