code quality
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

This commit is contained in:
2026-01-26 22:16:33 +01:00
parent f2bd80ccd3
commit 09632d004d
72 changed files with 1946 additions and 277 deletions

View File

@@ -65,7 +65,7 @@ describe('Dashboard Data Flow Integration', () => {
expect(dto.driver.name).toBe('Complete Flow Driver');
expect(dto.statistics.rating).toBe(1600);
expect(dto.upcomingRaces).toHaveLength(1);
expect(dto.upcomingRaces[0].trackName).toBe('Monza');
expect(dto.upcomingRaces[0]!.trackName).toBe('Monza');
});
});
});

View File

@@ -111,21 +111,21 @@ describe('GetDashboardUseCase - Success Path', () => {
expect(result.statistics.leagues).toBe(2);
expect(result.upcomingRaces).toHaveLength(3);
expect(result.upcomingRaces[0].trackName).toBe('Nürburgring');
expect(result.upcomingRaces[1].trackName).toBe('Monza');
expect(result.upcomingRaces[2].trackName).toBe('Imola');
expect(result.upcomingRaces[0]!.trackName).toBe('Nürburgring');
expect(result.upcomingRaces[1]!.trackName).toBe('Monza');
expect(result.upcomingRaces[2]!.trackName).toBe('Imola');
expect(result.championshipStandings).toHaveLength(2);
expect(result.championshipStandings[0].leagueName).toBe('GT3 Championship');
expect(result.championshipStandings[0].position).toBe(5);
expect(result.championshipStandings[0].points).toBe(150);
expect(result.championshipStandings[0].totalDrivers).toBe(20);
expect(result.championshipStandings[0]!.leagueName).toBe('GT3 Championship');
expect(result.championshipStandings[0]!.position).toBe(5);
expect(result.championshipStandings[0]!.points).toBe(150);
expect(result.championshipStandings[0]!.totalDrivers).toBe(20);
expect(result.recentActivity).toHaveLength(3);
expect(result.recentActivity[0].description).toBe('Finished 3rd at Monza');
expect(result.recentActivity[0].status).toBe('success');
expect(result.recentActivity[1].description).toBe('Invited to League XYZ');
expect(result.recentActivity[2].description).toBe('Reached 1500 rating');
expect(result.recentActivity[0]!.description).toBe('Finished 3rd at Monza');
expect(result.recentActivity[0]!.status).toBe('success');
expect(result.recentActivity[1]!.description).toBe('Invited to League XYZ');
expect(result.recentActivity[2]!.description).toBe('Reached 1500 rating');
expect(context.eventPublisher.getDashboardAccessedEventCount()).toBe(1);
});

View File

