import { describe, it, expect, beforeEach } from 'vitest'; import { GetSponsorDashboardUseCase } from '../../../../core/racing/application/use-cases/GetSponsorDashboardUseCase'; import { Sponsor } from '../../../../core/racing/domain/entities/sponsor/Sponsor'; import { SeasonSponsorship } from '../../../../core/racing/domain/entities/season/SeasonSponsorship'; import { Season } from '../../../../core/racing/domain/entities/season/Season'; import { League } from '../../../../core/racing/domain/entities/League'; import { LeagueMembership } from '../../../../core/racing/domain/entities/LeagueMembership'; import { Race } from '../../../../core/racing/domain/entities/Race'; import { Money } from '../../../../core/racing/domain/value-objects/Money'; import { SponsorTestContext } from '../SponsorTestContext'; describe('Sponsor Dashboard Use Case Orchestration', () => { let context: SponsorTestContext; let getSponsorDashboardUseCase: GetSponsorDashboardUseCase; beforeEach(() => { context = new SponsorTestContext(); getSponsorDashboardUseCase = new GetSponsorDashboardUseCase( context.sponsorRepository, context.seasonSponsorshipRepository, context.seasonRepository, context.leagueRepository, context.leagueMembershipRepository, context.raceRepository, ); }); describe('GetSponsorDashboardUseCase - Success Path', () => { it('should retrieve dashboard metrics for a sponsor with active sponsorships', async () => { const sponsor = Sponsor.create({ id: 'sponsor-123', name: 'Test Company', contactEmail: 'test@example.com', }); await context.sponsorRepository.create(sponsor); const league1 = League.create({ id: 'league-1', name: 'League 1', description: 'Description 1', ownerId: 'owner-1', }); await context.leagueRepository.create(league1); const season1 = Season.create({ id: 'season-1', leagueId: 'league-1', gameId: 'game-1', name: 'Season 1', startDate: new Date('2025-01-01'), endDate: new Date('2025-12-31'), }); await context.seasonRepository.create(season1); const sponsorship1 = SeasonSponsorship.create({ id: 'sponsorship-1', sponsorId: 'sponsor-123', seasonId: 'season-1', tier: 'main', pricing: Money.create(1000, 'USD'), status: 'active', }); await context.seasonSponsorshipRepository.create(sponsorship1); for (let i = 1; i <= 5; i++) { const membership = LeagueMembership.create({ id: `membership-1-${i}`, leagueId: 'league-1', driverId: `driver-1-${i}`, role: 'member', status: 'active', }); await context.leagueMembershipRepository.saveMembership(membership); } for (let i = 1; i <= 3; i++) { const race = Race.create({ id: `race-1-${i}`, leagueId: 'league-1', track: 'Track 1', car: 'GT3', scheduledAt: new Date(`2025-0${i}-01`), status: 'completed', }); await context.raceRepository.create(race); } const result = await getSponsorDashboardUseCase.execute({ sponsorId: 'sponsor-123' }); expect(result.isOk()).toBe(true); const dashboard = result.unwrap(); expect(dashboard.sponsorName).toBe('Test Company'); expect(dashboard.metrics.races).toBe(3); expect(dashboard.metrics.drivers).toBe(5); expect(dashboard.sponsoredLeagues).toHaveLength(1); expect(dashboard.investment.activeSponsorships).toBe(1); expect(dashboard.investment.totalInvestment.amount).toBe(1000); }); it('should retrieve dashboard with zero values when sponsor has no sponsorships', async () => { const sponsor = Sponsor.create({ id: 'sponsor-123', name: 'Test Company', contactEmail: 'test@example.com', }); await context.sponsorRepository.create(sponsor); const result = await getSponsorDashboardUseCase.execute({ sponsorId: 'sponsor-123' }); expect(result.isOk()).toBe(true); const dashboard = result.unwrap(); expect(dashboard.metrics.impressions).toBe(0); expect(dashboard.sponsoredLeagues).toHaveLength(0); }); }); describe('GetSponsorDashboardUseCase - Error Handling', () => { it('should return error when sponsor does not exist', async () => { const result = await getSponsorDashboardUseCase.execute({ sponsorId: 'non-existent-sponsor' }); expect(result.isErr()).toBe(true); const error = result.unwrapErr(); expect(error.code).toBe('SPONSOR_NOT_FOUND'); }); }); });