129 lines
3.9 KiB
TypeScript
129 lines
3.9 KiB
TypeScript
import { describe, it, expect, beforeEach, vi, Mock } from 'vitest';
|
|
import { GetTeamMembersUseCase } from './GetTeamMembersUseCase';
|
|
import { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository';
|
|
import { IDriverRepository } from '../../domain/repositories/IDriverRepository';
|
|
import { Driver } from '../../domain/entities/Driver';
|
|
import type { Logger } from '@core/shared/application';
|
|
|
|
describe('GetTeamMembersUseCase', () => {
|
|
let useCase: GetTeamMembersUseCase;
|
|
let membershipRepository: {
|
|
getTeamMembers: Mock;
|
|
};
|
|
let driverRepository: {
|
|
findById: Mock;
|
|
};
|
|
let getDriverAvatar: Mock;
|
|
let logger: {
|
|
debug: Mock;
|
|
info: Mock;
|
|
warn: Mock;
|
|
error: Mock;
|
|
};
|
|
|
|
beforeEach(() => {
|
|
membershipRepository = {
|
|
getTeamMembers: vi.fn(),
|
|
};
|
|
driverRepository = {
|
|
findById: vi.fn(),
|
|
};
|
|
getDriverAvatar = vi.fn();
|
|
logger = {
|
|
debug: vi.fn(),
|
|
info: vi.fn(),
|
|
warn: vi.fn(),
|
|
error: vi.fn(),
|
|
};
|
|
useCase = new GetTeamMembersUseCase(
|
|
membershipRepository as unknown as ITeamMembershipRepository,
|
|
driverRepository as unknown as IDriverRepository,
|
|
getDriverAvatar,
|
|
logger as unknown as Logger,
|
|
);
|
|
});
|
|
|
|
it('should return team members with driver names and avatar urls', async () => {
|
|
const teamId = 'team-1';
|
|
const memberships = [
|
|
{ teamId, driverId: 'driver-1', role: 'owner' as const, status: 'active' as const, joinedAt: new Date() },
|
|
{ teamId, 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',
|
|
});
|
|
|
|
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);
|
|
});
|
|
getDriverAvatar.mockImplementation((input) => {
|
|
if (input.driverId === 'driver-1') return Promise.resolve({ avatarUrl: 'avatar-driver-1' });
|
|
if (input.driverId === 'driver-2') return Promise.resolve({ avatarUrl: 'avatar-driver-2' });
|
|
return Promise.resolve({ avatarUrl: 'avatar-default' });
|
|
});
|
|
|
|
const result = await useCase.execute({ teamId });
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
expect(result.unwrap()).toEqual({
|
|
memberships,
|
|
driverNames: {
|
|
'driver-1': 'Driver 1',
|
|
'driver-2': 'Driver 2',
|
|
},
|
|
avatarUrls: {
|
|
'driver-1': 'avatar-driver-1',
|
|
'driver-2': 'avatar-driver-2',
|
|
},
|
|
});
|
|
});
|
|
|
|
it('should handle driver not found', async () => {
|
|
const teamId = 'team-1';
|
|
const memberships = [
|
|
{ teamId, driverId: 'driver-1', role: 'owner' as const, status: 'active' as const, joinedAt: new Date() },
|
|
];
|
|
|
|
membershipRepository.getTeamMembers.mockResolvedValue(memberships);
|
|
driverRepository.findById.mockResolvedValue(null);
|
|
getDriverAvatar.mockResolvedValue({ avatarUrl: 'avatar-driver-1' });
|
|
|
|
const result = await useCase.execute({ teamId });
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
expect(result.unwrap()).toEqual({
|
|
memberships,
|
|
driverNames: {},
|
|
avatarUrls: {
|
|
'driver-1': 'avatar-driver-1',
|
|
},
|
|
});
|
|
});
|
|
|
|
it('should return error on repository failure', async () => {
|
|
const teamId = 'team-1';
|
|
const error = new Error('Repository error');
|
|
|
|
membershipRepository.getTeamMembers.mockRejectedValue(error);
|
|
|
|
const result = await useCase.execute({ teamId });
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
expect(result.unwrapErr()).toEqual({
|
|
code: 'REPOSITORY_ERROR',
|
|
details: { message: 'Failed to retrieve team members' },
|
|
});
|
|
});
|
|
}); |