import { describe, expect, it } from 'vitest'; import { LeaderboardDriverItem } from '../view-data/LeaderboardDriverItem'; import { DriverLeaderboardItemViewModel } from './DriverLeaderboardItemViewModel'; describe('DriverLeaderboardItemViewModel', () => { const baseViewData: LeaderboardDriverItem = { id: '1', name: 'Test Driver', rating: 1500, skillLevel: 'advanced', nationality: 'USA', racesCompleted: 50, wins: 10, podiums: 25, rank: 5, avatarUrl: 'https://example.com/avatar.jpg', position: 1, }; it('should create instance from ViewData with avatar', () => { const viewModel = new DriverLeaderboardItemViewModel(baseViewData); expect(viewModel.id).toBe('1'); expect(viewModel.name).toBe('Test Driver'); expect(viewModel.position).toBe(1); expect(viewModel.avatarUrl).toBe('https://example.com/avatar.jpg'); }); it('should calculate win rate correctly', () => { const viewModel = new DriverLeaderboardItemViewModel(baseViewData); expect(viewModel.winRate).toBe(20); // 10/50 * 100 }); it('should format win rate as percentage', () => { const viewModel = new DriverLeaderboardItemViewModel(baseViewData); expect(viewModel.winRateFormatted).toBe('20.0%'); }); it('should return correct skill level color', () => { const viewModel = new DriverLeaderboardItemViewModel(baseViewData); expect(viewModel.skillLevelColor).toBe('text-purple-400'); // advanced = purple }); it('should return correct skill level icon', () => { const viewModel = new DriverLeaderboardItemViewModel(baseViewData); expect(viewModel.skillLevelIcon).toBe('🥇'); // advanced = 🥇 }); it('should detect rating trend up', () => { const viewModel = new DriverLeaderboardItemViewModel(baseViewData, 1400); expect(viewModel.ratingTrend).toBe('up'); }); it('should detect rating trend down', () => { const viewModel = new DriverLeaderboardItemViewModel(baseViewData, 1600); expect(viewModel.ratingTrend).toBe('down'); }); it('should show rating change indicator', () => { const viewModel = new DriverLeaderboardItemViewModel(baseViewData, 1400); expect(viewModel.ratingChangeIndicator).toBe('+100'); }); it('should handle zero races for win rate', () => { const viewData = { ...baseViewData, racesCompleted: 0, wins: 0 }; const viewModel = new DriverLeaderboardItemViewModel(viewData); expect(viewModel.winRate).toBe(0); }); it('should handle undefined previous rating', () => { const viewModel = new DriverLeaderboardItemViewModel(baseViewData); expect(viewModel.ratingTrend).toBe('same'); expect(viewModel.ratingChangeIndicator).toBe('0'); }); });