import { investmentResourceMeta } from './investment-resource.mapper'; describe('investment resource source freshness', () => { afterEach(() => jest.useRealTimers()); it('uses each required source TTL and oldest successful timestamp', () => { jest.useFakeTimers().setSystemTime(new Date('2026-09-25T12:00:00Z')); const membership = investmentResourceMeta({ resourceKey: 'membership', dataRevision: '1', availability: 'complete', fetchedAt: new Date('2026-09-25T11:58:00Z'), freshForMs: 300_000, work: null, }); const input = { resourceKey: 'portfolio', dataRevision: '1', availability: 'complete' as const, fetchedAt: new Date('2026-09-25T11:59:30Z'), freshForMs: 60_000, work: null, dependencies: [membership], }; const fresh = investmentResourceMeta(input); expect(fresh.freshness).toBe('fresh'); expect(fresh.lastSuccessfulAt).toBe('2026-09-25T11:58:00.000Z'); jest.advanceTimersByTime(30_000); const stale = investmentResourceMeta(input); expect(stale.freshness).toBe('stale'); expect(stale.lastSuccessfulAt).toBe(fresh.lastSuccessfulAt); expect( investmentResourceMeta({ ...input, dependencies: [{ ...membership, freshness: 'unknown' }], }).freshness, ).toBe('unknown'); }); }); describe('dependent resource lifecycle', () => { const input = { resourceKey: 'source', dataRevision: '1', availability: 'complete' as const, fetchedAt: new Date(), freshForMs: 60_000, work: null, }; it('exposes dependency work without losing saved availability or timestamps', () => { const failed = investmentResourceMeta({ ...input, work: { id: 'failed', state: 'failed', errorCode: 'TBANK_UNAVAILABLE' }, }); const running = investmentResourceMeta({ ...input, work: { id: 'running', state: 'running', errorCode: null }, }); const parent = investmentResourceMeta({ ...input, dependencies: [failed, running], }); expect(parent.sync).toEqual(running.sync); expect(parent.availability).toBe('complete'); const terminal = investmentResourceMeta({ ...input, dependencies: [failed], }); expect(terminal.sync).toEqual(failed.sync); expect(terminal.lastSuccessfulAt).toBe(parent.lastSuccessfulAt); expect( investmentResourceMeta({ ...input, dependencies: [{ ...failed, unavailableReason: 'calendar_boundary' }], }).sync.state, ).toBe('idle'); }); });