import { describe, it, expect, beforeEach } from 'vitest'; 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'; context.driverRepository.addDriver({ id: driverId, name: 'Joiner Driver', rating: 1500, rank: 100, avatar: undefined, starts: 0, wins: 0, podiums: 0, leagues: 0 }); 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'; context.driverRepository.addDriver({ id: driverId, name: 'Requester Driver', rating: 1500, rank: 100, avatar: undefined, starts: 0, wins: 0, podiums: 0, leagues: 0 }); 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'; context.driverRepository.addDriver({ id: driverId, name: 'Requester Driver', rating: 1500, rank: 100, avatar: undefined, starts: 0, wins: 0, podiums: 0, leagues: 0 }); 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'; context.driverRepository.addDriver({ id: driverId, name: 'Requester Driver', rating: 1500, rank: 100, avatar: undefined, starts: 0, wins: 0, podiums: 0, leagues: 0 }); 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); }); });