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'); }); }); });