Files
gridpilot.gg/apps/website/lib/view-models/MembershipFeeViewModel.test.ts
2026-01-24 01:25:46 +01:00

75 lines
2.7 KiB
TypeScript

import type { MembershipFeeDTO } from '@/lib/types/generated';
import { describe, expect, it } from 'vitest';
import { MembershipFeeViewModel } from './MembershipFeeViewModel';
const createMembershipFeeDto = (overrides: Partial<MembershipFeeDTO> = {}): MembershipFeeDTO => ({
id: 'fee-1',
leagueId: 'league-1',
seasonId: 'season-1',
type: 'season',
amount: 49.99,
enabled: true,
createdAt: new Date('2024-01-01T10:00:00Z'),
updatedAt: new Date('2024-01-02T10:00:00Z'),
...overrides,
});
describe('MembershipFeeViewModel', () => {
it('maps fields from DTO', () => {
const dto = createMembershipFeeDto({ id: 'custom-fee', amount: 19.5 });
const vm = new MembershipFeeViewModel(dto);
expect(vm.id).toBe('custom-fee');
expect(vm.leagueId).toBe('league-1');
expect(vm.seasonId).toBe('season-1');
expect(vm.amount).toBe(19.5);
expect(vm.enabled).toBe(true);
});
it('formats amount with euro currency and two decimals', () => {
const dto = createMembershipFeeDto({ amount: 10 });
const vm = new MembershipFeeViewModel(dto);
expect(vm.formattedAmount).toBe('€10.00');
});
it('maps type to human-readable display', () => {
const seasonVm = new MembershipFeeViewModel(createMembershipFeeDto({ type: 'season' }));
const monthlyVm = new MembershipFeeViewModel(createMembershipFeeDto({ type: 'monthly' }));
const perRaceVm = new MembershipFeeViewModel(createMembershipFeeDto({ type: 'per_race' }));
const otherVm = new MembershipFeeViewModel(createMembershipFeeDto({ type: 'custom' }));
expect(seasonVm.typeDisplay).toBe('Per Season');
expect(monthlyVm.typeDisplay).toBe('Monthly');
expect(perRaceVm.typeDisplay).toBe('Per Race');
expect(otherVm.typeDisplay).toBe('custom');
});
it('derives statusDisplay and statusColor from enabled flag', () => {
const enabledVm = new MembershipFeeViewModel(createMembershipFeeDto({ enabled: true }));
const disabledVm = new MembershipFeeViewModel(createMembershipFeeDto({ enabled: false }));
expect(enabledVm.statusDisplay).toBe('Enabled');
expect(enabledVm.statusColor).toBe('green');
expect(disabledVm.statusDisplay).toBe('Disabled');
expect(disabledVm.statusColor).toBe('red');
});
it('formats createdAt and updatedAt as localized strings', () => {
const dto = createMembershipFeeDto({
createdAt: new Date('2024-01-01T10:00:00Z'),
updatedAt: new Date('2024-01-02T10:00:00Z'),
});
const vm = new MembershipFeeViewModel(dto);
expect(typeof vm.formattedCreatedAt).toBe('string');
expect(vm.formattedCreatedAt.length).toBeGreaterThan(0);
expect(typeof vm.formattedUpdatedAt).toBe('string');
expect(vm.formattedUpdatedAt.length).toBeGreaterThan(0);
});
});