@@ -42,7 +42,7 @@ describe('Database Constraints - Data Integrity After Failed Operations', () =>
// Then: Original team should still exist and be retrievable
const teams = await context.teamRepository.findAll();
expect(teams.length).toBe(1);
expect(teams[0].name).toBe('Valid Team');
expect(teams[0]!.name).toBe('Valid Team');
});
it('should handle multiple failed operations without corruption', async () => {

View File

@@ -26,11 +26,10 @@ describe('GetDriverUseCase Integration', () => {
await context.driverRepository.create(driver);
const result = await context.getDriverUseCase.execute({ driverId });
expect(result.isOk()).toBe(true);
const retrievedDriver = result.unwrap();
const retrievedDriver = result.unwrap()!;
expect(retrievedDriver).toBeDefined();
expect(retrievedDriver.id).toBe(driverId);
expect(retrievedDriver.iracingId.toString()).toBe('12345');
expect(retrievedDriver.name.toString()).toBe('John Doe');
@@ -51,11 +50,10 @@ describe('GetDriverUseCase Integration', () => {
await context.driverRepository.create(driver);
const result = await context.getDriverUseCase.execute({ driverId });
expect(result.isOk()).toBe(true);
const retrievedDriver = result.unwrap();
const retrievedDriver = result.unwrap()!;
expect(retrievedDriver).toBeDefined();
expect(retrievedDriver.id).toBe(driverId);
expect(retrievedDriver.iracingId.toString()).toBe('67890');
expect(retrievedDriver.name.toString()).toBe('Jane Smith');
@@ -77,11 +75,10 @@ describe('GetDriverUseCase Integration', () => {
await context.driverRepository.create(driver);
const result = await context.getDriverUseCase.execute({ driverId });
expect(result.isOk()).toBe(true);
const retrievedDriver = result.unwrap();
const retrievedDriver = result.unwrap()!;
expect(retrievedDriver).toBeDefined();
expect(retrievedDriver.id).toBe(driverId);
expect(retrievedDriver.bio?.toString()).toBe('Canadian racer');
expect(retrievedDriver.avatarRef).toBeDefined();
@@ -100,11 +97,10 @@ describe('GetDriverUseCase Integration', () => {
await context.driverRepository.create(driver);
const result = await context.getDriverUseCase.execute({ driverId });
expect(result.isOk()).toBe(true);
const retrievedDriver = result.unwrap();
const retrievedDriver = result.unwrap()!;
expect(retrievedDriver).toBeDefined();
expect(retrievedDriver.id).toBe(driverId);
expect(retrievedDriver.bio).toBeUndefined();
expect(retrievedDriver.avatarRef).toBeDefined();
@@ -124,11 +120,10 @@ describe('GetDriverUseCase Integration', () => {
await context.driverRepository.create(driver);
const result = await context.getDriverUseCase.execute({ driverId });
expect(result.isOk()).toBe(true);
const retrievedDriver = result.unwrap();
const retrievedDriver = result.unwrap()!;
expect(retrievedDriver).toBeDefined();
expect(retrievedDriver.id).toBe(driverId);
expect(retrievedDriver.bio).toBeUndefined();
});
@@ -145,11 +140,10 @@ describe('GetDriverUseCase Integration', () => {
await context.driverRepository.create(driver);
const result = await context.getDriverUseCase.execute({ driverId });
expect(result.isOk()).toBe(true);
const retrievedDriver = result.unwrap();
const retrievedDriver = result.unwrap()!;
expect(retrievedDriver).toBeDefined();
expect(retrievedDriver.id).toBe(driverId);
expect(retrievedDriver.avatarRef).toBeDefined();
});
@@ -166,11 +160,10 @@ describe('GetDriverUseCase Integration', () => {
await context.driverRepository.create(driver);
const result = await context.getDriverUseCase.execute({ driverId });
expect(result.isOk()).toBe(true);
const retrievedDriver = result.unwrap();
const retrievedDriver = result.unwrap()!;
expect(retrievedDriver).toBeDefined();
expect(retrievedDriver.id).toBe(driverId);
expect(retrievedDriver.iracingId.toString()).toBe('55555');
expect(retrievedDriver.name.toString()).toBe('Minimal Driver');
@@ -232,9 +225,9 @@ describe('GetDriverUseCase Integration', () => {
await context.driverRepository.create(driver);
const result = await context.getDriverUseCase.execute({ driverId });
expect(result.isOk()).toBe(true);
const retrievedDriver = result.unwrap();
const retrievedDriver = result.unwrap()!;
expect(retrievedDriver.id).toBe(driverId);
expect(retrievedDriver.iracingId.toString()).toBe('77777');
@@ -258,9 +251,9 @@ describe('GetDriverUseCase Integration', () => {
await context.driverRepository.create(driver);
const result = await context.getDriverUseCase.execute({ driverId });
expect(result.isOk()).toBe(true);
const retrievedDriver = result.unwrap();
const retrievedDriver = result.unwrap()!;
expect(retrievedDriver.avatarRef).toBeDefined();
expect(retrievedDriver.avatarRef.type).toBe('system-default');
@@ -279,9 +272,9 @@ describe('GetDriverUseCase Integration', () => {
await context.driverRepository.create(driver);
const result = await context.getDriverUseCase.execute({ driverId });
expect(result.isOk()).toBe(true);
const retrievedDriver = result.unwrap();
const retrievedDriver = result.unwrap()!;
expect(retrievedDriver.avatarRef).toBeDefined();
expect(retrievedDriver.avatarRef.type).toBe('generated');

View File

@@ -78,13 +78,13 @@ describe('GetDriversLeaderboardUseCase Integration', () => {
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]!.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);
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 () => {

View File

@@ -57,7 +57,7 @@ describe('GetProfileOverviewUseCase Integration', () => {
expect(overview.driverInfo.driver.id).toBe(driverId);
expect(overview.stats?.rating).toBe(2000);
expect(overview.teamMemberships).toHaveLength(1);
expect(overview.teamMemberships[0].team.id).toBe('t1');
expect(overview.teamMemberships[0]!.team.id).toBe('t1');
expect(overview.socialSummary.friendsCount).toBe(1);
expect(overview.extendedProfile).toBeDefined();
});

View File

@@ -1,7 +1,7 @@
import { vi } from 'vitest';
import { InMemoryHealthCheckAdapter } from '../../../adapters/health/persistence/inmemory/InMemoryHealthCheckAdapter';
import { InMemoryHealthEventPublisher } from '../../../adapters/events/InMemoryHealthEventPublisher';
import { ApiConnectionMonitor } from '../../../apps/website/lib/api/base/ApiConnectionMonitor';
import { ApiConnectionMonitor } from '../../../apps/website/lib/gateways/api/base/ApiConnectionMonitor';
import { CheckApiHealthUseCase } from '../../../core/health/use-cases/CheckApiHealthUseCase';
import { GetConnectionStatusUseCase } from '../../../core/health/use-cases/GetConnectionStatusUseCase';

View File

@@ -24,12 +24,12 @@ describe('GetDriverRankingsUseCase - Edge Cases & Errors', () => {
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(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);
});
@@ -40,8 +40,8 @@ describe('GetDriverRankingsUseCase - Edge Cases & Errors', () => {
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(result.drivers[0]!.teamId).toBe('team-1');
expect(result.drivers[1]!.teamId).toBeUndefined();
expect(context.eventPublisher.getDriverRankingsAccessedEventCount()).toBe(1);
});

View File

@@ -17,10 +17,10 @@ describe('GetDriverRankingsUseCase - Sort Functionality', () => {
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(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);
});
@@ -31,9 +31,9 @@ describe('GetDriverRankingsUseCase - Sort Functionality', () => {
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(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);
});
@@ -44,9 +44,9 @@ describe('GetDriverRankingsUseCase - Sort Functionality', () => {
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(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);
});
@@ -57,9 +57,9 @@ describe('GetDriverRankingsUseCase - Sort Functionality', () => {
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(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

@@ -47,9 +47,9 @@ describe('GetDriverRankingsUseCase - Success Path', () => {
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(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);
});

View File

@@ -20,8 +20,8 @@ describe('GetGlobalLeaderboardsUseCase - Success Path', () => {
expect(result.drivers).toHaveLength(2);
expect(result.teams).toHaveLength(2);
expect(result.drivers[0].rank).toBe(1);
expect(result.teams[0].rank).toBe(1);
expect(result.drivers[0]!.rank).toBe(1);
expect(result.teams[0]!.rank).toBe(1);
expect(context.eventPublisher.getGlobalLeaderboardsAccessedEventCount()).toBe(1);
});
@@ -35,7 +35,7 @@ describe('GetGlobalLeaderboardsUseCase - Success Path', () => {
expect(result.drivers).toHaveLength(10);
expect(result.teams).toHaveLength(10);
expect(result.drivers[0].rating).toBe(4.9);
expect(result.teams[0].rating).toBe(4.9);
expect(result.drivers[0]!.rating).toBe(4.9);
expect(result.teams[0]!.rating).toBe(4.9);
});
});

View File

@@ -23,10 +23,10 @@ describe('GetTeamRankingsUseCase - Data Orchestration', () => {
const result = await context.getTeamRankingsUseCase.execute({});
expect(result.teams[0].rank).toBe(1);
expect(result.teams[0].rating).toBe(4.9);
expect(result.teams[4].rank).toBe(5);
expect(result.teams[4].rating).toBe(4.1);
expect(result.teams[0]!.rank).toBe(1);
expect(result.teams[0]!.rating).toBe(4.9);
expect(result.teams[4]!.rank).toBe(5);
expect(result.teams[4]!.rating).toBe(4.1);
});
it('should correctly aggregate member counts from drivers', async () => {
@@ -46,6 +46,6 @@ describe('GetTeamRankingsUseCase - Data Orchestration', () => {
const result = await context.getTeamRankingsUseCase.execute({});
expect(result.teams[0].memberCount).toBe(5);
expect(result.teams[0]!.memberCount).toBe(5);
});
});

View File

@@ -17,7 +17,7 @@ describe('GetTeamRankingsUseCase - Search & Filter', () => {
const result = await context.getTeamRankingsUseCase.execute({ search: 'Racing' });
expect(result.teams).toHaveLength(1);
expect(result.teams[0].name).toBe('Racing Team');
expect(result.teams[0]!.name).toBe('Racing Team');
expect(context.eventPublisher.getTeamRankingsAccessedEventCount()).toBe(1);
});
});
@@ -30,7 +30,7 @@ describe('GetTeamRankingsUseCase - Search & Filter', () => {
const result = await context.getTeamRankingsUseCase.execute({ minRating: 4.0 });
expect(result.teams).toHaveLength(1);
expect(result.teams[0].rating).toBe(4.0);
expect(result.teams[0]!.rating).toBe(4.0);
expect(context.eventPublisher.getTeamRankingsAccessedEventCount()).toBe(1);
});
@@ -41,7 +41,7 @@ describe('GetTeamRankingsUseCase - Search & Filter', () => {
const result = await context.getTeamRankingsUseCase.execute({ minMemberCount: 5 });
expect(result.teams).toHaveLength(1);
expect(result.teams[0].memberCount).toBe(5);
expect(result.teams[0]!.memberCount).toBe(5);
expect(context.eventPublisher.getTeamRankingsAccessedEventCount()).toBe(1);
});
});

View File

@@ -25,9 +25,9 @@ describe('GetTeamRankingsUseCase - Success Path', () => {
memberCount: 5,
raceCount: 100,
});
expect(result.teams[0].rating).toBe(4.9);
expect(result.teams[1].rating).toBe(4.7);
expect(result.teams[2].rating).toBe(4.3);
expect(result.teams[0]!.rating).toBe(4.9);
expect(result.teams[1]!.rating).toBe(4.7);
expect(result.teams[2]!.rating).toBe(4.3);
expect(context.eventPublisher.getTeamRankingsAccessedEventCount()).toBe(1);
});
@@ -57,12 +57,12 @@ describe('GetTeamRankingsUseCase - Success Path', () => {
const result = await context.getTeamRankingsUseCase.execute({});
expect(result.teams[0].rating).toBeGreaterThan(0);
expect(typeof result.teams[0].rating).toBe('number');
expect(result.teams[0].rank).toBe(1);
expect(result.teams[0].name).toBeTruthy();
expect(typeof result.teams[0].name).toBe('string');
expect(result.teams[0].memberCount).toBeGreaterThan(0);
expect(result.teams[0]!.rating).toBeGreaterThan(0);
expect(typeof result.teams[0]!.rating).toBe('number');
expect(result.teams[0]!.rank).toBe(1);
expect(result.teams[0]!.name).toBeTruthy();
expect(typeof result.teams[0]!.name).toBe('string');
expect(result.teams[0]!.memberCount).toBeGreaterThan(0);
expect(context.eventPublisher.getTeamRankingsAccessedEventCount()).toBe(1);
});
});

View File

@@ -1,5 +1,5 @@
import { InMemoryLeagueRepository } from '../../../adapters/leagues/persistence/inmemory/InMemoryLeagueRepository';
import { InMemoryDriverRepository } from '../../../adapters/drivers/persistence/inmemory/InMemoryDriverRepository';
import { InMemoryDriverRepository } from '../../../adapters/racing/persistence/inmemory/InMemoryDriverRepository';
import { InMemoryEventPublisher } from '../../../adapters/events/InMemoryEventPublisher';
import type { Logger } from '../../../core/shared/domain/Logger';
import { CreateLeagueUseCase } from '../../../core/leagues/application/use-cases/CreateLeagueUseCase';
@@ -35,7 +35,7 @@ import { UnpublishLeagueSeasonScheduleUseCase } from '../../../core/racing/appli
import { RegisterForRaceUseCase } from '../../../core/racing/application/use-cases/RegisterForRaceUseCase';
import { WithdrawFromRaceUseCase } from '../../../core/racing/application/use-cases/WithdrawFromRaceUseCase';
import { GetLeagueStandingsUseCase } from '../../../core/racing/application/use-cases/GetLeagueStandingsUseCase';
import { InMemoryWalletRepository } from '../../../adapters/payments/persistence/inmemory/InMemoryWalletRepository';
import { InMemoryLeagueWalletRepository } from '../../../adapters/racing/persistence/inmemory/InMemoryLeagueWalletRepository';
import { GetLeagueWalletUseCase } from '../../../core/racing/application/use-cases/GetLeagueWalletUseCase';
import { WithdrawFromLeagueWalletUseCase } from '../../../core/racing/application/use-cases/WithdrawFromLeagueWalletUseCase';
import { InMemoryTransactionRepository } from '../../../adapters/racing/persistence/inmemory/InMemoryTransactionRepository';
@@ -79,15 +79,21 @@ export class LeaguesTestContext {
public readonly withdrawFromRaceUseCase: WithdrawFromRaceUseCase;
public readonly getLeagueStandingsUseCase: GetLeagueStandingsUseCase;
public readonly walletRepository: InMemoryWalletRepository;
public readonly walletRepository: InMemoryLeagueWalletRepository;
public readonly transactionRepository: InMemoryTransactionRepository;
public readonly getLeagueWalletUseCase: GetLeagueWalletUseCase;
public readonly withdrawFromLeagueWalletUseCase: WithdrawFromLeagueWalletUseCase;
constructor() {
this.logger = {
info: () => {},
debug: () => {},
warn: () => {},
error: () => {},
} as unknown as Logger;
this.leagueRepository = new InMemoryLeagueRepository();
this.driverRepository = new InMemoryDriverRepository();
this.driverRepository = new InMemoryDriverRepository(this.logger);
this.eventPublisher = new InMemoryEventPublisher();
this.createLeagueUseCase = new CreateLeagueUseCase(this.leagueRepository, this.eventPublisher);
@@ -101,12 +107,6 @@ export class LeaguesTestContext {
this.demoteAdminUseCase = new DemoteAdminUseCase(this.leagueRepository, this.driverRepository, this.eventPublisher);
this.removeMemberUseCase = new RemoveMemberUseCase(this.leagueRepository, this.driverRepository, this.eventPublisher);
this.logger = {
info: () => {},
debug: () => {},
warn: () => {},
error: () => {},
} as unknown as Logger;
this.racingLeagueRepository = new InMemoryRacingLeagueRepository(this.logger);
this.seasonRepository = new InMemorySeasonRepository(this.logger);
@@ -175,7 +175,7 @@ export class LeaguesTestContext {
this.racingDriverRepository,
);
this.walletRepository = new InMemoryWalletRepository(this.logger);
this.walletRepository = new InMemoryLeagueWalletRepository(this.logger);
this.transactionRepository = new InMemoryTransactionRepository(this.logger);
this.getLeagueWalletUseCase = new GetLeagueWalletUseCase(

View File

@@ -24,7 +24,6 @@ describe('League Creation - Success Path', () => {
raceDay: 'Saturday',
raceTime: '18:00',
tracks: ['Monza', 'Spa', 'Nürburgring'],
scoringSystem: { points: [25, 18, 15, 12, 10, 8, 6, 4, 2, 1] },
bonusPointsEnabled: true,
penaltiesEnabled: true,
protestsEnabled: true,
@@ -52,7 +51,7 @@ describe('League Creation - Success Path', () => {
expect(context.eventPublisher.getLeagueCreatedEventCount()).toBe(1);
const events = context.eventPublisher.getLeagueCreatedEvents();
expect(events[0].leagueId).toBe(result.id);
expect(events[0]!.leagueId).toBe(result.id);
});
it('should create a league with minimal configuration', async () => {

View File

@@ -15,7 +15,7 @@ describe('League Discovery - Search', () => {
const results = await context.leagueRepository.search('Formula');
expect(results).toHaveLength(1);
expect(results[0].name).toBe('Formula 1');
expect(results[0]!.name).toBe('Formula 1');
});
it('should find leagues by description', async () => {
@@ -24,6 +24,6 @@ describe('League Discovery - Search', () => {
const results = await context.leagueRepository.search('Competitive');
expect(results).toHaveLength(1);
expect(results[0].name).toBe('League A');
expect(results[0]!.name).toBe('League A');
});
});

View File

@@ -1,4 +1,5 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { Driver } from '@core/racing/domain/entities/Driver';
import { LeaguesTestContext } from '../LeaguesTestContext';
describe('League Roster - Actions', () => {
@@ -13,17 +14,13 @@ describe('League Roster - Actions', () => {
const league = await context.createLeague({ approvalRequired: false });
const driverId = 'driver-joiner';
context.driverRepository.addDriver({
id: driverId,
name: 'Joiner Driver',
rating: 1500,
rank: 100,
avatar: undefined,
starts: 0,
wins: 0,
podiums: 0,
leagues: 0
});
await context.driverRepository.create(Driver.rehydrate({
id: driverId,
iracingId: `${driverId}-iracing`,
name: 'Joiner Driver',
country: 'US',
joinedAt: new Date(),
}));
await context.joinLeagueUseCase.execute({ leagueId: league.id, driverId });
@@ -35,17 +32,13 @@ describe('League Roster - Actions', () => {
const league = await context.createLeague({ approvalRequired: true });
const driverId = 'driver-requester';
context.driverRepository.addDriver({
id: driverId,
name: 'Requester Driver',
rating: 1500,
rank: 100,
avatar: undefined,
starts: 0,
wins: 0,
podiums: 0,
leagues: 0
});
await context.driverRepository.create(Driver.rehydrate({
id: driverId,
iracingId: `${driverId}-iracing`,
name: 'Requester Driver',
country: 'US',
joinedAt: new Date(),
}));
await context.joinLeagueUseCase.execute({ leagueId: league.id, driverId });
@@ -58,21 +51,17 @@ describe('League Roster - Actions', () => {
const league = await context.createLeague({ ownerId, approvalRequired: true });
const driverId = 'driver-requester';
context.driverRepository.addDriver({
id: driverId,
name: 'Requester Driver',
rating: 1500,
rank: 100,
avatar: undefined,
starts: 0,
wins: 0,
podiums: 0,
leagues: 0
});
await context.driverRepository.create(Driver.rehydrate({
id: driverId,
iracingId: `${driverId}-iracing`,
name: 'Requester Driver',
country: 'US',
joinedAt: new Date(),
}));
await context.joinLeagueUseCase.execute({ leagueId: league.id, driverId });
const requests = await context.leagueRepository.getPendingRequests(league.id);
const requestId = requests[0].id;
const requestId = requests[0]!.id;
await context.approveMembershipRequestUseCase.execute({ leagueId: league.id, requestId });
@@ -88,21 +77,17 @@ describe('League Roster - Actions', () => {
const league = await context.createLeague({ ownerId, approvalRequired: true });
const driverId = 'driver-requester';
context.driverRepository.addDriver({
id: driverId,
name: 'Requester Driver',
rating: 1500,
rank: 100,
avatar: undefined,
starts: 0,
wins: 0,
podiums: 0,
leagues: 0
});
await context.driverRepository.create(Driver.rehydrate({
id: driverId,
iracingId: `${driverId}-iracing`,
name: 'Requester Driver',
country: 'US',
joinedAt: new Date(),
}));
await context.joinLeagueUseCase.execute({ leagueId: league.id, driverId });
const requests = await context.leagueRepository.getPendingRequests(league.id);
const requestId = requests[0].id;
const requestId = requests[0]!.id;
await context.rejectMembershipRequestUseCase.execute({ leagueId: league.id, requestId });

View File

@@ -74,7 +74,7 @@ describe('League Roster - Success Path', () => {
const result = await context.getLeagueRosterUseCase.execute({ leagueId: league.id });
expect(result.members).toHaveLength(1);
expect(result.members[0].role).toBe('owner');
expect(result.members[0]!.role).toBe('owner');
expect(result.stats.adminCount).toBe(1);
});
});

View File

@@ -11,14 +11,12 @@ describe('League Settings - Scoring', () => {
it('should retrieve league scoring configuration', async () => {
const league = await context.createLeague({
scoringSystem: { points: [10, 8, 6] },
bonusPointsEnabled: true,
penaltiesEnabled: true,
});
const result = await context.leagueRepository.findById(league.id);
expect(result?.scoringSystem).toEqual({ points: [10, 8, 6] });
expect(result?.bonusPointsEnabled).toBe(true);
expect(result?.penaltiesEnabled).toBe(true);
});
@@ -26,10 +24,9 @@ describe('League Settings - Scoring', () => {
it('should update league scoring configuration', async () => {
const league = await context.createLeague({ bonusPointsEnabled: false });
await context.leagueRepository.update(league.id, { bonusPointsEnabled: true, scoringSystem: { points: [25, 18] } });
await context.leagueRepository.update(league.id, { bonusPointsEnabled: true });
const updated = await context.leagueRepository.findById(league.id);
expect(updated?.bonusPointsEnabled).toBe(true);
expect(updated?.scoringSystem).toEqual({ points: [25, 18] });
});
});

View File

@@ -96,7 +96,7 @@ describe('League Sponsorships - GetSeasonSponsorshipsUseCase', () => {
track: 'Track 3',
car: 'GT3',
scheduledAt: new Date('2025-01-25T20:00:00.000Z'),
status: 'planned',
status: 'scheduled',
}),
);
};

View File

@@ -53,12 +53,12 @@ describe('GetLeagueStandings', () => {
expect(result.isOk()).toBe(true);
const data = result.unwrap();
expect(data.standings).toHaveLength(2);
expect(data.standings[0].driverId).toBe(driver1Id);
expect(data.standings[0].points).toBe(100);
expect(data.standings[0].rank).toBe(1);
expect(data.standings[1].driverId).toBe(driver2Id);
expect(data.standings[1].points).toBe(80);
expect(data.standings[1].rank).toBe(2);
expect(data.standings[0]!.driverId).toBe(driver1Id);
expect(data.standings[0]!.points).toBe(100);
expect(data.standings[0]!.rank).toBe(1);
expect(data.standings[1]!.driverId).toBe(driver2Id);
expect(data.standings[1]!.points).toBe(80);
expect(data.standings[1]!.rank).toBe(2);
});
it('should retrieve standings with minimal driver statistics', async () => {

View File

@@ -63,6 +63,7 @@ describe('StandingsCalculation', () => {
fastestLap: 120000,
incidents: 0,
startPosition: 1,
points: 25,
}));
await context.resultRepository.create(Result.create({
@@ -73,6 +74,7 @@ describe('StandingsCalculation', () => {
fastestLap: 121000,
incidents: 2,
startPosition: 5,
points: 15,
}));
// When: Standings are recalculated

View File

@@ -107,7 +107,7 @@ describe('League Stewarding - GetLeagueStewarding', () => {
reason: 'Contact on corner entry',
issuedBy: 'steward-1',
status: params.status || 'pending',
...(params.raceId && { raceId: params.raceId }),
raceId: params.raceId || 'default-race-id',
});
await context.penaltyRepository.create(penalty);

View File

@@ -52,7 +52,6 @@ describe('League Stewarding - StewardingManagement', () => {
context.protestRepository,
context.raceRepository,
context.leagueMembershipRepository,
context.racingDriverRepository,
);
requestProtestDefenseUseCase = new RequestProtestDefenseUseCase(

View File

@@ -38,7 +38,7 @@ describe('Sponsor Logo Management', () => {
// Then: The sponsor should have the correct logo URL
const savedSponsor = await sponsorRepository.findById('sponsor-1');
expect(savedSponsor?.logoUrl?.value).toBe(logoUrl);
expect(savedSponsor?.logoUrl?.toString()).toBe(logoUrl);
});
it('should retrieve sponsor logos (simulated via repository)', async () => {
@@ -52,6 +52,6 @@ describe('Sponsor Logo Management', () => {
const found = await sponsorRepository.findById('sponsor-1');
expect(found).not.toBeNull();
expect(found?.logoUrl?.value).toBe('https://example.com/logo.png');
expect(found?.logoUrl?.toString()).toBe('https://example.com/logo.png');
});
});

View File

@@ -19,7 +19,6 @@ describe('Track Image Management', () => {
id: 'track-1',
name: 'Test Track',
shortName: 'TST',
location: 'Test Location',
country: 'Test Country',
gameId: 'game-1',
category: 'road',
@@ -42,7 +41,7 @@ describe('Track Image Management', () => {
// Then: The track should have the correct image URL
const savedTrack = await trackRepository.findById('track-1');
expect(savedTrack?.imageUrl?.value).toBe(imageUrl);
expect(savedTrack?.imageUrl?.toString()).toBe(imageUrl);
});
it('should retrieve track images (simulated via repository)', async () => {
@@ -50,7 +49,6 @@ describe('Track Image Management', () => {
id: 'track-1',
name: 'Test Track',
shortName: 'TST',
location: 'Test Location',
country: 'Test Country',
gameId: 'game-1',
category: 'road',
@@ -60,6 +58,6 @@ describe('Track Image Management', () => {
const found = await trackRepository.findById('track-1');
expect(found).not.toBeNull();
expect(found?.imageUrl?.value).toBe('https://example.com/track.png');
expect(found?.imageUrl?.toString()).toBe('https://example.com/track.png');
});
});

View File

@@ -51,7 +51,6 @@ describe('GetRaceResultsDetailUseCase', () => {
raceId,
driverId,
position: 1,
lapsCompleted: 20,
totalTime: 3600,
fastestLap: 105,
points: 25,

View File

@@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach } from 'vitest';
import { GetSponsorBillingUseCase } from '../../../../core/payments/application/use-cases/GetSponsorBillingUseCase';
import { Sponsor } from '../../../../core/racing/domain/entities/sponsor/Sponsor';
import { SeasonSponsorship } from '../../../../core/racing/domain/entities/season/SeasonSponsorship';
import { Payment, PaymentType, PaymentStatus } from '../../../../core/payments/domain/entities/Payment';
import { Payment, PaymentType, PaymentStatus, PayerType } from '../../../../core/payments/domain/entities/Payment';
import { Money } from '../../../../core/racing/domain/value-objects/Money';
import { SponsorTestContext } from '../SponsorTestContext';
@@ -55,7 +55,7 @@ describe('Sponsor Billing Use Case Orchestration', () => {
platformFee: 100,
netAmount: 900,
payerId: 'sponsor-123',
payerType: 'sponsor',
payerType: 'team',
leagueId: 'league-1',
seasonId: 'season-1',
status: PaymentStatus.COMPLETED,
@@ -71,7 +71,7 @@ describe('Sponsor Billing Use Case Orchestration', () => {
platformFee: 200,
netAmount: 1800,
payerId: 'sponsor-123',
payerType: 'sponsor',
payerType: 'team',
leagueId: 'league-2',
seasonId: 'season-2',
status: PaymentStatus.COMPLETED,
@@ -87,7 +87,7 @@ describe('Sponsor Billing Use Case Orchestration', () => {
platformFee: 300,
netAmount: 2700,
payerId: 'sponsor-123',
payerType: 'sponsor',
payerType: 'team',
leagueId: 'league-3',
seasonId: 'season-3',
status: PaymentStatus.COMPLETED,
@@ -133,7 +133,7 @@ describe('Sponsor Billing Use Case Orchestration', () => {
platformFee: 100,
netAmount: 900,
payerId: 'sponsor-123',
payerType: 'sponsor',
payerType: 'team',
leagueId: 'league-1',
seasonId: 'season-1',
status: PaymentStatus.COMPLETED,
@@ -149,7 +149,7 @@ describe('Sponsor Billing Use Case Orchestration', () => {
platformFee: 50,
netAmount: 450,
payerId: 'sponsor-123',
payerType: 'sponsor',
payerType: 'team',
leagueId: 'league-2',
seasonId: 'season-2',
status: PaymentStatus.PENDING,

View File

@@ -96,7 +96,7 @@ describe('Sponsor Campaigns Use Case Orchestration', () => {
expect(sponsorships.summary.activeSponsorships).toBe(1);
expect(sponsorships.summary.totalInvestment.amount).toBe(1000);
const s1 = sponsorships.sponsorships[0];
const s1 = sponsorships.sponsorships[0]!;
expect(s1.metrics.drivers).toBe(10);
expect(s1.metrics.races).toBe(5);
expect(s1.metrics.impressions).toBe(5000);

View File

@@ -44,7 +44,7 @@ describe('Sponsor League Detail Use Case Orchestration', () => {
expect(pricingResult.entityId).toBe(leagueId);
expect(pricingResult.acceptingApplications).toBe(true);
expect(pricingResult.tiers).toHaveLength(2);
expect(pricingResult.tiers[0].name).toBe('main');
expect(pricingResult.tiers[0]!.name).toBe('main');
expect(pricingResult.tiers[0].price.amount).toBe(10000);
});
});
@@ -52,7 +52,7 @@ describe('Sponsor League Detail Use Case Orchestration', () => {
describe('GetEntitySponsorshipPricingUseCase - Error Handling', () => {
it('should return error when pricing is not configured', async () => {
const result = await getEntitySponsorshipPricingUseCase.execute({
entityType: 'league',
entityType: 'season',
entityId: 'non-existent',
});

View File

@@ -28,8 +28,7 @@ describe('GetAllTeamsUseCase', () => {
performanceLevel: 'intermediate',
specialization: 'sprint',
region: 'EU',
languages: ['en'],
isRecruiting: true
languages: ['en']
});
const result = await getAllTeamsUseCase.execute({});

View File

@@ -163,7 +163,6 @@ describe('Team Membership Use Cases', () => {
id: 'jr2',
teamId,
driverId: 'd14',
status: 'pending',
requestedAt: new Date()
});
@@ -189,7 +188,6 @@ describe('Team Membership Use Cases', () => {
id: 'jr4',
teamId,
driverId,
status: 'pending',
requestedAt: new Date()
});