74 lines
2.4 KiB
TypeScript
74 lines
2.4 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { DriverLeaderboardViewModel } from './DriverLeaderboardViewModel';
|
|
import { DriverLeaderboardItemViewModel } from './DriverLeaderboardItemViewModel';
|
|
import { LeaderboardsViewData } from '@/lib/view-data/LeaderboardsViewData';
|
|
import { LeaderboardDriverItem } from '@/lib/view-data/LeaderboardDriverItem';
|
|
|
|
const createDriverViewData = (overrides: Partial<LeaderboardDriverItem> = {}): LeaderboardDriverItem => ({
|
|
id: 'driver-1',
|
|
name: 'Driver One',
|
|
rating: 1500,
|
|
skillLevel: 'advanced',
|
|
nationality: 'DE',
|
|
racesCompleted: 10,
|
|
wins: 3,
|
|
podiums: 5,
|
|
rank: 1,
|
|
avatarUrl: 'https://example.com/avatar-1.jpg',
|
|
position: 1,
|
|
...overrides,
|
|
});
|
|
|
|
describe('DriverLeaderboardViewModel', () => {
|
|
it('wraps ViewData drivers into DriverLeaderboardItemViewModel instances', () => {
|
|
const viewData: LeaderboardsViewData = {
|
|
drivers: [
|
|
createDriverViewData({ id: 'driver-1', position: 1 }),
|
|
createDriverViewData({ id: 'driver-2', name: 'Driver Two', position: 2 })
|
|
],
|
|
teams: []
|
|
};
|
|
const viewModel = new DriverLeaderboardViewModel(viewData);
|
|
|
|
expect(viewModel.drivers).toHaveLength(2);
|
|
expect(viewModel.drivers[0]).toBeInstanceOf(DriverLeaderboardItemViewModel);
|
|
expect(viewModel.drivers[0].position).toBe(1);
|
|
expect(viewModel.drivers[1].position).toBe(2);
|
|
});
|
|
|
|
it('computes aggregate totals', () => {
|
|
const viewData: LeaderboardsViewData = {
|
|
drivers: [
|
|
createDriverViewData({ id: 'driver-1', racesCompleted: 10, wins: 3 }),
|
|
createDriverViewData({ id: 'driver-2', racesCompleted: 5, wins: 1 }),
|
|
],
|
|
teams: []
|
|
};
|
|
|
|
const viewModel = new DriverLeaderboardViewModel(viewData);
|
|
|
|
expect(viewModel.totalRaces).toBe(15);
|
|
expect(viewModel.totalWins).toBe(4);
|
|
});
|
|
|
|
it('passes previous rating to items when provided via Record', () => {
|
|
const viewData: LeaderboardsViewData = {
|
|
drivers: [
|
|
createDriverViewData({ id: 'driver-1', rating: 1550 }),
|
|
createDriverViewData({ id: 'driver-2', rating: 1400 }),
|
|
],
|
|
teams: []
|
|
};
|
|
|
|
const previousRatings = {
|
|
'driver-1': 1500,
|
|
'driver-2': 1450,
|
|
};
|
|
|
|
const viewModel = new DriverLeaderboardViewModel(viewData, previousRatings);
|
|
|
|
expect(viewModel.drivers[0].ratingTrend).toBe('up');
|
|
expect(viewModel.drivers[1].ratingTrend).toBe('down');
|
|
});
|
|
});
|