view data fixes
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 6m4s
Contract Testing / contract-snapshot (pull_request) Has been skipped

This commit is contained in:
2026-01-23 11:59:49 +01:00
parent ae58839eb2
commit d97f50ed72
191 changed files with 2889 additions and 1019 deletions

View File

@@ -1,9 +1,9 @@
import { describe, it, expect } from 'vitest';
import { DriverLeaderboardItemViewModel } from './DriverLeaderboardItemViewModel';
import { DriverLeaderboardItemDTO } from '../types/generated/DriverLeaderboardItemDTO';
import { LeaderboardDriverItem } from '../view-data/LeaderboardDriverItem';
describe('DriverLeaderboardItemViewModel', () => {
const baseDto: DriverLeaderboardItemDTO & { avatarUrl: string } = {
const baseViewData: LeaderboardDriverItem = {
id: '1',
name: 'Test Driver',
rating: 1500,
@@ -12,13 +12,13 @@ describe('DriverLeaderboardItemViewModel', () => {
racesCompleted: 50,
wins: 10,
podiums: 25,
isActive: true,
rank: 5,
avatarUrl: 'https://example.com/avatar.jpg',
position: 1,
};
it('should create instance from DTO with avatar', () => {
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 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');
@@ -27,51 +27,58 @@ describe('DriverLeaderboardItemViewModel', () => {
});
it('should calculate win rate correctly', () => {
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1);
const viewModel = new DriverLeaderboardItemViewModel(baseViewData);
expect(viewModel.winRate).toBe(20); // 10/50 * 100
});
it('should format win rate as percentage', () => {
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1);
const viewModel = new DriverLeaderboardItemViewModel(baseViewData);
expect(viewModel.winRateFormatted).toBe('20.0%');
});
it('should return correct skill level color', () => {
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1);
const viewModel = new DriverLeaderboardItemViewModel(baseViewData);
expect(viewModel.skillLevelColor).toBe('orange'); // advanced = orange
expect(viewModel.skillLevelColor).toBe('text-purple-400'); // advanced = purple
});
it('should return correct skill level icon', () => {
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1);
const viewModel = new DriverLeaderboardItemViewModel(baseViewData);
expect(viewModel.skillLevelIcon).toBe('🥇'); // advanced = 🥇
});
it('should detect rating trend up', () => {
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1, 1400);
const viewModel = new DriverLeaderboardItemViewModel(baseViewData, 1400);
expect(viewModel.ratingTrend).toBe('up');
});
it('should detect rating trend down', () => {
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1, 1600);
const viewModel = new DriverLeaderboardItemViewModel(baseViewData, 1600);
expect(viewModel.ratingTrend).toBe('down');
});
it('should show rating change indicator', () => {
const viewModel = new DriverLeaderboardItemViewModel(baseDto, 1, 1400);
const viewModel = new DriverLeaderboardItemViewModel(baseViewData, 1400);
expect(viewModel.ratingChangeIndicator).toBe('+100');
});
it('should handle zero races for win rate', () => {
const dto = { ...baseDto, racesCompleted: 0, wins: 0 };
const viewModel = new DriverLeaderboardItemViewModel(dto, 1);
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');
});
});