import { describe, it, expect, beforeEach } from 'vitest'; import { Driver } from '@core/racing/domain/entities/Driver'; import { LeaguesTestContext } from '../LeaguesTestContext'; describe('League Roster - Actions', () => { let context: LeaguesTestContext; beforeEach(() => { context = new LeaguesTestContext(); context.clear(); }); it('should allow a driver to join a public league without approval', async () => { const league = await context.createLeague({ approvalRequired: false }); const driverId = 'driver-joiner'; 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 }); const members = await context.leagueRepository.getLeagueMembers(league.id); expect(members.some(m => m.driverId === driverId)).toBe(true); }); it('should create a pending request when joining a league requiring approval', async () => { const league = await context.createLeague({ approvalRequired: true }); const driverId = 'driver-requester'; 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); expect(requests.some(r => r.driverId === driverId)).toBe(true); }); it('should allow an admin to approve a membership request', async () => { const ownerId = 'driver-owner'; const league = await context.createLeague({ ownerId, approvalRequired: true }); const driverId = 'driver-requester'; 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; await context.approveMembershipRequestUseCase.execute({ leagueId: league.id, requestId }); const members = await context.leagueRepository.getLeagueMembers(league.id); expect(members.some(m => m.driverId === driverId)).toBe(true); const updatedRequests = await context.leagueRepository.getPendingRequests(league.id); expect(updatedRequests).toHaveLength(0); }); it('should allow an admin to reject a membership request', async () => { const ownerId = 'driver-owner'; const league = await context.createLeague({ ownerId, approvalRequired: true }); const driverId = 'driver-requester'; 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; await context.rejectMembershipRequestUseCase.execute({ leagueId: league.id, requestId }); const members = await context.leagueRepository.getLeagueMembers(league.id); expect(members.some(m => m.driverId === driverId)).toBe(false); const updatedRequests = await context.leagueRepository.getPendingRequests(league.id); expect(updatedRequests).toHaveLength(0); }); it('should allow a driver to leave a league', async () => { const league = await context.createLeague(); const driverId = 'driver-leaver'; context.leagueRepository.addLeagueMembers(league.id, [ { driverId, name: 'Leaver', role: 'member', joinDate: new Date() } ]); await context.leaveLeagueUseCase.execute({ leagueId: league.id, driverId }); const members = await context.leagueRepository.getLeagueMembers(league.id); expect(members.some(m => m.driverId === driverId)).toBe(false); }); });