view models
This commit is contained in:
@@ -3,7 +3,7 @@ import { DriverLeaderboardItemViewModel } from './DriverLeaderboardItemViewModel
|
||||
import { DriverLeaderboardItemDTO } from '../types/generated/DriverLeaderboardItemDTO';
|
||||
|
||||
describe('DriverLeaderboardItemViewModel', () => {
|
||||
const mockDTO: DriverLeaderboardItemDTO = {
|
||||
const baseDto: DriverLeaderboardItemDTO & { avatarUrl: string } = {
|
||||
id: '1',
|
||||
name: 'Test Driver',
|
||||
rating: 1500,
|
||||
@@ -13,63 +13,65 @@ describe('DriverLeaderboardItemViewModel', () => {
|
||||
wins: 10,
|
||||
podiums: 25,
|
||||
isActive: true,
|
||||
rank: 5
|
||||
rank: 5,
|
||||
avatarUrl: 'https://example.com/avatar.jpg',
|
||||
};
|
||||
|
||||
it('should create instance from DTO', () => {
|
||||
const viewModel = new DriverLeaderboardItemViewModel(mockDTO, 1);
|
||||
|
||||
it('should create instance from DTO with avatar', () => {
|
||||
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1);
|
||||
|
||||
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(mockDTO, 1);
|
||||
|
||||
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1);
|
||||
|
||||
expect(viewModel.winRate).toBe(20); // 10/50 * 100
|
||||
});
|
||||
|
||||
it('should format win rate as percentage', () => {
|
||||
const viewModel = new DriverLeaderboardItemViewModel(mockDTO, 1);
|
||||
|
||||
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1);
|
||||
|
||||
expect(viewModel.winRateFormatted).toBe('20.0%');
|
||||
});
|
||||
|
||||
it('should return correct skill level color', () => {
|
||||
const viewModel = new DriverLeaderboardItemViewModel(mockDTO, 1);
|
||||
|
||||
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1);
|
||||
|
||||
expect(viewModel.skillLevelColor).toBe('orange'); // advanced = orange
|
||||
});
|
||||
|
||||
it('should return correct skill level icon', () => {
|
||||
const viewModel = new DriverLeaderboardItemViewModel(mockDTO, 1);
|
||||
|
||||
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1);
|
||||
|
||||
expect(viewModel.skillLevelIcon).toBe('🥇'); // advanced = 🥇
|
||||
});
|
||||
|
||||
it('should detect rating trend up', () => {
|
||||
const viewModel = new DriverLeaderboardItemViewModel(mockDTO, 1, 1400);
|
||||
|
||||
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1, 1400);
|
||||
|
||||
expect(viewModel.ratingTrend).toBe('up');
|
||||
});
|
||||
|
||||
it('should detect rating trend down', () => {
|
||||
const viewModel = new DriverLeaderboardItemViewModel(mockDTO, 1, 1600);
|
||||
|
||||
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1, 1600);
|
||||
|
||||
expect(viewModel.ratingTrend).toBe('down');
|
||||
});
|
||||
|
||||
it('should show rating change indicator', () => {
|
||||
const viewModel = new DriverLeaderboardItemViewModel(mockDTO, 1, 1400);
|
||||
|
||||
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1, 1400);
|
||||
|
||||
expect(viewModel.ratingChangeIndicator).toBe('+100');
|
||||
});
|
||||
|
||||
it('should handle zero races for win rate', () => {
|
||||
const dto = { ...mockDTO, racesCompleted: 0, wins: 0 };
|
||||
const dto = { ...baseDto, racesCompleted: 0, wins: 0 };
|
||||
const viewModel = new DriverLeaderboardItemViewModel(dto, 1);
|
||||
|
||||
|
||||
expect(viewModel.winRate).toBe(0);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user