Some checks failed
CI / lint-typecheck (pull_request) Failing after 12s
CI / tests (pull_request) Has been skipped
CI / contract-tests (pull_request) Has been skipped
CI / e2e-tests (pull_request) Has been skipped
CI / comment-pr (pull_request) Has been skipped
CI / commit-types (pull_request) Has been skipped
162 lines
5.1 KiB
TypeScript
162 lines
5.1 KiB
TypeScript
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { DriversTestContext } from '../DriversTestContext';
|
|
import { Driver } from '../../../../core/racing/domain/entities/Driver';
|
|
|
|
describe('GetDriversLeaderboardUseCase Integration', () => {
|
|
let context: DriversTestContext;
|
|
|
|
beforeEach(() => {
|
|
context = DriversTestContext.create();
|
|
context.clear();
|
|
});
|
|
|
|
describe('Success Path', () => {
|
|
it('should retrieve complete list of drivers with all data', async () => {
|
|
const drivers = [
|
|
Driver.create({ id: 'd1', iracingId: '1', name: 'Driver 1', country: 'US' }),
|
|
Driver.create({ id: 'd2', iracingId: '2', name: 'Driver 2', country: 'UK' }),
|
|
Driver.create({ id: 'd3', iracingId: '3', name: 'Driver 3', country: 'DE' }),
|
|
];
|
|
|
|
for (const d of drivers) {
|
|
await context.driverRepository.create(d);
|
|
}
|
|
|
|
await context.driverStatsRepository.saveDriverStats('d1', {
|
|
rating: 2000,
|
|
totalRaces: 10,
|
|
wins: 2,
|
|
podiums: 5,
|
|
overallRank: 1,
|
|
safetyRating: 4.5,
|
|
sportsmanshipRating: 95,
|
|
dnfs: 0,
|
|
avgFinish: 3.5,
|
|
bestFinish: 1,
|
|
worstFinish: 10,
|
|
consistency: 85,
|
|
experienceLevel: 'pro'
|
|
});
|
|
await context.driverStatsRepository.saveDriverStats('d2', {
|
|
rating: 1800,
|
|
totalRaces: 8,
|
|
wins: 1,
|
|
podiums: 3,
|
|
overallRank: 2,
|
|
safetyRating: 4.0,
|
|
sportsmanshipRating: 90,
|
|
dnfs: 1,
|
|
avgFinish: 5.2,
|
|
bestFinish: 1,
|
|
worstFinish: 15,
|
|
consistency: 75,
|
|
experienceLevel: 'intermediate'
|
|
});
|
|
await context.driverStatsRepository.saveDriverStats('d3', {
|
|
rating: 1500,
|
|
totalRaces: 5,
|
|
wins: 0,
|
|
podiums: 1,
|
|
overallRank: 3,
|
|
safetyRating: 3.5,
|
|
sportsmanshipRating: 80,
|
|
dnfs: 0,
|
|
avgFinish: 8.0,
|
|
bestFinish: 3,
|
|
worstFinish: 12,
|
|
consistency: 65,
|
|
experienceLevel: 'rookie'
|
|
});
|
|
|
|
const result = await context.getDriversLeaderboardUseCase.execute({});
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
const leaderboard = result.unwrap();
|
|
|
|
expect(leaderboard.items).toHaveLength(3);
|
|
expect(leaderboard.totalRaces).toBe(23);
|
|
expect(leaderboard.totalWins).toBe(3);
|
|
expect(leaderboard.activeCount).toBe(3);
|
|
|
|
expect(leaderboard.items[0]!.driver.id).toBe('d1');
|
|
expect(leaderboard.items[1]!.driver.id).toBe('d2');
|
|
expect(leaderboard.items[2]!.driver.id).toBe('d3');
|
|
|
|
expect(leaderboard.items[0]!.rating).toBe(2000);
|
|
expect(leaderboard.items[1]!.rating).toBe(1800);
|
|
expect(leaderboard.items[2]!.rating).toBe(1500);
|
|
});
|
|
|
|
it('should handle empty drivers list', async () => {
|
|
const result = await context.getDriversLeaderboardUseCase.execute({});
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
const leaderboard = result.unwrap();
|
|
expect(leaderboard.items).toHaveLength(0);
|
|
expect(leaderboard.totalRaces).toBe(0);
|
|
expect(leaderboard.totalWins).toBe(0);
|
|
expect(leaderboard.activeCount).toBe(0);
|
|
});
|
|
|
|
it('should correctly identify active drivers', async () => {
|
|
await context.driverRepository.create(Driver.create({ id: 'active', iracingId: '1', name: 'Active', country: 'US' }));
|
|
await context.driverRepository.create(Driver.create({ id: 'inactive', iracingId: '2', name: 'Inactive', country: 'UK' }));
|
|
|
|
await context.driverStatsRepository.saveDriverStats('active', {
|
|
rating: 1500,
|
|
totalRaces: 1,
|
|
wins: 0,
|
|
podiums: 0,
|
|
overallRank: 1,
|
|
safetyRating: 3.0,
|
|
sportsmanshipRating: 70,
|
|
dnfs: 0,
|
|
avgFinish: 10,
|
|
bestFinish: 10,
|
|
worstFinish: 10,
|
|
consistency: 50,
|
|
experienceLevel: 'rookie'
|
|
});
|
|
await context.driverStatsRepository.saveDriverStats('inactive', {
|
|
rating: 1000,
|
|
totalRaces: 0,
|
|
wins: 0,
|
|
podiums: 0,
|
|
overallRank: null,
|
|
safetyRating: 2.5,
|
|
sportsmanshipRating: 50,
|
|
dnfs: 0,
|
|
avgFinish: 0,
|
|
bestFinish: 0,
|
|
worstFinish: 0,
|
|
consistency: 0,
|
|
experienceLevel: 'rookie'
|
|
});
|
|
|
|
const result = await context.getDriversLeaderboardUseCase.execute({});
|
|
|
|
const leaderboard = result.unwrap();
|
|
expect(leaderboard.activeCount).toBe(1);
|
|
expect(leaderboard.items.find(i => i.driver.id === 'active')?.isActive).toBe(true);
|
|
expect(leaderboard.items.find(i => i.driver.id === 'inactive')?.isActive).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('Error Handling', () => {
|
|
it('should handle repository errors gracefully', async () => {
|
|
const originalFindAll = context.driverRepository.findAll.bind(context.driverRepository);
|
|
context.driverRepository.findAll = async () => {
|
|
throw new Error('Repository error');
|
|
};
|
|
|
|
const result = await context.getDriversLeaderboardUseCase.execute({});
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
const error = result.unwrapErr();
|
|
expect(error.code).toBe('REPOSITORY_ERROR');
|
|
|
|
context.driverRepository.findAll = originalFindAll;
|
|
});
|
|
});
|
|
});
|