Some checks failed
CI / lint-typecheck (pull_request) Failing after 12s
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
176 lines
5.6 KiB
TypeScript
176 lines
5.6 KiB
TypeScript
import { beforeEach, describe, expect, it } from 'vitest';
|
|
import { LeaguesTestContext } from '../LeaguesTestContext';
|
|
import { League } from '../../../../core/racing/domain/entities/League';
|
|
import { Season } from '../../../../core/racing/domain/entities/season/Season';
|
|
import { SeasonSponsorship } from '../../../../core/racing/domain/entities/season/SeasonSponsorship';
|
|
import { Money } from '../../../../core/racing/domain/value-objects/Money';
|
|
import { GetSeasonSponsorshipsUseCase } from '../../../../core/racing/application/use-cases/GetSeasonSponsorshipsUseCase';
|
|
import { LeagueMembership } from '../../../../core/racing/domain/entities/LeagueMembership';
|
|
import { Race } from '../../../../core/racing/domain/entities/Race';
|
|
|
|
describe('League Sponsorships - GetSeasonSponsorshipsUseCase', () => {
|
|
let context: LeaguesTestContext;
|
|
let useCase: GetSeasonSponsorshipsUseCase;
|
|
|
|
beforeEach(() => {
|
|
context = new LeaguesTestContext();
|
|
context.clear();
|
|
|
|
useCase = new GetSeasonSponsorshipsUseCase(
|
|
context.seasonSponsorshipRepository,
|
|
context.seasonRepository,
|
|
context.racingLeagueRepository,
|
|
context.leagueMembershipRepository,
|
|
context.raceRepository,
|
|
);
|
|
});
|
|
|
|
const seedLeague = async (params: { leagueId: string }) => {
|
|
const league = League.create({
|
|
id: params.leagueId,
|
|
name: 'League 1',
|
|
description: 'League used for sponsorship integration tests',
|
|
ownerId: 'owner-1',
|
|
});
|
|
|
|
await context.racingLeagueRepository.create(league);
|
|
return league;
|
|
};
|
|
|
|
const seedSeason = async (params: { seasonId: string; leagueId: string }) => {
|
|
const season = Season.create({
|
|
id: params.seasonId,
|
|
leagueId: params.leagueId,
|
|
gameId: 'iracing',
|
|
name: 'Season 1',
|
|
status: 'active',
|
|
startDate: new Date('2025-01-01T00:00:00.000Z'),
|
|
endDate: new Date('2025-02-01T00:00:00.000Z'),
|
|
});
|
|
|
|
await context.seasonRepository.create(season);
|
|
return season;
|
|
};
|
|
|
|
const seedLeagueMembers = async (params: { leagueId: string; count: number }) => {
|
|
for (let i = 0; i < params.count; i++) {
|
|
const membership = LeagueMembership.create({
|
|
id: `membership-${i + 1}`,
|
|
leagueId: params.leagueId,
|
|
driverId: `driver-${i + 1}`,
|
|
role: 'member',
|
|
status: 'active',
|
|
});
|
|
|
|
await context.leagueMembershipRepository.saveMembership(membership);
|
|
}
|
|
};
|
|
|
|
const seedRaces = async (params: { leagueId: string }) => {
|
|
await context.raceRepository.create(
|
|
Race.create({
|
|
id: 'race-1',
|
|
leagueId: params.leagueId,
|
|
track: 'Track 1',
|
|
car: 'GT3',
|
|
scheduledAt: new Date('2025-01-10T20:00:00.000Z'),
|
|
status: 'completed',
|
|
}),
|
|
);
|
|
|
|
await context.raceRepository.create(
|
|
Race.create({
|
|
id: 'race-2',
|
|
leagueId: params.leagueId,
|
|
track: 'Track 2',
|
|
car: 'GT3',
|
|
scheduledAt: new Date('2025-01-20T20:00:00.000Z'),
|
|
status: 'completed',
|
|
}),
|
|
);
|
|
|
|
await context.raceRepository.create(
|
|
Race.create({
|
|
id: 'race-3',
|
|
leagueId: params.leagueId,
|
|
track: 'Track 3',
|
|
car: 'GT3',
|
|
scheduledAt: new Date('2025-01-25T20:00:00.000Z'),
|
|
status: 'scheduled',
|
|
}),
|
|
);
|
|
};
|
|
|
|
it('returns sponsorships with computed league/season metrics', async () => {
|
|
const leagueId = 'league-1';
|
|
const seasonId = 'season-1';
|
|
|
|
await seedLeague({ leagueId });
|
|
await seedSeason({ seasonId, leagueId });
|
|
await seedLeagueMembers({ leagueId, count: 3 });
|
|
await seedRaces({ leagueId });
|
|
|
|
const sponsorship = SeasonSponsorship.create({
|
|
id: 'sponsorship-1',
|
|
seasonId,
|
|
leagueId,
|
|
sponsorId: 'sponsor-1',
|
|
tier: 'main',
|
|
pricing: Money.create(1000, 'USD'),
|
|
status: 'active',
|
|
createdAt: new Date('2025-01-01T00:00:00.000Z'),
|
|
activatedAt: new Date('2025-01-02T00:00:00.000Z'),
|
|
});
|
|
|
|
await context.seasonSponsorshipRepository.create(sponsorship);
|
|
|
|
const result = await useCase.execute({ seasonId });
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
const view = result.unwrap();
|
|
|
|
expect(view.seasonId).toBe(seasonId);
|
|
expect(view.sponsorships).toHaveLength(1);
|
|
|
|
const detail = view.sponsorships[0]!;
|
|
expect(detail.id).toBe('sponsorship-1');
|
|
expect(detail.leagueId).toBe(leagueId);
|
|
expect(detail.leagueName).toBe('League 1');
|
|
expect(detail.seasonId).toBe(seasonId);
|
|
expect(detail.seasonName).toBe('Season 1');
|
|
|
|
expect(detail.metrics.drivers).toBe(3);
|
|
expect(detail.metrics.races).toBe(3);
|
|
expect(detail.metrics.completedRaces).toBe(2);
|
|
expect(detail.metrics.impressions).toBe(2 * 3 * 100);
|
|
|
|
expect(detail.pricing).toEqual({ amount: 1000, currency: 'USD' });
|
|
expect(detail.platformFee).toEqual({ amount: 100, currency: 'USD' });
|
|
expect(detail.netAmount).toEqual({ amount: 900, currency: 'USD' });
|
|
});
|
|
|
|
it('returns SEASON_NOT_FOUND when season does not exist', async () => {
|
|
const result = await useCase.execute({ seasonId: 'missing-season' });
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
expect(result.unwrapErr().code).toBe('SEASON_NOT_FOUND');
|
|
});
|
|
|
|
it('returns LEAGUE_NOT_FOUND when league for season does not exist', async () => {
|
|
await context.seasonRepository.create(
|
|
Season.create({
|
|
id: 'season-1',
|
|
leagueId: 'missing-league',
|
|
gameId: 'iracing',
|
|
name: 'Season 1',
|
|
status: 'active',
|
|
}),
|
|
);
|
|
|
|
const result = await useCase.execute({ seasonId: 'season-1' });
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
expect(result.unwrapErr().code).toBe('LEAGUE_NOT_FOUND');
|
|
});
|
|
});
|