integration tests
Some checks failed
CI / lint-typecheck (pull_request) Failing after 4m51s
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

This commit is contained in:
2026-01-23 00:46:34 +01:00
parent eaf51712a7
commit a0f41f242f
53 changed files with 3214 additions and 8820 deletions

View File

@@ -0,0 +1,86 @@
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);
});
});
});

View File

@@ -0,0 +1,60 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { LeaderboardsTestContext } from '../LeaderboardsTestContext';
describe('GetDriverRankingsUseCase - Filter Functionality', () => {
let context: LeaderboardsTestContext;
beforeEach(() => {
context = LeaderboardsTestContext.create();
context.clear();
});
it('should filter drivers by rating range', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'Driver A', rating: 3.5, raceCount: 10 });
context.repository.addDriver({ id: 'driver-2', name: 'Driver B', rating: 4.0, raceCount: 10 });
context.repository.addDriver({ id: 'driver-3', name: 'Driver C', rating: 4.5, raceCount: 10 });
context.repository.addDriver({ id: 'driver-4', name: 'Driver D', rating: 5.0, raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ minRating: 4.0 });
expect(result.drivers).toHaveLength(3);
expect(result.drivers.every((d) => d.rating >= 4.0)).toBe(true);
expect(result.drivers.map((d) => d.name)).not.toContain('Driver A');
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should filter drivers by team', 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, teamId: 'team-2', teamName: 'Team 2', raceCount: 10 });
context.repository.addDriver({ id: 'driver-3', name: 'Driver C', rating: 4.5, teamId: 'team-1', teamName: 'Team 1', raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ teamId: 'team-1' });
expect(result.drivers).toHaveLength(2);
expect(result.drivers.every((d) => d.teamId === 'team-1')).toBe(true);
expect(result.drivers.map((d) => d.name)).not.toContain('Driver B');
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should filter drivers by multiple criteria', 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, teamId: 'team-2', teamName: 'Team 2', raceCount: 10 });
context.repository.addDriver({ id: 'driver-3', name: 'Driver C', rating: 4.5, teamId: 'team-1', teamName: 'Team 1', raceCount: 10 });
context.repository.addDriver({ id: 'driver-4', name: 'Driver D', rating: 3.5, teamId: 'team-1', teamName: 'Team 1', raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ minRating: 4.0, teamId: 'team-1' });
expect(result.drivers).toHaveLength(2);
expect(result.drivers.every((d) => d.teamId === 'team-1' && d.rating >= 4.0)).toBe(true);
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should handle empty filter results', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'Driver A', rating: 3.5, raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ minRating: 10.0 });
expect(result.drivers).toHaveLength(0);
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
});

View File

@@ -0,0 +1,62 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { LeaderboardsTestContext } from '../LeaderboardsTestContext';
describe('GetDriverRankingsUseCase - Search Functionality', () => {
let context: LeaderboardsTestContext;
beforeEach(() => {
context = LeaderboardsTestContext.create();
context.clear();
});
it('should search for drivers by name', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'John Smith', rating: 5.0, raceCount: 10 });
context.repository.addDriver({ id: 'driver-2', name: 'Jane Doe', rating: 4.8, raceCount: 10 });
context.repository.addDriver({ id: 'driver-3', name: 'Bob Johnson', rating: 4.5, raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ search: 'John' });
expect(result.drivers).toHaveLength(2);
expect(result.drivers.map((d) => d.name)).toContain('John Smith');
expect(result.drivers.map((d) => d.name)).toContain('Bob Johnson');
expect(result.drivers.map((d) => d.name)).not.toContain('Jane Doe');
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should search for drivers by partial name', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'Alexander', rating: 5.0, raceCount: 10 });
context.repository.addDriver({ id: 'driver-2', name: 'Alex', rating: 4.8, raceCount: 10 });
context.repository.addDriver({ id: 'driver-3', name: 'Alexandra', rating: 4.5, raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ search: 'Alex' });
expect(result.drivers).toHaveLength(3);
expect(result.drivers.map((d) => d.name)).toContain('Alexander');
expect(result.drivers.map((d) => d.name)).toContain('Alex');
expect(result.drivers.map((d) => d.name)).toContain('Alexandra');
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should handle case-insensitive search', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'John Smith', rating: 5.0, raceCount: 10 });
context.repository.addDriver({ id: 'driver-2', name: 'JOHN DOE', rating: 4.8, raceCount: 10 });
context.repository.addDriver({ id: 'driver-3', name: 'johnson', rating: 4.5, raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ search: 'john' });
expect(result.drivers).toHaveLength(3);
expect(result.drivers.map((d) => d.name)).toContain('John Smith');
expect(result.drivers.map((d) => d.name)).toContain('JOHN DOE');
expect(result.drivers.map((d) => d.name)).toContain('johnson');
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should return empty result when no drivers match search', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'John Smith', rating: 5.0, raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ search: 'NonExistentDriver' });
expect(result.drivers).toHaveLength(0);
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
});

