fix: scope income and ledger sync to requested intervals (WealthLedger/backend#57)
This commit is contained in:
@@ -113,6 +113,50 @@ describe('persistent ledger HTTP and cursor (SQLite)', () => {
|
||||
}
|
||||
}
|
||||
});
|
||||
it.each([
|
||||
'from=2099-01-01',
|
||||
'from=2025-03-01&to=2025-02-01',
|
||||
])('empty ledger range %s returns 200 without upstream RPC', async (query) => {
|
||||
const response = await request(app.getHttpServer())
|
||||
.get(`/api/v1/brokerage-accounts/a/operations?${query}`)
|
||||
.set('Authorization', auth())
|
||||
.expect(200);
|
||||
const result = response.body as BrokerageOperationsResourceDto;
|
||||
expect(result.data?.items).toEqual([]);
|
||||
expect(upstream.getOperationsByCursor).not.toHaveBeenCalled();
|
||||
});
|
||||
it('cold ledger imports only the missing requested interval', async () => {
|
||||
upstream.getOperationsByCursor.mockResolvedValue({
|
||||
hasNext: false,
|
||||
items: [],
|
||||
});
|
||||
await put().expect(200);
|
||||
await request(app.getHttpServer())
|
||||
.get('/api/v1/brokerage-accounts/a/operations?from=2025-02-01&to=2025-02-28')
|
||||
.set('Authorization', auth())
|
||||
.expect(200);
|
||||
let complete = false;
|
||||
for (let attempt = 0; attempt < 100; attempt++) {
|
||||
const response = await request(app.getHttpServer())
|
||||
.get('/api/v1/brokerage-accounts/a/operations?from=2025-02-01&to=2025-02-28&sync=observe')
|
||||
.set('Authorization', auth())
|
||||
.expect(200);
|
||||
const result = response.body as BrokerageOperationsResourceDto;
|
||||
complete = result.meta.completeness === 'complete';
|
||||
if (complete) break;
|
||||
await delay(10);
|
||||
}
|
||||
expect(complete).toBe(true);
|
||||
expect(upstream.getOperationsByCursor).toHaveBeenCalledTimes(1);
|
||||
expect(upstream.getOperationsByCursor).toHaveBeenCalledWith(
|
||||
'synthetic',
|
||||
expect.objectContaining({
|
||||
accountId: 'a',
|
||||
from: { seconds: '1738367999' },
|
||||
to: { seconds: '1740787201' },
|
||||
}),
|
||||
);
|
||||
});
|
||||
it('reads ordered pages with identical IDs/timestamps across accounts and no upstream RPC, including after reopen', async () => {
|
||||
let cursor: null | string = null;
|
||||
const ids: string[] = [];
|
||||
@@ -409,7 +453,7 @@ describe('persistent ledger HTTP and cursor (SQLite)', () => {
|
||||
const result = (await get('sync=observe', 'a').expect(200))
|
||||
.body as BrokerageOperationsResourceDto;
|
||||
expect(result.meta.coverage?.historyBoundary).toBe('unknown');
|
||||
expect(result.meta.coverage?.historyState).toBe('loading');
|
||||
expect(result.meta.coverage?.historyState).toBe('missing');
|
||||
}, 30_000);
|
||||
|
||||
it('returns cold missing while upstream is blocked, then confirms an empty interval; observe never retries failure', async () => {
|
||||
|
||||
Reference in New Issue
Block a user