core tests
This commit is contained in:
@@ -1,8 +1,284 @@
|
||||
import * as mod from '@core/payments/domain/entities/Wallet';
|
||||
import {
|
||||
ReferenceType,
|
||||
Transaction,
|
||||
TransactionType,
|
||||
Wallet,
|
||||
} from '@core/payments/domain/entities/Wallet';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
describe('payments/domain/entities/Wallet.ts', () => {
|
||||
it('imports', () => {
|
||||
expect(mod).toBeTruthy();
|
||||
describe('payments/domain/entities/Wallet', () => {
|
||||
describe('TransactionType enum', () => {
|
||||
it('should have correct transaction type values', () => {
|
||||
expect(TransactionType.DEPOSIT).toBe('deposit');
|
||||
expect(TransactionType.WITHDRAWAL).toBe('withdrawal');
|
||||
expect(TransactionType.PLATFORM_FEE).toBe('platform_fee');
|
||||
});
|
||||
});
|
||||
|
||||
describe('ReferenceType enum', () => {
|
||||
it('should have correct reference type values', () => {
|
||||
expect(ReferenceType.SPONSORSHIP).toBe('sponsorship');
|
||||
expect(ReferenceType.MEMBERSHIP_FEE).toBe('membership_fee');
|
||||
expect(ReferenceType.PRIZE).toBe('prize');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Wallet interface', () => {
|
||||
it('should have all required properties', () => {
|
||||
const wallet: Wallet = {
|
||||
id: 'wallet-123',
|
||||
leagueId: 'league-456',
|
||||
balance: 1000,
|
||||
totalRevenue: 5000,
|
||||
totalPlatformFees: 250,
|
||||
totalWithdrawn: 3750,
|
||||
currency: 'USD',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
expect(wallet.id).toBe('wallet-123');
|
||||
expect(wallet.leagueId).toBe('league-456');
|
||||
expect(wallet.balance).toBe(1000);
|
||||
expect(wallet.totalRevenue).toBe(5000);
|
||||
expect(wallet.totalPlatformFees).toBe(250);
|
||||
expect(wallet.totalWithdrawn).toBe(3750);
|
||||
expect(wallet.currency).toBe('USD');
|
||||
expect(wallet.createdAt).toEqual(new Date('2024-01-01'));
|
||||
});
|
||||
});
|
||||
|
||||
describe('Wallet.rehydrate', () => {
|
||||
it('should rehydrate a Wallet from props', () => {
|
||||
const props: Wallet = {
|
||||
id: 'wallet-123',
|
||||
leagueId: 'league-456',
|
||||
balance: 1000,
|
||||
totalRevenue: 5000,
|
||||
totalPlatformFees: 250,
|
||||
totalWithdrawn: 3750,
|
||||
currency: 'USD',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
const rehydrated = Wallet.rehydrate(props);
|
||||
|
||||
expect(rehydrated).toEqual(props);
|
||||
expect(rehydrated.id).toBe('wallet-123');
|
||||
expect(rehydrated.leagueId).toBe('league-456');
|
||||
expect(rehydrated.balance).toBe(1000);
|
||||
expect(rehydrated.totalRevenue).toBe(5000);
|
||||
expect(rehydrated.totalPlatformFees).toBe(250);
|
||||
expect(rehydrated.totalWithdrawn).toBe(3750);
|
||||
expect(rehydrated.currency).toBe('USD');
|
||||
expect(rehydrated.createdAt).toEqual(new Date('2024-01-01'));
|
||||
});
|
||||
});
|
||||
|
||||
describe('Transaction interface', () => {
|
||||
it('should have all required properties', () => {
|
||||
const transaction: Transaction = {
|
||||
id: 'txn-123',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.DEPOSIT,
|
||||
amount: 1000,
|
||||
description: 'Sponsorship payment',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
expect(transaction.id).toBe('txn-123');
|
||||
expect(transaction.walletId).toBe('wallet-456');
|
||||
expect(transaction.type).toBe(TransactionType.DEPOSIT);
|
||||
expect(transaction.amount).toBe(1000);
|
||||
expect(transaction.description).toBe('Sponsorship payment');
|
||||
expect(transaction.createdAt).toEqual(new Date('2024-01-01'));
|
||||
});
|
||||
|
||||
it('should support optional referenceId and referenceType properties', () => {
|
||||
const transaction: Transaction = {
|
||||
id: 'txn-123',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.DEPOSIT,
|
||||
amount: 1000,
|
||||
description: 'Sponsorship payment',
|
||||
referenceId: 'payment-789',
|
||||
referenceType: ReferenceType.SPONSORSHIP,
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
expect(transaction.referenceId).toBe('payment-789');
|
||||
expect(transaction.referenceType).toBe(ReferenceType.SPONSORSHIP);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Transaction.rehydrate', () => {
|
||||
it('should rehydrate a Transaction from props', () => {
|
||||
const props: Transaction = {
|
||||
id: 'txn-123',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.DEPOSIT,
|
||||
amount: 1000,
|
||||
description: 'Sponsorship payment',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
const rehydrated = Transaction.rehydrate(props);
|
||||
|
||||
expect(rehydrated).toEqual(props);
|
||||
expect(rehydrated.id).toBe('txn-123');
|
||||
expect(rehydrated.walletId).toBe('wallet-456');
|
||||
expect(rehydrated.type).toBe(TransactionType.DEPOSIT);
|
||||
expect(rehydrated.amount).toBe(1000);
|
||||
expect(rehydrated.description).toBe('Sponsorship payment');
|
||||
expect(rehydrated.createdAt).toEqual(new Date('2024-01-01'));
|
||||
});
|
||||
|
||||
it('should preserve optional referenceId and referenceType when rehydrating', () => {
|
||||
const props: Transaction = {
|
||||
id: 'txn-123',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.DEPOSIT,
|
||||
amount: 1000,
|
||||
description: 'Sponsorship payment',
|
||||
referenceId: 'payment-789',
|
||||
referenceType: ReferenceType.SPONSORSHIP,
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
const rehydrated = Transaction.rehydrate(props);
|
||||
|
||||
expect(rehydrated.referenceId).toBe('payment-789');
|
||||
expect(rehydrated.referenceType).toBe(ReferenceType.SPONSORSHIP);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Business rules and invariants', () => {
|
||||
it('should calculate balance correctly', () => {
|
||||
const wallet: Wallet = {
|
||||
id: 'wallet-123',
|
||||
leagueId: 'league-456',
|
||||
balance: 1000,
|
||||
totalRevenue: 5000,
|
||||
totalPlatformFees: 250,
|
||||
totalWithdrawn: 3750,
|
||||
currency: 'USD',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
// Balance should be: totalRevenue - totalPlatformFees - totalWithdrawn
|
||||
const expectedBalance = wallet.totalRevenue - wallet.totalPlatformFees - wallet.totalWithdrawn;
|
||||
expect(wallet.balance).toBe(expectedBalance);
|
||||
});
|
||||
|
||||
it('should support different transaction types', () => {
|
||||
const depositTransaction: Transaction = {
|
||||
id: 'txn-123',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.DEPOSIT,
|
||||
amount: 1000,
|
||||
description: 'Sponsorship payment',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
const withdrawalTransaction: Transaction = {
|
||||
id: 'txn-124',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.WITHDRAWAL,
|
||||
amount: 500,
|
||||
description: 'Withdrawal to bank',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
const platformFeeTransaction: Transaction = {
|
||||
id: 'txn-125',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.PLATFORM_FEE,
|
||||
amount: 50,
|
||||
description: 'Platform fee deduction',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
expect(depositTransaction.type).toBe(TransactionType.DEPOSIT);
|
||||
expect(withdrawalTransaction.type).toBe(TransactionType.WITHDRAWAL);
|
||||
expect(platformFeeTransaction.type).toBe(TransactionType.PLATFORM_FEE);
|
||||
});
|
||||
|
||||
it('should support different reference types', () => {
|
||||
const sponsorshipTransaction: Transaction = {
|
||||
id: 'txn-123',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.DEPOSIT,
|
||||
amount: 1000,
|
||||
description: 'Sponsorship payment',
|
||||
referenceId: 'payment-789',
|
||||
referenceType: ReferenceType.SPONSORSHIP,
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
const membershipFeeTransaction: Transaction = {
|
||||
id: 'txn-124',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.DEPOSIT,
|
||||
amount: 100,
|
||||
description: 'Membership fee payment',
|
||||
referenceId: 'payment-790',
|
||||
referenceType: ReferenceType.MEMBERSHIP_FEE,
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
const prizeTransaction: Transaction = {
|
||||
id: 'txn-125',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.WITHDRAWAL,
|
||||
amount: 500,
|
||||
description: 'Prize payout',
|
||||
referenceId: 'prize-791',
|
||||
referenceType: ReferenceType.PRIZE,
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
expect(sponsorshipTransaction.referenceType).toBe(ReferenceType.SPONSORSHIP);
|
||||
expect(membershipFeeTransaction.referenceType).toBe(ReferenceType.MEMBERSHIP_FEE);
|
||||
expect(prizeTransaction.referenceType).toBe(ReferenceType.PRIZE);
|
||||
});
|
||||
|
||||
it('should handle zero and negative amounts', () => {
|
||||
const zeroTransaction: Transaction = {
|
||||
id: 'txn-123',
|
||||
walletId: 'wallet-456',
|
||||
type: TransactionType.DEPOSIT,
|
||||
amount: 0,
|
||||
description: 'Zero amount transaction',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
expect(zeroTransaction.amount).toBe(0);
|
||||
});
|
||||
|
||||
it('should handle different currencies', () => {
|
||||
const usdWallet: Wallet = {
|
||||
id: 'wallet-123',
|
||||
leagueId: 'league-456',
|
||||
balance: 1000,
|
||||
totalRevenue: 5000,
|
||||
totalPlatformFees: 250,
|
||||
totalWithdrawn: 3750,
|
||||
currency: 'USD',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
const eurWallet: Wallet = {
|
||||
id: 'wallet-124',
|
||||
leagueId: 'league-457',
|
||||
balance: 1000,
|
||||
totalRevenue: 5000,
|
||||
totalPlatformFees: 250,
|
||||
totalWithdrawn: 3750,
|
||||
currency: 'EUR',
|
||||
createdAt: new Date('2024-01-01'),
|
||||
};
|
||||
|
||||
expect(usdWallet.currency).toBe('USD');
|
||||
expect(eurWallet.currency).toBe('EUR');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user