Files
gridpilot.gg/apps/website/lib/view-models/ActivityItemViewModel.test.ts
Marc Mintel d97f50ed72
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 6m4s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data fixes
2026-01-23 11:59:49 +01:00

97 lines
3.1 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { ActivityItemViewModel } from './ActivityItemViewModel';
import { ActivityItemViewData } from '../view-data/ActivityItemViewData';
describe('ActivityItemViewModel', () => {
it('maps basic properties from ActivityItemViewData', () => {
const viewData: ActivityItemViewData = {
id: 'activity-1',
type: 'race',
message: 'Test activity',
time: '2025-01-01T12:00:00Z',
impressions: 1234,
};
const viewModel = new ActivityItemViewModel(viewData);
expect(viewModel.id).toBe('activity-1');
expect(viewModel.type).toBe('race');
expect(viewModel.message).toBe('Test activity');
expect(viewModel.time).toBe('2025-01-01T12:00:00Z');
expect(viewModel.impressions).toBe(1234);
});
it('returns the correct typeColor for each supported type', () => {
const race = new ActivityItemViewModel({ id: '1', type: 'race', message: '', time: '' });
const league = new ActivityItemViewModel({ id: '2', type: 'league', message: '', time: '' });
const team = new ActivityItemViewModel({ id: '3', type: 'team', message: '', time: '' });
const driver = new ActivityItemViewModel({ id: '4', type: 'driver', message: '', time: '' });
const platform = new ActivityItemViewModel({ id: '5', type: 'platform', message: '', time: '' });
expect(race.typeColor).toBe('bg-warning-amber');
expect(league.typeColor).toBe('bg-primary-blue');
expect(team.typeColor).toBe('bg-purple-400');
expect(driver.typeColor).toBe('bg-performance-green');
expect(platform.typeColor).toBe('bg-racing-red');
});
it('falls back to a default typeColor for unknown types', () => {
const unknown = new ActivityItemViewModel({
id: 'unknown',
type: 'unknown',
message: '',
time: '',
});
expect(unknown.typeColor).toBe('bg-gray-500');
});
it('formats impressions when provided', () => {
const impressions = 1234;
const viewModel = new ActivityItemViewModel({
id: 'activity-2',
type: 'race',
message: '',
time: '',
impressions,
});
expect(viewModel.formattedImpressions).toBe(impressions.toLocaleString());
});
it('returns null for formattedImpressions when impressions is undefined or zero', () => {
const noImpressions = new ActivityItemViewModel({
id: 'activity-3',
type: 'race',
message: '',
time: '',
});
const zeroImpressions = new ActivityItemViewModel({
id: 'activity-4',
type: 'race',
message: '',
time: '',
impressions: 0,
});
expect(noImpressions.formattedImpressions).toBeNull();
expect(zeroImpressions.formattedImpressions).toBeNull();
});
it('handles optional impressions field', () => {
const withoutImpressions: ActivityItemViewData = {
id: 'activity-5',
type: 'platform',
message: 'Platform activity',
time: '2025-01-01T12:00:00Z',
};
const viewModel = new ActivityItemViewModel(withoutImpressions);
expect(viewModel.impressions).toBeUndefined();
expect(viewModel.formattedImpressions).toBeNull();
});
});