view data tests
This commit is contained in:
@@ -0,0 +1,449 @@
|
||||
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');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user