Files
edr-platform/apps/edr-passenger-api/src/modules/reschedule/reschedule.service.spec.ts

38 lines
2.3 KiB
TypeScript

import { addisDay, computeRescheduleAmounts } from './reschedule.service';
const standard = { feePercent: 30, feeMinMinor: 50000, sameDayFeePercent: 0, sameDayFeeMinMinor: 0 };
const flex = { feePercent: 0, feeMinMinor: 0, sameDayFeePercent: 15, sameDayFeeMinMinor: 25000 };
const premium = { feePercent: 0, feeMinMinor: 0, sameDayFeePercent: 0, sameDayFeeMinMinor: 0 };
describe('computeRescheduleAmounts (policy §3)', () => {
it('Standard: 30% of fare, floored at 500 ETB, plus positive fare difference', () => {
// 1000 ETB fare → 30% = 300 < 500 floor
expect(computeRescheduleAmounts(standard, 100000, 120000, false)).toEqual({ feeMinor: 50000, fareDifferenceMinor: 20000, amountDueMinor: 70000 });
// 3000 ETB fare → 30% = 900 > floor
expect(computeRescheduleAmounts(standard, 300000, 300000, false)).toEqual({ feeMinor: 90000, fareDifferenceMinor: 0, amountDueMinor: 90000 });
});
it('negative fare difference is recorded but never paid out', () => {
expect(computeRescheduleAmounts(standard, 300000, 200000, false)).toEqual({ feeMinor: 90000, fareDifferenceMinor: -100000, amountDueMinor: 90000 });
expect(computeRescheduleAmounts(flex, 300000, 200000, false)).toEqual({ feeMinor: 0, fareDifferenceMinor: -100000, amountDueMinor: 0 });
});
it('Flex: free, fare difference only; same-day is 15% min 250 ETB', () => {
expect(computeRescheduleAmounts(flex, 100000, 150000, false)).toEqual({ feeMinor: 0, fareDifferenceMinor: 50000, amountDueMinor: 50000 });
expect(computeRescheduleAmounts(flex, 100000, 100000, true)).toEqual({ feeMinor: 25000, fareDifferenceMinor: 0, amountDueMinor: 25000 });
expect(computeRescheduleAmounts(flex, 400000, 400000, true)).toEqual({ feeMinor: 60000, fareDifferenceMinor: 0, amountDueMinor: 60000 });
});
it('Premium: always free, even same-day', () => {
expect(computeRescheduleAmounts(premium, 500000, 500000, true).amountDueMinor).toBe(0);
expect(computeRescheduleAmounts(premium, 500000, 560000, true).amountDueMinor).toBe(60000);
});
});
describe('addisDay', () => {
it('compares calendar days in Africa/Addis_Ababa (UTC+3), not UTC', () => {
expect(addisDay(new Date('2026-09-01T21:30:00Z'))).toBe('2026-09-02');
expect(addisDay(new Date('2026-09-01T20:30:00Z'))).toBe('2026-09-01');
});
});