54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
|
|
import { describe, it, expect } from 'vitest';
|
||
|
|
|
||
|
|
import {
|
||
|
|
agingBucket,
|
||
|
|
AGING_BUCKETS,
|
||
|
|
monthKey,
|
||
|
|
monthRange,
|
||
|
|
netContribution,
|
||
|
|
} from '@/lib/services/reports/financial-math';
|
||
|
|
|
||
|
|
describe('agingBucket', () => {
|
||
|
|
it('buckets day counts into the 4 age bands', () => {
|
||
|
|
expect(agingBucket(0)).toBe('0-30');
|
||
|
|
expect(agingBucket(30)).toBe('0-30');
|
||
|
|
expect(agingBucket(31)).toBe('31-60');
|
||
|
|
expect(agingBucket(60)).toBe('31-60');
|
||
|
|
expect(agingBucket(61)).toBe('61-90');
|
||
|
|
expect(agingBucket(90)).toBe('61-90');
|
||
|
|
expect(agingBucket(91)).toBe('90+');
|
||
|
|
expect(agingBucket(400)).toBe('90+');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('exposes the buckets in ascending order for stable chart rows', () => {
|
||
|
|
expect(AGING_BUCKETS).toEqual(['0-30', '31-60', '61-90', '90+']);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('monthKey', () => {
|
||
|
|
it('formats a date as zero-padded YYYY-MM (UTC)', () => {
|
||
|
|
expect(monthKey(new Date('2026-01-09T00:00:00Z'))).toBe('2026-01');
|
||
|
|
expect(monthKey(new Date('2026-12-31T23:59:59Z'))).toBe('2026-12');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('monthRange', () => {
|
||
|
|
it('produces a continuous ascending month series, inclusive of both ends', () => {
|
||
|
|
const series = monthRange(new Date('2025-11-15T00:00:00Z'), new Date('2026-02-02T00:00:00Z'));
|
||
|
|
expect(series).toEqual(['2025-11', '2025-12', '2026-01', '2026-02']);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('returns a single month when from and to share a month', () => {
|
||
|
|
expect(monthRange(new Date('2026-03-01T00:00:00Z'), new Date('2026-03-28T00:00:00Z'))).toEqual([
|
||
|
|
'2026-03',
|
||
|
|
]);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('netContribution', () => {
|
||
|
|
it('is revenue minus expenses', () => {
|
||
|
|
expect(netContribution(1000, 250)).toBe(750);
|
||
|
|
expect(netContribution(100, 400)).toBe(-300);
|
||
|
|
});
|
||
|
|
});
|