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

This commit is contained in:
2026-01-23 13:04:05 +01:00
parent d97f50ed72
commit e22033be38
24 changed files with 605 additions and 455 deletions

View File

@@ -1,45 +1,51 @@
import { describe, it, expect } from 'vitest';
import { DriverSummaryViewModel } from './DriverSummaryViewModel';
import type { GetDriverOutputDTO } from '../types/generated/GetDriverOutputDTO';
import type { DriverSummaryData } from '../view-data/LeagueDetailViewData';
const driverDto: GetDriverOutputDTO = {
id: 'driver-1',
iracingId: 'ir-123',
name: 'Test Driver',
country: 'DE',
joinedAt: '2024-01-01T00:00:00Z',
const viewData: DriverSummaryData = {
driverId: 'driver-1',
driverName: 'Test Driver',
avatarUrl: 'https://example.com/avatar.png',
rating: 2500,
rank: 10,
roleBadgeText: 'Owner',
roleBadgeClasses: 'bg-blue-50 text-blue-700',
profileUrl: '/drivers/driver-1',
};
describe('DriverSummaryViewModel', () => {
it('maps driver and optional fields from DTO', () => {
const viewModel = new DriverSummaryViewModel({
driver: driverDto,
rating: 2500,
rank: 10,
});
it('exposes driver identity fields from ViewData', () => {
const viewModel = new DriverSummaryViewModel(viewData);
expect(viewModel.id).toBe('driver-1');
expect(viewModel.name).toBe('Test Driver');
expect(viewModel.avatarUrl).toBe('https://example.com/avatar.png');
expect(viewModel.profileUrl).toBe('/drivers/driver-1');
expect(viewModel.roleBadgeText).toBe('Owner');
expect(viewModel.roleBadgeClasses).toBe('bg-blue-50 text-blue-700');
});
it('derives ratingLabel and rankLabel for UI rendering', () => {
const viewModel = new DriverSummaryViewModel(viewData);
expect(viewModel.driver).toBe(driverDto);
expect(viewModel.rating).toBe(2500);
expect(viewModel.ratingLabel).toBe('2,500');
expect(viewModel.rank).toBe(10);
expect(viewModel.rankLabel).toBe('10');
});
it('defaults nullable rating and rank when undefined', () => {
it('renders placeholders when rating or rank are null', () => {
const viewModel = new DriverSummaryViewModel({
driver: driverDto,
});
expect(viewModel.rating).toBeNull();
expect(viewModel.rank).toBeNull();
});
it('keeps explicit null rating and rank', () => {
const viewModel = new DriverSummaryViewModel({
driver: driverDto,
...viewData,
rating: null,
rank: null,
});
expect(viewModel.rating).toBeNull();
expect(viewModel.ratingLabel).toBe('—');
expect(viewModel.rank).toBeNull();
expect(viewModel.rankLabel).toBe('—');
});
});