diff --git a/apps/api/src/domain/driver/DriverService.test.ts b/apps/api/src/domain/driver/DriverService.test.ts index 9ab0c5395..1f592f752 100644 --- a/apps/api/src/domain/driver/DriverService.test.ts +++ b/apps/api/src/domain/driver/DriverService.test.ts @@ -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 { DriverService } from './DriverService'; describe('DriverService', () => { 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 () => { - const getDriversLeaderboardUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; - const driversLeaderboardPresenter = { - setMediaResolver: vi.fn(), - setBaseUrl: vi.fn(), - present: vi.fn(), - getResponseModel: vi.fn(() => ({ items: [] })) - }; - const driverPresenter = { - setMediaResolver: vi.fn(), - setBaseUrl: vi.fn(), - present: vi.fn(), - getResponseModel: vi.fn(() => null) - }; + beforeEach(() => { + vi.clearAllMocks(); + + // Default successful responses + getDriversLeaderboardUseCase.execute.mockResolvedValue(Result.ok(undefined)); + getTotalDriversUseCase.execute.mockResolvedValue(Result.ok(undefined)); + getDriverLiveriesUseCase.execute.mockResolvedValue(Result.ok(undefined)); + completeDriverOnboardingUseCase.execute.mockResolvedValue(Result.ok(undefined)); + isDriverRegisteredForRaceUseCase.execute.mockResolvedValue(Result.ok(undefined)); + updateDriverProfileUseCase.execute.mockResolvedValue(Result.ok(undefined)); + getProfileOverviewUseCase.execute.mockResolvedValue(Result.ok(undefined)); + + 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, - { 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, - { findById: vi.fn() } as any, + getTotalDriversUseCase as any, + getDriverLiveriesUseCase as any, + completeDriverOnboardingUseCase as any, + isDriverRegisteredForRaceUseCase as any, + updateDriverProfileUseCase as any, + getProfileOverviewUseCase as any, + driverRepository as any, logger as any, driversLeaderboardPresenter as any, - { getResponseModel: vi.fn(() => ({ totalDrivers: 0 })) } as any, - { getResponseModel: vi.fn(() => ({ success: true })) } as any, - { getResponseModel: vi.fn(() => ({ isRegistered: false })) } as any, + driverStatsPresenter as any, + completeOnboardingPresenter as any, + driverRegistrationStatusPresenter 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: [] }); expect(getDriversLeaderboardUseCase.execute).toHaveBeenCalledWith({}); @@ -43,34 +81,8 @@ describe('DriverService', () => { }); it('getTotalDrivers executes use case and returns presenter model', async () => { - const getTotalDriversUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; - const driverStatsPresenter = { - 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, - ); + const service = createService(); + driverStatsPresenter.getResponseModel.mockReturnValue({ totalDrivers: 123 }); await expect(service.getTotalDrivers()).resolves.toEqual({ totalDrivers: 123 }); expect(getTotalDriversUseCase.execute).toHaveBeenCalledWith({}); @@ -78,30 +90,7 @@ describe('DriverService', () => { }); it('completeOnboarding passes optional bio only when provided', async () => { - const completeDriverOnboardingUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; - 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, - ); + const service = createService(); await service.completeOnboarding('u1', { firstName: 'F', @@ -139,31 +128,8 @@ describe('DriverService', () => { }); it('getDriverRegistrationStatus passes raceId and driverId and returns presenter model', async () => { - const isDriverRegisteredForRaceUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; - const driverRegistrationStatusPresenter = { getResponseModel: vi.fn(() => ({ 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, - ); + const service = createService(); + driverRegistrationStatusPresenter.getResponseModel.mockReturnValue({ isRegistered: true }); await expect( service.getDriverRegistrationStatus({ raceId: 'r1', driverId: 'd1' } as any), @@ -174,30 +140,8 @@ describe('DriverService', () => { }); it('getCurrentDriver calls repository and returns presenter model', async () => { - const driverRepository = { findById: vi.fn(async () => null) }; - 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, - { 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, - ); + const service = createService(); + driverRepository.findById.mockResolvedValue(null); await expect(service.getCurrentDriver('u1')).resolves.toBeNull(); expect(driverRepository.findById).toHaveBeenCalledWith('u1'); @@ -205,30 +149,8 @@ describe('DriverService', () => { }); it('updateDriverProfile builds optional input and returns presenter model', async () => { - const updateDriverProfileUseCase = { execute: vi.fn(async () => {}) }; - const driverPresenter = { - 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, - ); + const service = createService(); + driverPresenter.getResponseModel.mockReturnValue({ driver: { id: 'd1' } }); await service.updateDriverProfile('d1'); expect(updateDriverProfileUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1' }); @@ -252,66 +174,16 @@ describe('DriverService', () => { }); it('getDriver calls repository and returns presenter model', async () => { - const driverRepository = { findById: vi.fn(async () => null) }; - 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, - { 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, - ); + const service = createService(); + driverRepository.findById.mockResolvedValue(null); await expect(service.getDriver('d1')).resolves.toBeNull(); expect(driverRepository.findById).toHaveBeenCalledWith('d1'); - // When driver is not found, presenter is not called }); it('getDriverProfile executes use case and returns presenter model', async () => { - const getProfileOverviewUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; - const driverProfilePresenter = { - 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, - ); + const service = createService(); + driverProfilePresenter.getResponseModel.mockReturnValue({ profile: { id: 'd1' } }); await expect(service.getDriverProfile('d1')).resolves.toEqual({ profile: { id: 'd1' } }); expect(getProfileOverviewUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1' }); @@ -319,39 +191,12 @@ describe('DriverService', () => { }); it('getDriverLiveries executes use case and returns presenter model', async () => { - const getDriverLiveriesUseCase = { execute: vi.fn(async () => Result.ok(undefined)) }; - const getDriverLiveriesPresenter = { - 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, - ); + const service = createService(); + getDriverLiveriesPresenter.getResponseModel.mockReturnValue({ liveries: [] }); await expect(service.getDriverLiveries('d1')).resolves.toEqual({ liveries: [] }); expect(getDriverLiveriesUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1' }); expect(getDriverLiveriesPresenter.present).toHaveBeenCalled(); expect(getDriverLiveriesPresenter.getResponseModel).toHaveBeenCalled(); }); -}); \ No newline at end of file +});