View File

@@ -0,0 +1,65 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { LeaderboardsTestContext } from '../LeaderboardsTestContext';
describe('GetDriverRankingsUseCase - Sort Functionality', () => {
let context: LeaderboardsTestContext;
beforeEach(() => {
context = LeaderboardsTestContext.create();
context.clear();
});
it('should sort drivers by rating (high to low)', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'Driver A', rating: 3.5, raceCount: 10 });
context.repository.addDriver({ id: 'driver-2', name: 'Driver B', rating: 4.0, raceCount: 10 });
context.repository.addDriver({ id: 'driver-3', name: 'Driver C', rating: 4.5, raceCount: 10 });
context.repository.addDriver({ id: 'driver-4', name: 'Driver D', rating: 5.0, raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ sortBy: 'rating', sortOrder: 'desc' });
expect(result.drivers[0].rating).toBe(5.0);
expect(result.drivers[1].rating).toBe(4.5);
expect(result.drivers[2].rating).toBe(4.0);
expect(result.drivers[3].rating).toBe(3.5);
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should sort drivers by name (A-Z)', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'Zoe', rating: 5.0, raceCount: 10 });
context.repository.addDriver({ id: 'driver-2', name: 'Alice', rating: 4.8, raceCount: 10 });
context.repository.addDriver({ id: 'driver-3', name: 'Bob', rating: 4.5, raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ sortBy: 'name', sortOrder: 'asc' });
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 sort drivers by rank (low to high)', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'Driver A', rating: 5.0, raceCount: 10 });
context.repository.addDriver({ id: 'driver-2', name: 'Driver B', rating: 4.8, raceCount: 10 });
context.repository.addDriver({ id: 'driver-3', name: 'Driver C', rating: 4.5, raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({ sortBy: 'rank', sortOrder: 'asc' });
expect(result.drivers[0].rank).toBe(1);
expect(result.drivers[1].rank).toBe(2);
expect(result.drivers[2].rank).toBe(3);
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should sort drivers by race count (high to low)', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'Driver A', rating: 5.0, raceCount: 50 });
context.repository.addDriver({ id: 'driver-2', name: 'Driver B', rating: 4.8, raceCount: 30 });
context.repository.addDriver({ id: 'driver-3', name: 'Driver C', rating: 4.5, raceCount: 40 });
const result = await context.getDriverRankingsUseCase.execute({ sortBy: 'raceCount', sortOrder: 'desc' });
expect(result.drivers[0].raceCount).toBe(50);
expect(result.drivers[1].raceCount).toBe(40);
expect(result.drivers[2].raceCount).toBe(30);
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
});

View File

@@ -0,0 +1,132 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { LeaderboardsTestContext } from '../LeaderboardsTestContext';
describe('GetDriverRankingsUseCase - Success Path', () => {
let context: LeaderboardsTestContext;
beforeEach(() => {
context = LeaderboardsTestContext.create();
context.clear();
});
it('should retrieve all drivers with complete data', async () => {
context.repository.addDriver({
id: 'driver-1',
name: 'John Smith',
rating: 5.0,
teamId: 'team-1',
teamName: 'Racing Team A',
raceCount: 50,
});
context.repository.addDriver({
id: 'driver-2',
name: 'Jane Doe',
rating: 4.8,
teamId: 'team-2',
teamName: 'Speed Squad',
raceCount: 45,
});
context.repository.addDriver({
id: 'driver-3',
name: 'Bob Johnson',
rating: 4.5,
teamId: 'team-1',
teamName: 'Racing Team A',
raceCount: 40,
});
const result = await context.getDriverRankingsUseCase.execute({});
expect(result.drivers).toHaveLength(3);
expect(result.drivers[0]).toMatchObject({
rank: 1,
id: 'driver-1',
name: 'John Smith',
rating: 5.0,
teamId: 'team-1',
teamName: 'Racing Team A',
raceCount: 50,
});
expect(result.drivers[0].rating).toBe(5.0);
expect(result.drivers[1].rating).toBe(4.8);
expect(result.drivers[2].rating).toBe(4.5);
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should retrieve drivers with pagination', async () => {
for (let i = 1; i <= 25; i++) {
context.repository.addDriver({
id: `driver-${i}`,
name: `Driver ${i}`,
rating: 5.0 - i * 0.1,
raceCount: 10 + i,
});
}
const result = await context.getDriverRankingsUseCase.execute({ page: 1, limit: 20 });
expect(result.drivers).toHaveLength(20);
expect(result.pagination.total).toBe(25);
expect(result.pagination.page).toBe(1);
expect(result.pagination.limit).toBe(20);
expect(result.pagination.totalPages).toBe(2);
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should retrieve drivers with different page sizes', async () => {
for (let i = 1; i <= 60; i++) {
context.repository.addDriver({
id: `driver-${i}`,
name: `Driver ${i}`,
rating: 5.0 - i * 0.1,
raceCount: 10 + i,
});
}
const result = await context.getDriverRankingsUseCase.execute({ limit: 50 });
expect(result.drivers).toHaveLength(50);
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should retrieve drivers with consistent ranking order', async () => {
context.repository.addDriver({ id: 'driver-1', name: 'Driver A', rating: 5.0, raceCount: 10 });
context.repository.addDriver({ id: 'driver-2', name: 'Driver B', rating: 4.8, raceCount: 10 });
context.repository.addDriver({ id: 'driver-3', name: 'Driver C', rating: 4.5, raceCount: 10 });
const result = await context.getDriverRankingsUseCase.execute({});
expect(result.drivers[0].rank).toBe(1);
expect(result.drivers[1].rank).toBe(2);
expect(result.drivers[2].rank).toBe(3);
const ranks = result.drivers.map((d) => d.rank);
expect(new Set(ranks).size).toBe(ranks.length);
for (let i = 0; i < ranks.length; i++) {
expect(ranks[i]).toBe(i + 1);
}
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
it('should retrieve drivers with accurate data', async () => {
context.repository.addDriver({
id: 'driver-1',
name: 'John Smith',
rating: 5.0,
teamId: 'team-1',
teamName: 'Racing Team A',
raceCount: 50,
});
const result = await context.getDriverRankingsUseCase.execute({});
expect(result.drivers[0].rating).toBeGreaterThan(0);
expect(typeof result.drivers[0].rating).toBe('number');
expect(result.drivers[0].rank).toBe(1);
expect(result.drivers[0].name).toBeTruthy();
expect(typeof result.drivers[0].name).toBe('string');
expect(result.drivers[0].teamId).toBe('team-1');
expect(result.drivers[0].teamName).toBe('Racing Team A');
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});
});