import { ApproveLeagueJoinRequestUseCase } from '@core/racing/application/use-cases/ApproveLeagueJoinRequestUseCase'; import { ApproveLeagueJoinRequestPresenter } from '@apps/api/src/modules/league/presenters/ApproveLeagueJoinRequestPresenter'; describe('ApproveLeagueJoinRequestUseCase', () => { let useCase: ApproveLeagueJoinRequestUseCase; let leagueMembershipRepository: jest.Mocked; let presenter: ApproveLeagueJoinRequestPresenter; beforeEach(() => { leagueMembershipRepository = { getJoinRequests: jest.fn(), removeJoinRequest: jest.fn(), saveMembership: jest.fn(), } as unknown; presenter = new ApproveLeagueJoinRequestPresenter(); useCase = new ApproveLeagueJoinRequestUseCase(leagueMembershipRepository); }); it('should approve join request and save membership', async () => { const leagueId = 'league-1'; const requestId = 'req-1'; const joinRequests = [{ id: requestId, leagueId, driverId: 'driver-1', requestedAt: new Date(), message: 'msg' }]; leagueMembershipRepository.getJoinRequests.mockResolvedValue(joinRequests); await useCase.execute({ leagueId, requestId }, presenter); expect(leagueMembershipRepository.removeJoinRequest).toHaveBeenCalledWith(requestId); expect(leagueMembershipRepository.saveMembership).toHaveBeenCalledWith({ leagueId, driverId: 'driver-1', role: 'member', status: 'active', joinedAt: expect.any(Date), }); expect(presenter.viewModel).toEqual({ success: true, message: 'Join request approved.' }); }); it('should throw error if request not found', async () => { leagueMembershipRepository.getJoinRequests.mockResolvedValue([]); await expect(useCase.execute({ leagueId: 'league-1', requestId: 'req-1' }, presenter)).rejects.toThrow('Join request not found'); }); });