Files
gridpilot.gg/core/racing/domain/value-objects/MembershipFee.test.ts
2026-01-16 19:46:49 +01:00

73 lines
2.6 KiB
TypeScript

import { describe, expect, it } 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);
});
});