Some checks failed
CI / lint-typecheck (pull_request) Failing after 4m50s
CI / tests (pull_request) Has been skipped
CI / contract-tests (pull_request) Has been skipped
CI / e2e-tests (pull_request) Has been skipped
CI / comment-pr (pull_request) Has been skipped
CI / commit-types (pull_request) Has been skipped
194 lines
6.1 KiB
TypeScript
194 lines
6.1 KiB
TypeScript
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { TeamsTestContext } from '../TeamsTestContext';
|
|
import { Team } from '../../../../core/racing/domain/entities/Team';
|
|
|
|
describe('CreateTeamUseCase', () => {
|
|
const context = new TeamsTestContext();
|
|
const createTeamUseCase = context.createCreateTeamUseCase();
|
|
|
|
beforeEach(() => {
|
|
context.clear();
|
|
});
|
|
|
|
describe('Success Path', () => {
|
|
it('should create a team with all required fields', async () => {
|
|
const driverId = 'd1';
|
|
const leagueId = 'l1';
|
|
|
|
const result = await createTeamUseCase.execute({
|
|
name: 'Test Team',
|
|
tag: 'TT',
|
|
description: 'A test team',
|
|
ownerId: driverId,
|
|
leagues: [leagueId]
|
|
});
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
const { team } = result.unwrap();
|
|
|
|
expect(team.name.toString()).toBe('Test Team');
|
|
expect(team.tag.toString()).toBe('TT');
|
|
expect(team.description.toString()).toBe('A test team');
|
|
expect(team.ownerId.toString()).toBe(driverId);
|
|
expect(team.leagues.map(l => l.toString())).toContain(leagueId);
|
|
|
|
const savedTeam = await context.teamRepository.findById(team.id.toString());
|
|
expect(savedTeam).toBeDefined();
|
|
expect(savedTeam?.name.toString()).toBe('Test Team');
|
|
|
|
const membership = await context.membershipRepository.getMembership(team.id.toString(), driverId);
|
|
expect(membership).toBeDefined();
|
|
expect(membership?.role).toBe('owner');
|
|
expect(membership?.status).toBe('active');
|
|
});
|
|
|
|
it('should create a team with optional description', async () => {
|
|
const driverId = 'd2';
|
|
const leagueId = 'l2';
|
|
|
|
const result = await createTeamUseCase.execute({
|
|
name: 'Team With Description',
|
|
tag: 'TWD',
|
|
description: 'This team has a detailed description',
|
|
ownerId: driverId,
|
|
leagues: [leagueId]
|
|
});
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
const { team } = result.unwrap();
|
|
expect(team.description.toString()).toBe('This team has a detailed description');
|
|
});
|
|
});
|
|
|
|
describe('Validation', () => {
|
|
it('should reject team creation with empty team name', async () => {
|
|
const driverId = 'd4';
|
|
const leagueId = 'l4';
|
|
|
|
const result = await createTeamUseCase.execute({
|
|
name: '',
|
|
tag: 'TT',
|
|
description: 'A test team',
|
|
ownerId: driverId,
|
|
leagues: [leagueId]
|
|
});
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
const error = result.unwrapErr();
|
|
expect(error.code).toBe('REPOSITORY_ERROR');
|
|
});
|
|
|
|
it('should reject team creation with empty description', async () => {
|
|
const driverId = 'd3';
|
|
const leagueId = 'l3';
|
|
|
|
const result = await createTeamUseCase.execute({
|
|
name: 'Minimal Team',
|
|
tag: 'MT',
|
|
description: '',
|
|
ownerId: driverId,
|
|
leagues: [leagueId]
|
|
});
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
const error = result.unwrapErr();
|
|
expect(error.code).toBe('REPOSITORY_ERROR');
|
|
});
|
|
|
|
it('should reject team creation when driver already belongs to a team', async () => {
|
|
const driverId = 'd6';
|
|
const leagueId = 'l6';
|
|
|
|
const existingTeam = Team.create({ id: 'existing', name: 'Existing Team', tag: 'ET', description: 'Existing', ownerId: driverId, leagues: [] });
|
|
await context.teamRepository.create(existingTeam);
|
|
await context.membershipRepository.saveMembership({
|
|
teamId: 'existing',
|
|
driverId: driverId,
|
|
role: 'driver',
|
|
status: 'active',
|
|
joinedAt: new Date()
|
|
});
|
|
|
|
const result = await createTeamUseCase.execute({
|
|
name: 'New Team',
|
|
tag: 'NT',
|
|
description: 'A new team',
|
|
ownerId: driverId,
|
|
leagues: [leagueId]
|
|
});
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
const error = result.unwrapErr();
|
|
expect(error.code).toBe('VALIDATION_ERROR');
|
|
expect(error.details.message).toContain('already belongs to a team');
|
|
});
|
|
});
|
|
|
|
describe('Business Logic', () => {
|
|
it('should set the creating driver as team captain', async () => {
|
|
const driverId = 'd10';
|
|
const leagueId = 'l10';
|
|
|
|
const result = await createTeamUseCase.execute({
|
|
name: 'Captain Team',
|
|
tag: 'CT',
|
|
description: 'A team with captain',
|
|
ownerId: driverId,
|
|
leagues: [leagueId]
|
|
});
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
const { team } = result.unwrap();
|
|
|
|
const membership = await context.membershipRepository.getMembership(team.id.toString(), driverId);
|
|
expect(membership).toBeDefined();
|
|
expect(membership?.role).toBe('owner');
|
|
});
|
|
|
|
it('should generate unique team ID', async () => {
|
|
const driverId = 'd11';
|
|
const leagueId = 'l11';
|
|
|
|
const result = await createTeamUseCase.execute({
|
|
name: 'Unique Team',
|
|
tag: 'UT',
|
|
description: 'A unique team',
|
|
ownerId: driverId,
|
|
leagues: [leagueId]
|
|
});
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
const { team } = result.unwrap();
|
|
expect(team.id.toString()).toBeDefined();
|
|
expect(team.id.toString().length).toBeGreaterThan(0);
|
|
|
|
const existingTeam = await context.teamRepository.findById(team.id.toString());
|
|
expect(existingTeam).toBeDefined();
|
|
expect(existingTeam?.id.toString()).toBe(team.id.toString());
|
|
});
|
|
|
|
it('should set creation timestamp', async () => {
|
|
const driverId = 'd12';
|
|
const leagueId = 'l12';
|
|
|
|
const beforeCreate = new Date();
|
|
const result = await createTeamUseCase.execute({
|
|
name: 'Timestamp Team',
|
|
tag: 'TT',
|
|
description: 'A team with timestamp',
|
|
ownerId: driverId,
|
|
leagues: [leagueId]
|
|
});
|
|
const afterCreate = new Date();
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
const { team } = result.unwrap();
|
|
expect(team.createdAt).toBeDefined();
|
|
|
|
const createdAt = team.createdAt.toDate();
|
|
expect(createdAt.getTime()).toBeGreaterThanOrEqual(beforeCreate.getTime());
|
|
expect(createdAt.getTime()).toBeLessThanOrEqual(afterCreate.getTime());
|
|
});
|
|
});
|
|
});
|