This commit is contained in:
2025-12-12 21:39:48 +01:00
parent ddbd99b747
commit cae81b1088
49 changed files with 777 additions and 269 deletions

View File

@@ -56,6 +56,7 @@ import type {
DriverTeamResultDTO,
DriverTeamViewModel,
} from '@gridpilot/racing/application/presenters/IDriverTeamPresenter';
import type { RaceRegistrationsResultDTO } from '@gridpilot/racing/application/presenters/IRaceRegistrationsPresenter';
/**
* Simple in-memory fakes mirroring current alpha behavior.
@@ -179,16 +180,14 @@ class TestRaceRegistrationsPresenter implements IRaceRegistrationsPresenter {
raceId: string | null = null;
driverIds: string[] = [];
// Accepts either the legacy (raceId, driverIds) shape or the new (driverIds) shape
present(raceIdOrDriverIds: string | string[], driverIds?: string[]): void {
if (Array.isArray(raceIdOrDriverIds) && driverIds == null) {
this.raceId = null;
this.driverIds = raceIdOrDriverIds;
return;
}
reset(): void {
this.raceId = null;
this.driverIds = [];
}
this.raceId = raceIdOrDriverIds as string;
this.driverIds = driverIds ?? [];
present(input: RaceRegistrationsResultDTO): void {
this.driverIds = input.registeredDriverIds;
this.raceId = null;
}
}
@@ -318,6 +317,10 @@ class InMemoryTeamMembershipRepository implements ITeamMembershipRepository {
getAllJoinRequests(): TeamJoinRequest[] {
return [...this.joinRequests];
}
async countByTeamId(teamId: string): Promise<number> {
return this.memberships.filter((m) => m.teamId === teamId).length;
}
}
describe('Racing application use-cases - registrations', () => {
@@ -342,10 +345,7 @@ describe('Racing application use-cases - registrations', () => {
driverRegistrationPresenter,
);
raceRegistrationsPresenter = new TestRaceRegistrationsPresenter();
getRaceRegistrations = new GetRaceRegistrationsUseCase(
registrationRepo,
raceRegistrationsPresenter,
);
getRaceRegistrations = new GetRaceRegistrationsUseCase(registrationRepo);
});
it('registers an active league member for a race and tracks registration', async () => {
@@ -362,7 +362,7 @@ describe('Racing application use-cases - registrations', () => {
expect(driverRegistrationPresenter.raceId).toBe(raceId);
expect(driverRegistrationPresenter.driverId).toBe(driverId);
await getRaceRegistrations.execute({ raceId });
await getRaceRegistrations.execute({ raceId }, raceRegistrationsPresenter);
expect(raceRegistrationsPresenter.driverIds).toContain(driverId);
});
@@ -389,7 +389,7 @@ describe('Racing application use-cases - registrations', () => {
await isDriverRegistered.execute({ raceId, driverId });
expect(driverRegistrationPresenter.isRegistered).toBe(false);
await getRaceRegistrations.execute({ raceId });
await getRaceRegistrations.execute({ raceId }, raceRegistrationsPresenter);
expect(raceRegistrationsPresenter.driverIds).toEqual([]);
});
});
@@ -458,8 +458,16 @@ describe('Racing application use-cases - teams', () => {
class TestTeamDetailsPresenter implements ITeamDetailsPresenter {
viewModel: any = null;
present(team: any, membership: any, driverId: string): void {
this.viewModel = { team, membership, driverId };
reset(): void {
this.viewModel = null;
}
present(input: any): void {
this.viewModel = input;
}
getViewModel(): any {
return this.viewModel;
}
}
@@ -744,7 +752,7 @@ describe('Racing application use-cases - teams', () => {
updatedBy: ownerId,
});
await getTeamDetailsUseCase.execute(created.team.id, ownerId);
await getTeamDetailsUseCase.execute({ teamId: created.team.id, driverId: ownerId }, teamDetailsPresenter);
expect(teamDetailsPresenter.viewModel.team.name).toBe('Updated Name');
expect(teamDetailsPresenter.viewModel.team.description).toBe('Updated description');