Files
gridpilot.gg/apps/website/lib/view-models/WalletViewModel.test.ts
Marc Mintel 6c07abe5e7
Some checks failed
Contract Testing / contract-snapshot (pull_request) Has been cancelled
Contract Testing / contract-tests (pull_request) Has been cancelled
view data fixes
2026-01-25 00:12:30 +01:00

79 lines
2.5 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { WalletTransactionViewModel } from './WalletTransactionViewModel';
import { WalletViewModel } from './WalletViewModel';
const createWalletDto = (overrides: Partial<any> = {}): any => ({
id: 'wallet-1',
leagueId: 'league-1',
balance: 100.5,
totalRevenue: 1000,
totalPlatformFees: 50,
totalWithdrawn: 200,
createdAt: '2024-01-01T00:00:00Z',
currency: 'EUR',
transactions: [],
...overrides,
});
const createTransactionDto = (overrides: Partial<any> = {}): any => ({
id: 'tx-1',
type: 'sponsorship',
description: 'Test',
amount: 10,
fee: 1,
netAmount: 9,
date: new Date('2024-01-01T00:00:00Z'),
status: 'completed',
reference: 'ref',
...overrides,
});
describe('WalletViewModel', () => {
it('maps wallet DTO fields and wraps transactions into view models', () => {
const dto = createWalletDto({
transactions: [createTransactionDto({ id: 'tx-1' }), createTransactionDto({ id: 'tx-2', amount: -5 })],
});
const vm = new WalletViewModel(dto);
expect(vm.id).toBe('wallet-1');
expect(vm.leagueId).toBe('league-1');
expect(vm.balance).toBe(100.5);
expect(vm.transactions).toHaveLength(2);
expect(vm.transactions[0]).toBeInstanceOf(WalletTransactionViewModel);
});
it('formats balance with currency and 2 decimals', () => {
const vm = new WalletViewModel(createWalletDto({ balance: 250, currency: 'USD' }));
expect(vm.formattedBalance).toBe('$250.00');
});
it('derives balanceColor based on sign of balance', () => {
const positive = new WalletViewModel(createWalletDto({ balance: 10 }));
const zero = new WalletViewModel(createWalletDto({ balance: 0 }));
const negative = new WalletViewModel(createWalletDto({ balance: -5 }));
expect(positive.balanceColor).toBe('green');
expect(zero.balanceColor).toBe('green');
expect(negative.balanceColor).toBe('red');
});
it('exposes recentTransactions and totalTransactions helpers', () => {
const transactions = [
createTransactionDto({ id: 'tx-1' }),
createTransactionDto({ id: 'tx-2' }),
createTransactionDto({ id: 'tx-3' }),
createTransactionDto({ id: 'tx-4' }),
createTransactionDto({ id: 'tx-5' }),
createTransactionDto({ id: 'tx-6' }),
];
const vm = new WalletViewModel(createWalletDto({ transactions }));
expect(vm.totalTransactions).toBe(6);
expect(vm.recentTransactions).toHaveLength(5);
expect(vm.recentTransactions[0]).toBeInstanceOf(WalletTransactionViewModel);
});
});