Files
backend/test/fixtures/tbank-sync-crash.cjs
T

87 lines
2.4 KiB
JavaScript

// This process is deliberately killed by the SQLite suite at durable boundaries.
require('../e2e-env.cjs');
const { ConfigService } = require('@nestjs/config');
const {
TbankAccessService,
} = require('../../dist/src/integrations/tbank/tbank-access.service');
const {
TbankTokenService,
} = require('../../dist/src/integrations/tbank/tbank-token.service');
const {
BrokerageOperationsSyncService,
} = require('../../dist/src/modules/investments/operations/application/brokerage-operations-sync.service');
const {
BrokerageOperationsRepository,
} = require('../../dist/src/modules/investments/operations/infrastructure/brokerage-operations.repository');
const { PrismaService } = require('../../dist/src/prisma/prisma.service');
const mode = process.argv[2];
const prisma = new PrismaService(new ConfigService(process.env));
const repository = new BrokerageOperationsRepository(prisma);
const tokens = new TbankTokenService(new ConfigService(process.env));
const stopped = new Promise(() => {});
let handle;
let pages = 0;
const checkpoint = () => process.send({ checkpoint: mode, handle });
const upstream = {
async getOperationsByCursor() {
pages += 1;
if (mode === 'between-pages' && pages === 2) {
checkpoint();
return stopped;
}
return {
hasNext: mode === 'between-pages',
nextCursor: mode === 'between-pages' ? 'discard-after-restart' : '',
items: [
{
id: 'crash-row',
date: { seconds: '1768000000' },
payment: { units: '10', nano: 1, currency: 'rub' },
},
],
};
},
};
const publish = repository.publish.bind(repository);
repository.publish = async (...args) => {
if (mode === 'before-publish') {
checkpoint();
return stopped;
}
const result = await publish(...args);
if (mode === 'after-publish') {
checkpoint();
return stopped;
}
return result;
};
const service = new BrokerageOperationsSyncService(
repository,
new TbankAccessService(prisma, tokens),
upstream,
{
event() {
process.send({ error: 'Unexpected worker persistence failure' });
},
},
);
process.on('message', () => {});
(async () => {
await prisma.$connect();
handle = await service.request(
'owner',
[
{
accountId: 'account',
from: new Date('2026-01-01Z'),
to: new Date('2026-02-01Z'),
},
],
true,
);
})().catch((error) => {
process.send({ error: error.message });
process.exitCode = 1;
});