Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a17f1fffd | ||
|
|
b4c83e7462 | ||
|
|
3b55b611b5 |
@@ -244,23 +244,16 @@ export class TbankHourlyScheduler implements OnModuleDestroy, OnModuleInit {
|
|||||||
dispatchProblems: HourlySection[],
|
dispatchProblems: HourlySection[],
|
||||||
walkStartedAt: Date,
|
walkStartedAt: Date,
|
||||||
) {
|
) {
|
||||||
const portfolios: string[] = [];
|
|
||||||
for (const account of accounts) {
|
for (const account of accounts) {
|
||||||
await this.dispatchPortfolio(
|
await this.dispatchPortfolio(
|
||||||
userId,
|
userId,
|
||||||
revision,
|
revision,
|
||||||
account.accountId,
|
account.accountId,
|
||||||
async (child) => {
|
dispatch,
|
||||||
portfolios.push(child.id);
|
|
||||||
await dispatch(child);
|
|
||||||
},
|
|
||||||
dispatchProblems,
|
dispatchProblems,
|
||||||
walkStartedAt,
|
walkStartedAt,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// Operations coverage must end after the Portfolio valuation it explains:
|
|
||||||
// performance requires coverage up to the snapshot fetchedAt.
|
|
||||||
await this.waitWorks(userId, portfolios);
|
|
||||||
for (const account of accounts) {
|
for (const account of accounts) {
|
||||||
await this.dispatchOperations(
|
await this.dispatchOperations(
|
||||||
userId,
|
userId,
|
||||||
|
|||||||
@@ -167,29 +167,6 @@ describe('hourly attempt lifecycle (SQLite)', () => {
|
|||||||
expect(read?.state).toBe('succeeded');
|
expect(read?.state).toBe('succeeded');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('starts operations only after every portfolio work finished', async () => {
|
|
||||||
const portfolios: string[] = [];
|
|
||||||
portfolio.request.mockImplementation(
|
|
||||||
async (_userId: string, _revision: string, accountId: string) => {
|
|
||||||
const row = await child('running', null, `portfolio:${accountId}`);
|
|
||||||
portfolios.push(row.id);
|
|
||||||
return { id: row.id, done: Promise.resolve() };
|
|
||||||
},
|
|
||||||
);
|
|
||||||
const scheduler = createScheduler();
|
|
||||||
await scheduler.tick();
|
|
||||||
await pump();
|
|
||||||
expect(portfolios).toHaveLength(2);
|
|
||||||
expect(operations.request).not.toHaveBeenCalled();
|
|
||||||
await prisma.tbankSyncWork.updateMany({
|
|
||||||
where: { id: { in: portfolios } },
|
|
||||||
data: { state: 'complete' },
|
|
||||||
});
|
|
||||||
const row = await runWalk(scheduler);
|
|
||||||
expect(operations.request).toHaveBeenCalledTimes(2);
|
|
||||||
expect(row.state).toBe('complete');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('settles partial and keeps successful steps when one account fails', async () => {
|
it('settles partial and keeps successful steps when one account fails', async () => {
|
||||||
portfolio.request.mockImplementation(
|
portfolio.request.mockImplementation(
|
||||||
async (_userId: string, _revision: string, accountId: string) => {
|
async (_userId: string, _revision: string, accountId: string) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user