Files
gridpilot.gg/core/payments/domain/entities/MembershipFee.test.ts
2026-01-22 18:05:30 +01:00

201 lines
6.0 KiB
TypeScript

import {
MembershipFee,
MembershipFeeType,
} from '@core/payments/domain/entities/MembershipFee';
import { describe, expect, it } from 'vitest';
describe('payments/domain/entities/MembershipFee', () => {
describe('MembershipFeeType enum', () => {
it('should have correct fee type values', () => {
expect(MembershipFeeType.SEASON).toBe('season');
expect(MembershipFeeType.MONTHLY).toBe('monthly');
expect(MembershipFeeType.PER_RACE).toBe('per_race');
});
});
describe('MembershipFee interface', () => {
it('should have all required properties', () => {
const fee: MembershipFee = {
id: 'fee-123',
leagueId: 'league-456',
type: MembershipFeeType.SEASON,
amount: 100,
enabled: true,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
expect(fee.id).toBe('fee-123');
expect(fee.leagueId).toBe('league-456');
expect(fee.type).toBe(MembershipFeeType.SEASON);
expect(fee.amount).toBe(100);
expect(fee.enabled).toBe(true);
expect(fee.createdAt).toEqual(new Date('2024-01-01'));
expect(fee.updatedAt).toEqual(new Date('2024-01-01'));
});
it('should support optional seasonId property', () => {
const fee: MembershipFee = {
id: 'fee-123',
leagueId: 'league-456',
seasonId: 'season-789',
type: MembershipFeeType.SEASON,
amount: 100,
enabled: true,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
expect(fee.seasonId).toBe('season-789');
});
});
describe('MembershipFee.rehydrate', () => {
it('should rehydrate a MembershipFee from props', () => {
const props: MembershipFee = {
id: 'fee-123',
leagueId: 'league-456',
type: MembershipFeeType.SEASON,
amount: 100,
enabled: true,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
const rehydrated = MembershipFee.rehydrate(props);
expect(rehydrated).toEqual(props);
expect(rehydrated.id).toBe('fee-123');
expect(rehydrated.leagueId).toBe('league-456');
expect(rehydrated.type).toBe(MembershipFeeType.SEASON);
expect(rehydrated.amount).toBe(100);
expect(rehydrated.enabled).toBe(true);
expect(rehydrated.createdAt).toEqual(new Date('2024-01-01'));
expect(rehydrated.updatedAt).toEqual(new Date('2024-01-01'));
});
it('should preserve optional seasonId when rehydrating', () => {
const props: MembershipFee = {
id: 'fee-123',
leagueId: 'league-456',
seasonId: 'season-789',
type: MembershipFeeType.SEASON,
amount: 100,
enabled: true,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
const rehydrated = MembershipFee.rehydrate(props);
expect(rehydrated.seasonId).toBe('season-789');
});
});
describe('Business rules and invariants', () => {
it('should support different fee types', () => {
const seasonFee: MembershipFee = {
id: 'fee-123',
leagueId: 'league-456',
type: MembershipFeeType.SEASON,
amount: 100,
enabled: true,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
const monthlyFee: MembershipFee = {
id: 'fee-124',
leagueId: 'league-456',
type: MembershipFeeType.MONTHLY,
amount: 50,
enabled: true,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
const perRaceFee: MembershipFee = {
id: 'fee-125',
leagueId: 'league-456',
type: MembershipFeeType.PER_RACE,
amount: 10,
enabled: true,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
expect(seasonFee.type).toBe(MembershipFeeType.SEASON);
expect(monthlyFee.type).toBe(MembershipFeeType.MONTHLY);
expect(perRaceFee.type).toBe(MembershipFeeType.PER_RACE);
});
it('should handle enabled/disabled state', () => {
const enabledFee: MembershipFee = {
id: 'fee-123',
leagueId: 'league-456',
type: MembershipFeeType.SEASON,
amount: 100,
enabled: true,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
const disabledFee: MembershipFee = {
id: 'fee-124',
leagueId: 'league-456',
type: MembershipFeeType.SEASON,
amount: 0,
enabled: false,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
expect(enabledFee.enabled).toBe(true);
expect(disabledFee.enabled).toBe(false);
});
it('should handle zero and negative amounts', () => {
const zeroFee: MembershipFee = {
id: 'fee-123',
leagueId: 'league-456',
type: MembershipFeeType.SEASON,
amount: 0,
enabled: false,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
expect(zeroFee.amount).toBe(0);
expect(zeroFee.enabled).toBe(false);
});
it('should handle different league and season combinations', () => {
const leagueOnlyFee: MembershipFee = {
id: 'fee-123',
leagueId: 'league-456',
type: MembershipFeeType.MONTHLY,
amount: 50,
enabled: true,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
const leagueAndSeasonFee: MembershipFee = {
id: 'fee-124',
leagueId: 'league-456',
seasonId: 'season-789',
type: MembershipFeeType.SEASON,
amount: 100,
enabled: true,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-01'),
};
expect(leagueOnlyFee.leagueId).toBe('league-456');
expect(leagueOnlyFee.seasonId).toBeUndefined();
expect(leagueAndSeasonFee.leagueId).toBe('league-456');
expect(leagueAndSeasonFee.seasonId).toBe('season-789');
});
});
});