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
128 lines
4.6 KiB
TypeScript
128 lines
4.6 KiB
TypeScript
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');
|
|
});
|
|
});
|
|
});
|