177 lines
5.0 KiB
TypeScript
177 lines
5.0 KiB
TypeScript
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
|
|
import { beforeEach, describe, expect, it, vi, type Mock } from 'vitest';
|
|
import { Driver } from '../../domain/entities/Driver';
|
|
import { Team } from '../../domain/entities/Team';
|
|
import {
|
|
GetTeamMembersUseCase,
|
|
type GetTeamMembersErrorCode,
|
|
type GetTeamMembersInput
|
|
} from './GetTeamMembersUseCase';
|
|
|
|
describe('GetTeamMembersUseCase', () => {
|
|
let useCase: GetTeamMembersUseCase;
|
|
let membershipRepository: {
|
|
getTeamMembers: Mock;
|
|
};
|
|
let driverRepository: {
|
|
findById: Mock;
|
|
};
|
|
let teamRepository: {
|
|
findById: Mock;
|
|
};
|
|
let logger: {
|
|
debug: Mock;
|
|
info: Mock;
|
|
warn: Mock;
|
|
error: Mock;
|
|
};
|
|
beforeEach(() => {
|
|
membershipRepository = {
|
|
getTeamMembers: vi.fn(),
|
|
};
|
|
driverRepository = {
|
|
findById: vi.fn(),
|
|
};
|
|
teamRepository = {
|
|
findById: vi.fn(),
|
|
};
|
|
logger = {
|
|
debug: vi.fn(),
|
|
info: vi.fn(),
|
|
warn: vi.fn(),
|
|
error: vi.fn(),
|
|
};
|
|
useCase = new GetTeamMembersUseCase(membershipRepository as any,
|
|
driverRepository as any,
|
|
teamRepository as any,
|
|
logger as any);
|
|
});
|
|
|
|
it('should return team members with driver entities', async () => {
|
|
const team = Team.create({
|
|
id: 'team-1',
|
|
name: 'Team Name',
|
|
tag: 'TAG',
|
|
description: 'Description',
|
|
ownerId: 'driver-1',
|
|
leagues: [],
|
|
});
|
|
|
|
const input: GetTeamMembersInput = { teamId: team.id };
|
|
|
|
const memberships = [
|
|
{ teamId: team.id, driverId: 'driver-1', role: 'owner' as const, status: 'active' as const, joinedAt: new Date() },
|
|
{ teamId: team.id, driverId: 'driver-2', role: 'driver' as const, status: 'active' as const, joinedAt: new Date() },
|
|
];
|
|
|
|
const driver1 = Driver.create({
|
|
id: 'driver-1',
|
|
iracingId: '123',
|
|
name: 'Driver 1',
|
|
country: 'US',
|
|
});
|
|
|
|
const driver2 = Driver.create({
|
|
id: 'driver-2',
|
|
iracingId: '456',
|
|
name: 'Driver 2',
|
|
country: 'UK',
|
|
});
|
|
|
|
teamRepository.findById.mockResolvedValue(team);
|
|
membershipRepository.getTeamMembers.mockResolvedValue(memberships);
|
|
driverRepository.findById.mockImplementation((id: string) => {
|
|
if (id === 'driver-1') return Promise.resolve(driver1);
|
|
if (id === 'driver-2') return Promise.resolve(driver2);
|
|
return Promise.resolve(null);
|
|
});
|
|
|
|
const result = await useCase.execute(input);
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
const resultValue = result.unwrap();
|
|
expect(resultValue.team).toBe(team);
|
|
expect(resultValue.members).toHaveLength(2);
|
|
expect(resultValue.members[0]).toEqual({ membership: memberships[0], driver: driver1 });
|
|
expect(resultValue.members[1]).toEqual({ membership: memberships[1], driver: driver2 });
|
|
});
|
|
|
|
it('should handle driver not found', async () => {
|
|
const team = Team.create({
|
|
id: 'team-1',
|
|
name: 'Team Name',
|
|
tag: 'TAG',
|
|
description: 'Description',
|
|
ownerId: 'driver-1',
|
|
leagues: [],
|
|
});
|
|
|
|
const input: GetTeamMembersInput = { teamId: team.id };
|
|
|
|
const memberships = [
|
|
{ teamId: team.id, driverId: 'driver-1', role: 'owner' as const, status: 'active' as const, joinedAt: new Date() },
|
|
];
|
|
|
|
teamRepository.findById.mockResolvedValue(team);
|
|
membershipRepository.getTeamMembers.mockResolvedValue(memberships);
|
|
driverRepository.findById.mockResolvedValue(null);
|
|
|
|
const result = await useCase.execute(input);
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
const resultValue = result.unwrap();
|
|
expect(resultValue.team).toBe(team);
|
|
expect(resultValue.members).toEqual([
|
|
{ membership: memberships[0], driver: null },
|
|
]);
|
|
});
|
|
|
|
it('should return TEAM_NOT_FOUND when team does not exist', async () => {
|
|
const input: GetTeamMembersInput = { teamId: 'missing-team' };
|
|
|
|
teamRepository.findById.mockResolvedValue(null);
|
|
|
|
const result = await useCase.execute(input);
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
|
|
const error = result.unwrapErr() as ApplicationErrorCode<
|
|
GetTeamMembersErrorCode,
|
|
{ message: string }
|
|
>;
|
|
|
|
expect(error.code).toBe('TEAM_NOT_FOUND');
|
|
expect(error.details.message).toBe('Team not found');
|
|
});
|
|
|
|
it('should return REPOSITORY_ERROR when repository throws', async () => {
|
|
const team = Team.create({
|
|
id: 'team-1',
|
|
name: 'Team Name',
|
|
tag: 'TAG',
|
|
description: 'Description',
|
|
ownerId: 'driver-1',
|
|
leagues: [],
|
|
});
|
|
|
|
const input: GetTeamMembersInput = { teamId: team.id };
|
|
|
|
const error = new Error('Repository failure');
|
|
|
|
teamRepository.findById.mockResolvedValue(team);
|
|
membershipRepository.getTeamMembers.mockRejectedValue(error);
|
|
|
|
const result = await useCase.execute(input);
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
|
|
const err = result.unwrapErr() as ApplicationErrorCode<
|
|
GetTeamMembersErrorCode,
|
|
{ message: string }
|
|
>;
|
|
|
|
expect(err.code).toBe('REPOSITORY_ERROR');
|
|
expect(err.details.message).toBe('Repository failure');
|
|
});
|
|
});
|