201 lines
6.0 KiB
TypeScript
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');
|
|
});
|
|
});
|
|
});
|