feat: 完善服务监控与下游重投
This commit is contained in:
@@ -54,6 +54,41 @@ describe('SendDownstreamRequeueTaskService', () => {
|
||||
expect(mock.downstreamRequeueTaskItem.createMany).toHaveBeenCalledWith({ data: [expect.objectContaining({ deliveryId: 'd-1', applicationId: 'app-1' })] });
|
||||
});
|
||||
|
||||
it('materializes client-confirmed deliveries from the signed preview range', async () => {
|
||||
mock.cmppDownstreamDelivery.count.mockResolvedValue(1);
|
||||
mock.cmppDownstreamDelivery.groupBy.mockResolvedValueOnce([{ status: 'delivered', _count: { _all: 1 } }]).mockResolvedValueOnce([{ applicationId: 'app-1', _count: { _all: 1 } }]);
|
||||
mock.cmppDownstreamDelivery.findFirst.mockResolvedValue({ createdAt: new Date() });
|
||||
const preview = await service.preview({ applicationId: 'app-1', status: 'delivered' }, 'user-1');
|
||||
expect(preview).toEqual(expect.objectContaining({ matchedCount: 1, replayableCount: 1, skippedCount: 0 }));
|
||||
mock.downstreamRequeueTask.findFirst.mockResolvedValue(null);
|
||||
mock.cmppDownstreamDelivery.findMany.mockResolvedValue([{ id: 'd-1', applicationId: 'app-1', status: 'delivered' }]);
|
||||
mock.downstreamRequeueTask.create.mockResolvedValue({ id: 'task-1' });
|
||||
mock.downstreamRequeueTask.findUnique.mockResolvedValue({ id: 'task-1' });
|
||||
mock.downstreamRequeueTaskItem.groupBy.mockResolvedValue([]);
|
||||
await service.create({ previewToken: preview.previewToken, reason: '再次投递客户已确认记录' }, 'user-1');
|
||||
expect(mock.downstreamRequeueTaskItem.createMany).toHaveBeenCalledWith({ data: [expect.objectContaining({ deliveryId: 'd-1', previousStatus: 'delivered' })] });
|
||||
});
|
||||
|
||||
it('replays a delivery that was already client-confirmed in the task snapshot', async () => {
|
||||
const requeue = jest.fn().mockResolvedValue({ status: 'awaiting_ack' });
|
||||
service = new SendDownstreamRequeueTaskService(mock as never, { requeueDownstreamDelivery: requeue });
|
||||
mock.cmppDownstreamDelivery.findUnique.mockResolvedValue({ id: 'd-1', applicationId: 'app-1', status: 'delivered', ackResult: 0, payload: {}, deliveryType: 'receipt', application: { status: 'active', interfaceEnabled: true } });
|
||||
mock.downstreamRequeueTaskItem.findFirst.mockResolvedValue(null);
|
||||
mock.cmppDownstreamConnection.count.mockResolvedValue(1);
|
||||
await expect(service['processItem']('item-1', 'd-1', 'delivered')).resolves.toBe('waiting');
|
||||
expect(requeue).toHaveBeenCalledWith('d-1');
|
||||
expect(mock.downstreamRequeueTaskItem.update).toHaveBeenCalledWith(expect.objectContaining({ data: expect.objectContaining({ status: 'waiting_ack' }) }));
|
||||
});
|
||||
|
||||
it('does not replay a record that became delivered after a non-delivered task snapshot', async () => {
|
||||
const requeue = jest.fn();
|
||||
service = new SendDownstreamRequeueTaskService(mock as never, { requeueDownstreamDelivery: requeue });
|
||||
mock.cmppDownstreamDelivery.findUnique.mockResolvedValue({ id: 'd-1', applicationId: 'app-1', status: 'delivered', ackResult: 0, payload: {}, deliveryType: 'receipt', application: { status: 'active', interfaceEnabled: true } });
|
||||
await expect(service['processItem']('item-1', 'd-1', 'failed')).resolves.toBe('skipped');
|
||||
expect(requeue).not.toHaveBeenCalled();
|
||||
expect(mock.downstreamRequeueTaskItem.update).toHaveBeenCalledWith(expect.objectContaining({ data: expect.objectContaining({ status: 'skipped', skipReason: '创建任务后已被客户确认' }) }));
|
||||
});
|
||||
|
||||
it('paginates all task items with status and keyword filters', async () => {
|
||||
mock.downstreamRequeueTask.findUnique.mockResolvedValue({ id: 'task-1' });
|
||||
mock.downstreamRequeueTaskItem.findMany.mockResolvedValue([{ id: 'item-1' }]);
|
||||
|
||||
Reference in New Issue
Block a user