73 lines
2.6 KiB
TypeScript
73 lines
2.6 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { MembershipFee } from './MembershipFee';
|
|
import { Money } from './Money';
|
|
|
|
describe('MembershipFee', () => {
|
|
it('should create valid membership fee', () => {
|
|
const amount = Money.create(1000, 'USD');
|
|
const fee = MembershipFee.create('season', amount);
|
|
expect(fee.type).toBe('season');
|
|
expect(fee.amount).toBe(amount);
|
|
});
|
|
|
|
it('should validate type required', () => {
|
|
const amount = Money.create(1000, 'USD');
|
|
expect(() => MembershipFee.create('' as 'season', amount)).toThrow('MembershipFee type is required');
|
|
});
|
|
|
|
it('should validate amount required', () => {
|
|
expect(() => MembershipFee.create('season', null as unknown as Money)).toThrow('MembershipFee amount is required');
|
|
});
|
|
|
|
it('should validate amount not negative', () => {
|
|
expect(() => Money.create(-100, 'USD')).toThrow('Money amount cannot be negative');
|
|
});
|
|
|
|
it('should get platform fee', () => {
|
|
const amount = Money.create(1000, 'USD'); // $10.00
|
|
const fee = MembershipFee.create('season', amount);
|
|
const platformFee = fee.getPlatformFee();
|
|
expect(platformFee.amount).toBe(100); // $1.00
|
|
expect(platformFee.currency).toBe('USD');
|
|
});
|
|
|
|
it('should get net amount', () => {
|
|
const amount = Money.create(1000, 'USD'); // $10.00
|
|
const fee = MembershipFee.create('season', amount);
|
|
const netAmount = fee.getNetAmount();
|
|
expect(netAmount.amount).toBe(900); // $9.00
|
|
expect(netAmount.currency).toBe('USD');
|
|
});
|
|
|
|
it('should check if recurring', () => {
|
|
const amount = Money.create(1000, 'USD');
|
|
const seasonFee = MembershipFee.create('season', amount);
|
|
const monthlyFee = MembershipFee.create('monthly', amount);
|
|
const perRaceFee = MembershipFee.create('per_race', amount);
|
|
expect(seasonFee.isRecurring()).toBe(false);
|
|
expect(monthlyFee.isRecurring()).toBe(true);
|
|
expect(perRaceFee.isRecurring()).toBe(false);
|
|
});
|
|
|
|
it('should have props', () => {
|
|
const amount = Money.create(1000, 'USD');
|
|
const fee = MembershipFee.create('season', amount);
|
|
expect(fee.props).toEqual({
|
|
type: 'season',
|
|
amount,
|
|
});
|
|
});
|
|
|
|
it('equals', () => {
|
|
const amount1 = Money.create(1000, 'USD');
|
|
const amount2 = Money.create(1000, 'USD');
|
|
const amount3 = Money.create(2000, 'USD');
|
|
const fee1 = MembershipFee.create('season', amount1);
|
|
const fee2 = MembershipFee.create('season', amount2);
|
|
const fee3 = MembershipFee.create('monthly', amount1);
|
|
const fee4 = MembershipFee.create('season', amount3);
|
|
expect(fee1.equals(fee2)).toBe(true);
|
|
expect(fee1.equals(fee3)).toBe(false);
|
|
expect(fee1.equals(fee4)).toBe(false);
|
|
});
|
|
}); |