84 lines
2.7 KiB
TypeScript
84 lines
2.7 KiB
TypeScript
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');
|
|
});
|
|
}); |