Files
gridpilot.gg/tests/integration/teams/teams-list-use-cases.integration.test.ts
Marc Mintel 2fba80da57
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 4m46s
Contract Testing / contract-snapshot (pull_request) Has been skipped
integration tests
2026-01-22 19:16:43 +01:00

106 lines
4.4 KiB
TypeScript

/**
* Integration Test: Teams List Use Case Orchestration
*
* Tests the orchestration logic of teams list-related Use Cases:
* - GetAllTeamsUseCase: Retrieves list of teams with enrichment (member count, stats)
* - Validates that Use Cases correctly interact with their Ports (Repositories)
* - Uses In-Memory adapters for fast, deterministic testing
*
* Focus: Business logic orchestration, NOT UI rendering
*/
import { describe, it, expect, beforeAll, beforeEach } from 'vitest';
import { InMemoryTeamRepository } from '../../../adapters/racing/persistence/inmemory/InMemoryTeamRepository';
import { InMemoryTeamMembershipRepository } from '../../../adapters/racing/persistence/inmemory/InMemoryTeamMembershipRepository';
import { InMemoryTeamStatsRepository } from '../../../adapters/racing/persistence/inmemory/InMemoryTeamStatsRepository';
import { GetAllTeamsUseCase } from '../../../core/racing/application/use-cases/GetAllTeamsUseCase';
import { Team } from '../../../core/racing/domain/entities/Team';
import { Logger } from '../../../core/shared/domain/Logger';
describe('Teams List Use Case Orchestration', () => {
let teamRepository: InMemoryTeamRepository;
let membershipRepository: InMemoryTeamMembershipRepository;
let statsRepository: InMemoryTeamStatsRepository;
let getAllTeamsUseCase: GetAllTeamsUseCase;
let mockLogger: Logger;
beforeAll(() => {
mockLogger = {
info: () => {},
debug: () => {},
warn: () => {},
error: () => {},
} as unknown as Logger;
teamRepository = new InMemoryTeamRepository(mockLogger);
membershipRepository = new InMemoryTeamMembershipRepository(mockLogger);
statsRepository = new InMemoryTeamStatsRepository();
getAllTeamsUseCase = new GetAllTeamsUseCase(teamRepository, membershipRepository, statsRepository, mockLogger);
});
beforeEach(() => {
teamRepository.clear();
membershipRepository.clear();
statsRepository.clear();
});
describe('GetAllTeamsUseCase - Success Path', () => {
it('should retrieve complete teams list with all teams and enrichment', async () => {
// Scenario: Teams list with multiple teams
// Given: Multiple teams exist
const team1 = Team.create({ id: 't1', name: 'Team 1', tag: 'T1', description: 'Desc 1', ownerId: 'o1', leagues: [] });
const team2 = Team.create({ id: 't2', name: 'Team 2', tag: 'T2', description: 'Desc 2', ownerId: 'o2', leagues: [] });
await teamRepository.create(team1);
await teamRepository.create(team2);
// And: Teams have members
await membershipRepository.saveMembership({ teamId: 't1', driverId: 'd1', role: 'owner', status: 'active', joinedAt: new Date() });
await membershipRepository.saveMembership({ teamId: 't1', driverId: 'd2', role: 'driver', status: 'active', joinedAt: new Date() });
await membershipRepository.saveMembership({ teamId: 't2', driverId: 'd3', role: 'owner', status: 'active', joinedAt: new Date() });
// And: Teams have stats
await statsRepository.saveTeamStats('t1', {
totalWins: 5,
totalRaces: 20,
rating: 1500,
performanceLevel: 'intermediate',
specialization: 'sprint',
region: 'EU',
languages: ['en'],
isRecruiting: true
});
// When: GetAllTeamsUseCase.execute() is called
const result = await getAllTeamsUseCase.execute({});
// Then: The result should contain all teams with enrichment
expect(result.isOk()).toBe(true);
const { teams, totalCount } = result.unwrap();
expect(totalCount).toBe(2);
const enriched1 = teams.find(t => t.team.id.toString() === 't1');
expect(enriched1).toBeDefined();
expect(enriched1?.memberCount).toBe(2);
expect(enriched1?.totalWins).toBe(5);
expect(enriched1?.rating).toBe(1500);
const enriched2 = teams.find(t => t.team.id.toString() === 't2');
expect(enriched2).toBeDefined();
expect(enriched2?.memberCount).toBe(1);
expect(enriched2?.totalWins).toBe(0); // Default value
});
it('should handle empty teams list', async () => {
// Scenario: No teams exist
// When: GetAllTeamsUseCase.execute() is called
const result = await getAllTeamsUseCase.execute({});
// Then: The result should be empty
expect(result.isOk()).toBe(true);
const { teams, totalCount } = result.unwrap();
expect(totalCount).toBe(0);
expect(teams).toHaveLength(0);
});
});
});