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
87 lines
3.6 KiB
TypeScript
87 lines
3.6 KiB
TypeScript
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { LeaderboardsTestContext } from '../LeaderboardsTestContext';
|
|
import { ValidationError } from '../../../../core/shared/errors/ValidationError';
|
|
|
|
describe('GetDriverRankingsUseCase - Edge Cases & Errors', () => {
|
|
let context: LeaderboardsTestContext;
|
|
|
|
beforeEach(() => {
|
|
context = LeaderboardsTestContext.create();
|
|
context.clear();
|
|
});
|
|
|
|
describe('Edge Cases', () => {
|
|
it('should handle system with no drivers', async () => {
|
|
const result = await context.getDriverRankingsUseCase.execute({});
|
|
expect(result.drivers).toHaveLength(0);
|
|
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
|
|
});
|
|
|
|
it('should handle drivers with same rating', async () => {
|
|
context.repository.addDriver({ id: 'driver-1', name: 'Zoe', rating: 5.0, raceCount: 50 });
|
|
context.repository.addDriver({ id: 'driver-2', name: 'Alice', rating: 5.0, raceCount: 45 });
|
|
context.repository.addDriver({ id: 'driver-3', name: 'Bob', rating: 5.0, raceCount: 40 });
|
|
|
|
const result = await context.getDriverRankingsUseCase.execute({});
|
|
|
|
expect(result.drivers[0]!.rating).toBe(5.0);
|
|
expect(result.drivers[1]!.rating).toBe(5.0);
|
|
expect(result.drivers[2]!.rating).toBe(5.0);
|
|
expect(result.drivers[0]!.name).toBe('Alice');
|
|
expect(result.drivers[1]!.name).toBe('Bob');
|
|
expect(result.drivers[2]!.name).toBe('Zoe');
|
|
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
|
|
});
|
|
|
|
it('should handle drivers with no team affiliation', async () => {
|
|
context.repository.addDriver({ id: 'driver-1', name: 'Driver A', rating: 5.0, teamId: 'team-1', teamName: 'Team 1', raceCount: 10 });
|
|
context.repository.addDriver({ id: 'driver-2', name: 'Driver B', rating: 4.8, raceCount: 10 });
|
|
|
|
const result = await context.getDriverRankingsUseCase.execute({});
|
|
|
|
expect(result.drivers).toHaveLength(2);
|
|
expect(result.drivers[0]!.teamId).toBe('team-1');
|
|
expect(result.drivers[1]!.teamId).toBeUndefined();
|
|
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
|
|
});
|
|
|
|
it('should handle pagination with empty results', async () => {
|
|
const result = await context.getDriverRankingsUseCase.execute({ page: 1, limit: 20 });
|
|
expect(result.drivers).toHaveLength(0);
|
|
expect(result.pagination.total).toBe(0);
|
|
expect(result.pagination.totalPages).toBe(0);
|
|
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
|
|
});
|
|
});
|
|
|
|
describe('Error Handling', () => {
|
|
it('should handle driver repository errors gracefully', async () => {
|
|
const originalFindAllDrivers = context.repository.findAllDrivers.bind(context.repository);
|
|
context.repository.findAllDrivers = async () => {
|
|
throw new Error('Repository error');
|
|
};
|
|
|
|
try {
|
|
await context.getDriverRankingsUseCase.execute({});
|
|
expect(true).toBe(false);
|
|
} catch (error) {
|
|
expect(error).toBeInstanceOf(Error);
|
|
expect((error as Error).message).toBe('Repository error');
|
|
}
|
|
|
|
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(0);
|
|
context.repository.findAllDrivers = originalFindAllDrivers;
|
|
});
|
|
|
|
it('should handle invalid query parameters', async () => {
|
|
try {
|
|
await context.getDriverRankingsUseCase.execute({ page: -1 });
|
|
expect(true).toBe(false);
|
|
} catch (error) {
|
|
expect(error).toBeInstanceOf(ValidationError);
|
|
}
|
|
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(0);
|
|
});
|
|
});
|
|
});
|