import { describe, expect, it } from 'vitest'; import { LeaderboardDriverItem } from '../view-data/LeaderboardDriverItem'; import { LeaderboardsViewData } from '../view-data/LeaderboardsViewData'; import { DriverLeaderboardItemViewModel } from './DriverLeaderboardItemViewModel'; import { DriverLeaderboardViewModel } from './DriverLeaderboardViewModel'; const createDriverViewData = (overrides: Partial = {}): 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'); }); });