52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import type { DriverSummaryData } from '../view-data/LeagueDetailViewData';
|
|
import { DriverSummaryViewModel } from './DriverSummaryViewModel';
|
|
|
|
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('—');
|
|
});
|
|
});
|