450 lines
13 KiB
TypeScript
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');
|
|
});
|
|
});
|
|
});
|