Files
gridpilot.gg/apps/website/lib/view-models/DriverSummaryViewModel.test.ts
Marc Mintel e22033be38
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 5m54s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data fixes
2026-01-23 13:04:05 +01:00

52 lines
1.6 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { DriverSummaryViewModel } from './DriverSummaryViewModel';
import type { DriverSummaryData } from '../view-data/LeagueDetailViewData';
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('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.rating).toBe(2500);
expect(viewModel.ratingLabel).toBe('2,500');
expect(viewModel.rank).toBe(10);
expect(viewModel.rankLabel).toBe('10');
});
it('renders placeholders when rating or rank are null', () => {
const viewModel = new DriverSummaryViewModel({
...viewData,
rating: null,
rank: null,
});
expect(viewModel.rating).toBeNull();
expect(viewModel.ratingLabel).toBe('—');
expect(viewModel.rank).toBeNull();
expect(viewModel.rankLabel).toBe('—');
});
});