view models
This commit is contained in:
62
apps/website/lib/view-models/RenewalAlertViewModel.test.ts
Normal file
62
apps/website/lib/view-models/RenewalAlertViewModel.test.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { RenewalAlertViewModel } from './RenewalAlertViewModel';
|
||||
|
||||
describe('RenewalAlertViewModel', () => {
|
||||
it('maps core fields and derives formatted price and date', () => {
|
||||
const vm = new RenewalAlertViewModel({
|
||||
id: 'ren-1',
|
||||
name: 'League Sponsorship',
|
||||
type: 'league',
|
||||
renewDate: '2024-01-15',
|
||||
price: 100,
|
||||
});
|
||||
|
||||
expect(vm.id).toBe('ren-1');
|
||||
expect(vm.name).toBe('League Sponsorship');
|
||||
expect(vm.type).toBe('league');
|
||||
expect(vm.formattedPrice).toBe('$100');
|
||||
expect(typeof vm.formattedRenewDate).toBe('string');
|
||||
});
|
||||
|
||||
it('maps type to icon name', () => {
|
||||
const league = new RenewalAlertViewModel({ id: '1', name: 'A', type: 'league', renewDate: '2024-01-01', price: 0 });
|
||||
const team = new RenewalAlertViewModel({ id: '2', name: 'B', type: 'team', renewDate: '2024-01-01', price: 0 });
|
||||
const driver = new RenewalAlertViewModel({ id: '3', name: 'C', type: 'driver', renewDate: '2024-01-01', price: 0 });
|
||||
const race = new RenewalAlertViewModel({ id: '4', name: 'D', type: 'race', renewDate: '2024-01-01', price: 0 });
|
||||
const platform = new RenewalAlertViewModel({ id: '5', name: 'E', type: 'platform', renewDate: '2024-01-01', price: 0 });
|
||||
|
||||
expect(league.typeIcon).toBe('Trophy');
|
||||
expect(team.typeIcon).toBe('Users');
|
||||
expect(driver.typeIcon).toBe('Car');
|
||||
expect(race.typeIcon).toBe('Flag');
|
||||
expect(platform.typeIcon).toBe('Megaphone');
|
||||
});
|
||||
|
||||
it('computes daysUntilRenewal and urgency flag based on current date', () => {
|
||||
const now = new Date();
|
||||
const soon = new Date(now.getTime() + 10 * 24 * 60 * 60 * 1000);
|
||||
const later = new Date(now.getTime() + 40 * 24 * 60 * 60 * 1000);
|
||||
|
||||
const soonAlert = new RenewalAlertViewModel({
|
||||
id: 'soon',
|
||||
name: 'Soon',
|
||||
type: 'league',
|
||||
renewDate: soon.toISOString(),
|
||||
price: 0,
|
||||
});
|
||||
|
||||
const laterAlert = new RenewalAlertViewModel({
|
||||
id: 'later',
|
||||
name: 'Later',
|
||||
type: 'league',
|
||||
renewDate: later.toISOString(),
|
||||
price: 0,
|
||||
});
|
||||
|
||||
expect(soonAlert.daysUntilRenewal).toBeGreaterThan(0);
|
||||
expect(soonAlert.isUrgent).toBe(true);
|
||||
|
||||
expect(laterAlert.daysUntilRenewal).toBeGreaterThan(30);
|
||||
expect(laterAlert.isUrgent).toBe(false);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user