import { describe, it, expect } from 'vitest'; import { WalletTransactionViewModel, FullTransactionDto } from './WalletTransactionViewModel'; const createTx = (overrides: Partial = {}): FullTransactionDto => ({ id: 'tx-1', type: 'sponsorship', description: 'Test', amount: 100, fee: 10, netAmount: 90, date: new Date('2024-01-01T00:00:00Z'), status: 'completed', reference: 'ref-1', ...overrides, }); describe('WalletTransactionViewModel', () => { it('maps DTO fields into the view model', () => { const vm = new WalletTransactionViewModel(createTx()); expect(vm.id).toBe('tx-1'); expect(vm.type).toBe('sponsorship'); expect(vm.amount).toBe(100); expect(vm.netAmount).toBe(90); expect(vm.status).toBe('completed'); }); it('formats amount with sign and currency symbol', () => { const incoming = new WalletTransactionViewModel(createTx({ amount: 50 })); const outgoing = new WalletTransactionViewModel(createTx({ amount: -20 })); expect(incoming.formattedAmount).toBe('+$50.00'); expect(outgoing.formattedAmount).toBe('$20.00'); }); it('derives amount color and isIncoming from amount sign', () => { const incoming = new WalletTransactionViewModel(createTx({ amount: 10 })); const outgoing = new WalletTransactionViewModel(createTx({ amount: -5 })); expect(incoming.amountColor).toBe('green'); expect(incoming.isIncoming).toBe(true); expect(outgoing.amountColor).toBe('red'); expect(outgoing.isIncoming).toBe(false); }); it('derives typeDisplay and formattedDate', () => { const vm = new WalletTransactionViewModel(createTx({ type: 'membership' })); expect(vm.typeDisplay).toBe('Membership'); expect(typeof vm.formattedDate).toBe('string'); }); });