Files
gridpilot.gg/apps/website/lib/builders/view-models/LeagueSummaryViewModelBuilder.test.ts
Marc Mintel 94b92a9314
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 5m45s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data tests
2026-01-22 18:35:35 +01:00

613 lines
18 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { LeagueSummaryViewModelBuilder } from './LeagueSummaryViewModelBuilder';
import type { LeaguesViewData } from '@/lib/view-data/LeaguesViewData';
describe('LeagueSummaryViewModelBuilder', () => {
describe('happy paths', () => {
it('should transform LeaguesViewData to LeagueSummaryViewModel correctly', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-123',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result).toEqual({
id: 'league-123',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
});
});
it('should handle league without description', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-456',
name: 'Test League',
description: null,
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.description).toBe('');
});
it('should handle league without category', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-789',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: null,
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.category).toBeUndefined();
});
it('should handle league without scoring', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-101',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: null,
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.scoring).toBeUndefined();
});
it('should handle league without maxTeams', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-102',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: null,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.maxTeams).toBe(0);
});
it('should handle league without usedTeamSlots', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-103',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: null,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.usedTeamSlots).toBe(0);
});
});
describe('data transformation', () => {
it('should preserve all DTO fields in the output', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-104',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.id).toBe(league.id);
expect(result.name).toBe(league.name);
expect(result.description).toBe(league.description);
expect(result.logoUrl).toBe(league.logoUrl);
expect(result.ownerId).toBe(league.ownerId);
expect(result.createdAt).toBe(league.createdAt);
expect(result.maxDrivers).toBe(league.maxDrivers);
expect(result.usedDriverSlots).toBe(league.usedDriverSlots);
expect(result.maxTeams).toBe(league.maxTeams);
expect(result.usedTeamSlots).toBe(league.usedTeamSlots);
expect(result.structureSummary).toBe(league.structureSummary);
expect(result.timingSummary).toBe(league.timingSummary);
expect(result.category).toBe(league.category);
expect(result.scoring).toEqual(league.scoring);
});
it('should not modify the input DTO', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-105',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const originalLeague = { ...league };
LeagueSummaryViewModelBuilder.build(league);
expect(league).toEqual(originalLeague);
});
});
describe('edge cases', () => {
it('should handle league with empty description', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-106',
name: 'Test League',
description: '',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.description).toBe('');
});
it('should handle league with different categories', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-107',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Amateur',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.category).toBe('Amateur');
});
it('should handle league with different scoring types', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-108',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'team',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.scoring?.primaryChampionshipType).toBe('team');
});
it('should handle league with different scoring systems', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-109',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'custom',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.scoring?.pointsSystem).toBe('custom');
});
it('should handle league with different structure summaries', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-110',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Multiple championships',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.structureSummary).toBe('Multiple championships');
});
it('should handle league with different timing summaries', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-111',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Bi-weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.timingSummary).toBe('Bi-weekly races');
});
it('should handle league with different maxDrivers', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-112',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 64,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.maxDrivers).toBe(64);
});
it('should handle league with different usedDriverSlots', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-113',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 15,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.usedDriverSlots).toBe(15);
});
it('should handle league with different maxTeams', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-114',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 32,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.maxTeams).toBe(32);
});
it('should handle league with different usedTeamSlots', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-115',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 5,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.usedTeamSlots).toBe(5);
});
it('should handle league with zero maxTeams', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-116',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 0,
usedTeamSlots: 0,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.maxTeams).toBe(0);
});
it('should handle league with zero usedTeamSlots', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-117',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 0,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'driver',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.usedTeamSlots).toBe(0);
});
it('should handle league with different primary championship types', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-118',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'nations',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.scoring?.primaryChampionshipType).toBe('nations');
});
it('should handle league with different primary championship types (trophy)', () => {
const league: LeaguesViewData['leagues'][number] = {
id: 'league-119',
name: 'Test League',
description: 'Test Description',
logoUrl: 'logo-url',
ownerId: 'owner-1',
createdAt: '2024-01-01',
maxDrivers: 32,
usedDriverSlots: 20,
maxTeams: 16,
usedTeamSlots: 10,
structureSummary: 'Single championship',
timingSummary: 'Weekly races',
category: 'Professional',
scoring: {
primaryChampionshipType: 'trophy',
pointsSystem: 'standard',
},
};
const result = LeagueSummaryViewModelBuilder.build(league);
expect(result.scoring?.primaryChampionshipType).toBe('trophy');
});
});
});