refactor use cases

This commit is contained in:
2026-01-08 15:34:51 +01:00
parent d984ab24a8
commit 52e9a2f6a7
362 changed files with 5192 additions and 8409 deletions

View File

@@ -6,8 +6,6 @@ import {
import { League } from '../../domain/entities/League';
import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository';
import type { ILeagueRepository } from '../../domain/repositories/ILeagueRepository';
import type { UseCaseOutputPort } from '@core/shared/application/UseCaseOutputPort';
describe('ApproveLeagueJoinRequestUseCase', () => {
let mockLeagueMembershipRepo: {
getJoinRequests: Mock;
@@ -34,14 +32,9 @@ describe('ApproveLeagueJoinRequestUseCase', () => {
});
it('approve removes request and adds member', async () => {
const output = {
present: vi.fn(),
};
const useCase = new ApproveLeagueJoinRequestUseCase(
mockLeagueMembershipRepo as unknown as ILeagueMembershipRepository,
mockLeagueRepo as unknown as ILeagueRepository,
);
const useCase = new ApproveLeagueJoinRequestUseCase(mockLeagueMembershipRepo as unknown as ILeagueMembershipRepository,
mockLeagueRepo as unknown as ILeagueRepository);
const leagueId = 'league-1';
const joinRequestId = 'req-1';
@@ -63,11 +56,10 @@ describe('ApproveLeagueJoinRequestUseCase', () => {
const result = await useCase.execute(
{ leagueId, joinRequestId },
output as unknown as UseCaseOutputPort<ApproveLeagueJoinRequestResult>,
);
expect(result.isOk()).toBe(true);
expect(result.unwrap()).toBeUndefined();
expect(result.unwrap()).toEqual({ success: true, message: expect.any(String) });
expect(mockLeagueMembershipRepo.removeJoinRequest).toHaveBeenCalledWith(joinRequestId);
expect(mockLeagueMembershipRepo.saveMembership).toHaveBeenCalledTimes(1);
@@ -87,18 +79,12 @@ describe('ApproveLeagueJoinRequestUseCase', () => {
expect(savedMembership.status.toString()).toBe('active');
expect(savedMembership.joinedAt.toDate()).toBeInstanceOf(Date);
expect(output.present).toHaveBeenCalledWith({ success: true, message: 'Join request approved.' });
});
});
it('approve returns error when request missing', async () => {
const output = {
present: vi.fn(),
};
const useCase = new ApproveLeagueJoinRequestUseCase(
mockLeagueMembershipRepo as unknown as ILeagueMembershipRepository,
mockLeagueRepo as unknown as ILeagueRepository,
);
const useCase = new ApproveLeagueJoinRequestUseCase(mockLeagueMembershipRepo as unknown as ILeagueMembershipRepository,
mockLeagueRepo as unknown as ILeagueRepository);
mockLeagueRepo.findById.mockResolvedValue(
League.create({
@@ -116,25 +102,18 @@ describe('ApproveLeagueJoinRequestUseCase', () => {
const result = await useCase.execute(
{ leagueId: 'league-1', joinRequestId: 'req-1' },
output as unknown as UseCaseOutputPort<ApproveLeagueJoinRequestResult>,
);
expect(result.isOk()).toBe(false);
expect(result.error!.code).toBe('JOIN_REQUEST_NOT_FOUND');
expect(output.present).not.toHaveBeenCalled();
expect(mockLeagueMembershipRepo.removeJoinRequest).not.toHaveBeenCalled();
expect(mockLeagueMembershipRepo.saveMembership).not.toHaveBeenCalled();
});
it('rejects approval when league is at capacity and does not mutate state', async () => {
const output = {
present: vi.fn(),
};
const useCase = new ApproveLeagueJoinRequestUseCase(
mockLeagueMembershipRepo as unknown as ILeagueMembershipRepository,
mockLeagueRepo as unknown as ILeagueRepository,
);
const useCase = new ApproveLeagueJoinRequestUseCase(mockLeagueMembershipRepo as unknown as ILeagueMembershipRepository,
mockLeagueRepo as unknown as ILeagueRepository);
const leagueId = 'league-1';
const joinRequestId = 'req-1';
@@ -174,12 +153,10 @@ describe('ApproveLeagueJoinRequestUseCase', () => {
const result = await useCase.execute(
{ leagueId, joinRequestId },
output as unknown as UseCaseOutputPort<ApproveLeagueJoinRequestResult>,
);
expect(result.isErr()).toBe(true);
expect(result.unwrapErr().code).toBe('LEAGUE_AT_CAPACITY');
expect(output.present).not.toHaveBeenCalled();
expect(mockLeagueMembershipRepo.removeJoinRequest).not.toHaveBeenCalled();
expect(mockLeagueMembershipRepo.saveMembership).not.toHaveBeenCalled();
});