view models
This commit is contained in:
74
apps/website/lib/view-models/PaymentViewModel.test.ts
Normal file
74
apps/website/lib/view-models/PaymentViewModel.test.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { PaymentViewModel } from './PaymentViewModel';
|
||||
|
||||
const createPaymentDto = (overrides: Partial<any> = {}): any => ({
|
||||
id: 'pay-1',
|
||||
type: 'membership_fee',
|
||||
amount: 100.5,
|
||||
platformFee: 10.5,
|
||||
netAmount: 90,
|
||||
payerId: 'sponsor-1',
|
||||
payerType: 'sponsor',
|
||||
leagueId: 'league-1',
|
||||
seasonId: 'season-1',
|
||||
status: 'completed',
|
||||
createdAt: new Date('2024-01-01T10:00:00Z'),
|
||||
completedAt: new Date('2024-01-01T11:00:00Z'),
|
||||
...overrides,
|
||||
});
|
||||
|
||||
describe('PaymentViewModel', () => {
|
||||
it('maps DTO fields via Object.assign', () => {
|
||||
const dto = createPaymentDto();
|
||||
|
||||
const vm = new PaymentViewModel(dto);
|
||||
|
||||
expect(vm.id).toBe('pay-1');
|
||||
expect(vm.amount).toBe(100.5);
|
||||
expect(vm.netAmount).toBe(90);
|
||||
expect(vm.payerId).toBe('sponsor-1');
|
||||
expect(vm.leagueId).toBe('league-1');
|
||||
});
|
||||
|
||||
it('formats amount and netAmount as EUR currency strings', () => {
|
||||
const vm = new PaymentViewModel(createPaymentDto({ amount: 50, netAmount: 40 }));
|
||||
|
||||
expect(vm.formattedAmount).toBe('€50.00');
|
||||
expect(vm.formattedNetAmount).toBe('€40.00');
|
||||
});
|
||||
|
||||
it('maps status to a statusColor', () => {
|
||||
const completed = new PaymentViewModel(createPaymentDto({ status: 'completed' }));
|
||||
const pending = new PaymentViewModel(createPaymentDto({ status: 'pending' }));
|
||||
const failed = new PaymentViewModel(createPaymentDto({ status: 'failed' }));
|
||||
const refunded = new PaymentViewModel(createPaymentDto({ status: 'refunded' }));
|
||||
const other = new PaymentViewModel(createPaymentDto({ status: 'unknown' }));
|
||||
|
||||
expect(completed.statusColor).toBe('green');
|
||||
expect(pending.statusColor).toBe('yellow');
|
||||
expect(failed.statusColor).toBe('red');
|
||||
expect(refunded.statusColor).toBe('orange');
|
||||
expect(other.statusColor).toBe('gray');
|
||||
});
|
||||
|
||||
it('formats createdAt and completedAt using locale formatting', () => {
|
||||
const vm = new PaymentViewModel(createPaymentDto());
|
||||
|
||||
expect(typeof vm.formattedCreatedAt).toBe('string');
|
||||
expect(typeof vm.formattedCompletedAt).toBe('string');
|
||||
});
|
||||
|
||||
it('handles missing completedAt with fallback text', () => {
|
||||
const vm = new PaymentViewModel(createPaymentDto({ completedAt: undefined }));
|
||||
|
||||
expect(vm.formattedCompletedAt).toBe('Not completed');
|
||||
});
|
||||
|
||||
it('derives display labels for status, type and payer type', () => {
|
||||
const vm = new PaymentViewModel(createPaymentDto({ status: 'pending', type: 'membership_fee', payerType: 'league' }));
|
||||
|
||||
expect(vm.statusDisplay).toBe('Pending');
|
||||
expect(vm.typeDisplay).toBe('Membership Fee');
|
||||
expect(vm.payerTypeDisplay).toBe('League');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user