Files
gridpilot.gg/tests/integration/sponsor/dashboard/sponsor-dashboard.test.ts
Marc Mintel 6df38a462a
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
integration tests
2026-01-23 11:44:59 +01:00

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');
});
});
});