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

450 lines
13 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { DriversViewModelBuilder } from './DriversViewModelBuilder';
import type { DriversLeaderboardDTO } from '@/lib/types/generated/DriversLeaderboardDTO';
describe('DriversViewModelBuilder', () => {
describe('happy paths', () => {
it('should transform DriversLeaderboardDTO to DriverLeaderboardViewModel correctly', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: 95,
},
{
id: 'driver-2',
name: 'Driver 2',
country: 'UK',
avatarUrl: 'avatar-url',
rating: 1450,
globalRank: 2,
consistency: 90,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers).toHaveLength(2);
expect(result.drivers[0].id).toBe('driver-1');
expect(result.drivers[0].name).toBe('Driver 1');
expect(result.drivers[0].country).toBe('US');
expect(result.drivers[0].avatarUrl).toBe('avatar-url');
expect(result.drivers[0].rating).toBe(1500);
expect(result.drivers[0].globalRank).toBe(1);
expect(result.drivers[0].consistency).toBe(95);
expect(result.drivers[1].id).toBe('driver-2');
expect(result.drivers[1].name).toBe('Driver 2');
expect(result.drivers[1].country).toBe('UK');
expect(result.drivers[1].avatarUrl).toBe('avatar-url');
expect(result.drivers[1].rating).toBe(1450);
expect(result.drivers[1].globalRank).toBe(2);
expect(result.drivers[1].consistency).toBe(90);
});
it('should handle empty drivers array', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers).toHaveLength(0);
});
it('should handle single driver', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: 95,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers).toHaveLength(1);
});
it('should handle multiple drivers', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: 95,
},
{
id: 'driver-2',
name: 'Driver 2',
country: 'UK',
avatarUrl: 'avatar-url',
rating: 1450,
globalRank: 2,
consistency: 90,
},
{
id: 'driver-3',
name: 'Driver 3',
country: 'DE',
avatarUrl: 'avatar-url',
rating: 1400,
globalRank: 3,
consistency: 85,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers).toHaveLength(3);
});
});
describe('data transformation', () => {
it('should preserve all DTO fields in the output', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: 95,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers[0].id).toBe(driversLeaderboardDto.drivers[0].id);
expect(result.drivers[0].name).toBe(driversLeaderboardDto.drivers[0].name);
expect(result.drivers[0].country).toBe(driversLeaderboardDto.drivers[0].country);
expect(result.drivers[0].avatarUrl).toBe(driversLeaderboardDto.drivers[0].avatarUrl);
expect(result.drivers[0].rating).toBe(driversLeaderboardDto.drivers[0].rating);
expect(result.drivers[0].globalRank).toBe(driversLeaderboardDto.drivers[0].globalRank);
expect(result.drivers[0].consistency).toBe(driversLeaderboardDto.drivers[0].consistency);
});
it('should not modify the input DTO', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: 95,
},
],
};
const originalDto = { ...driversLeaderboardDto };
DriversViewModelBuilder.build(driversLeaderboardDto);
expect(driversLeaderboardDto).toEqual(originalDto);
});
});
describe('edge cases', () => {
it('should handle driver without avatar', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: null,
rating: 1500,
globalRank: 1,
consistency: 95,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers[0].avatarUrl).toBeNull();
});
it('should handle driver without country', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: null,
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: 95,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers[0].country).toBeNull();
});
it('should handle driver without rating', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: null,
globalRank: 1,
consistency: 95,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers[0].rating).toBeNull();
});
it('should handle driver without global rank', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: null,
consistency: 95,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers[0].globalRank).toBeNull();
});
it('should handle driver without consistency', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: null,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers[0].consistency).toBeNull();
});
it('should handle different countries', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: 95,
},
{
id: 'driver-2',
name: 'Driver 2',
country: 'UK',
avatarUrl: 'avatar-url',
rating: 1450,
globalRank: 2,
consistency: 90,
},
{
id: 'driver-3',
name: 'Driver 3',
country: 'DE',
avatarUrl: 'avatar-url',
rating: 1400,
globalRank: 3,
consistency: 85,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers[0].country).toBe('US');
expect(result.drivers[1].country).toBe('UK');
expect(result.drivers[2].country).toBe('DE');
});
it('should handle different ratings', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: 95,
},
{
id: 'driver-2',
name: 'Driver 2',
country: 'UK',
avatarUrl: 'avatar-url',
rating: 1450,
globalRank: 2,
consistency: 90,
},
{
id: 'driver-3',
name: 'Driver 3',
country: 'DE',
avatarUrl: 'avatar-url',
rating: 1400,
globalRank: 3,
consistency: 85,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers[0].rating).toBe(1500);
expect(result.drivers[1].rating).toBe(1450);
expect(result.drivers[2].rating).toBe(1400);
});
it('should handle different global ranks', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: 95,
},
{
id: 'driver-2',
name: 'Driver 2',
country: 'UK',
avatarUrl: 'avatar-url',
rating: 1450,
globalRank: 2,
consistency: 90,
},
{
id: 'driver-3',
name: 'Driver 3',
country: 'DE',
avatarUrl: 'avatar-url',
rating: 1400,
globalRank: 3,
consistency: 85,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers[0].globalRank).toBe(1);
expect(result.drivers[1].globalRank).toBe(2);
expect(result.drivers[2].globalRank).toBe(3);
});
it('should handle different consistency values', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: [
{
id: 'driver-1',
name: 'Driver 1',
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500,
globalRank: 1,
consistency: 95,
},
{
id: 'driver-2',
name: 'Driver 2',
country: 'UK',
avatarUrl: 'avatar-url',
rating: 1450,
globalRank: 2,
consistency: 90,
},
{
id: 'driver-3',
name: 'Driver 3',
country: 'DE',
avatarUrl: 'avatar-url',
rating: 1400,
globalRank: 3,
consistency: 85,
},
],
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers[0].consistency).toBe(95);
expect(result.drivers[1].consistency).toBe(90);
expect(result.drivers[2].consistency).toBe(85);
});
it('should handle large number of drivers', () => {
const driversLeaderboardDto: DriversLeaderboardDTO = {
drivers: Array.from({ length: 100 }, (_, i) => ({
id: `driver-${i + 1}`,
name: `Driver ${i + 1}`,
country: 'US',
avatarUrl: 'avatar-url',
rating: 1500 - i,
globalRank: i + 1,
consistency: 95 - i * 0.1,
})),
};
const result = DriversViewModelBuilder.build(driversLeaderboardDto);
expect(result.drivers).toHaveLength(100);
expect(result.drivers[0].id).toBe('driver-1');
expect(result.drivers[99].id).toBe('driver-100');
});
});
});