fix: correlate downstream receipts with submit responses
This commit is contained in:
@@ -551,15 +551,20 @@ describe('SendChainService', () => {
|
||||
account: '100001',
|
||||
phoneNumber: '13800000001',
|
||||
content: 'unreported content',
|
||||
sequenceId: 1216579149,
|
||||
remoteIp: '127.0.0.1',
|
||||
})).resolves.toEqual(expect.objectContaining({ accepted: true, messageRecordId: 'record-1' }));
|
||||
|
||||
expect(prisma.smsMessageRecord.create).toHaveBeenCalledWith({
|
||||
data: expect.objectContaining({ cmppSubmitSequenceId: '1216579149' }),
|
||||
});
|
||||
|
||||
expect(prisma.smsReceiptRecord.create).toHaveBeenCalledWith({
|
||||
data: expect.objectContaining({ receiptStatus: 'undelivered', rawStatus: 'REJECTD', errorCode: 'TEMPLATE' }),
|
||||
});
|
||||
expect(service['postGatewayControl']).toHaveBeenCalledWith(
|
||||
'/downstream/receipt',
|
||||
expect.objectContaining({ receiptStatus: 'undelivered', rawStatus: 'REJECTD', errorCode: 'TEMPLATE' }),
|
||||
expect.objectContaining({ receiptStatus: 'undelivered', rawStatus: 'REJECTD', errorCode: 'TEMPLATE', submitSequenceId: 1216579149 }),
|
||||
);
|
||||
expect(riskReview.aggregateTemplateMismatch).not.toHaveBeenCalled();
|
||||
});
|
||||
@@ -1484,6 +1489,29 @@ describe('SendChainService', () => {
|
||||
}));
|
||||
});
|
||||
|
||||
it('does not treat Result=0 with Msg_Id=0 as a business acknowledgement', async () => {
|
||||
const { service, prisma } = createService();
|
||||
|
||||
await service.acknowledgeDownstreamDelivery({
|
||||
id: 'delivery-1',
|
||||
connectionId: 'conn-1',
|
||||
sequenceId: '91',
|
||||
messageId: '0',
|
||||
result: 0,
|
||||
acknowledgedAt: '2026-07-14T07:07:49.336Z',
|
||||
});
|
||||
|
||||
expect(prisma.cmppDownstreamDelivery.updateMany).toHaveBeenCalledWith(expect.objectContaining({
|
||||
data: expect.objectContaining({ ackResult: 0, ackMessageId: '0' }),
|
||||
}));
|
||||
expect(prisma.cmppDownstreamDelivery.update).toHaveBeenCalledWith(expect.objectContaining({
|
||||
data: expect.objectContaining({ status: 'pending', lastError: expect.stringContaining('Msg_Id=0') }),
|
||||
}));
|
||||
expect(prisma.cmppDownstreamDelivery.updateMany).not.toHaveBeenCalledWith(expect.objectContaining({
|
||||
data: expect.objectContaining({ status: 'delivered' }),
|
||||
}));
|
||||
});
|
||||
|
||||
it('does not automatically retry an unacknowledged delivery when its policy snapshot is disabled', async () => {
|
||||
const { service, prisma } = createService();
|
||||
prisma.cmppDownstreamDelivery.findUnique.mockResolvedValue({
|
||||
@@ -1564,6 +1592,15 @@ describe('SendChainService', () => {
|
||||
resourceId: 'delivery-1',
|
||||
}),
|
||||
});
|
||||
expect(prisma.cmppDownstreamDelivery.update).toHaveBeenCalledWith(expect.objectContaining({
|
||||
data: expect.objectContaining({
|
||||
status: 'pending',
|
||||
acknowledgedAt: null,
|
||||
ackResult: null,
|
||||
ackMessageId: null,
|
||||
deliveredAt: null,
|
||||
}),
|
||||
}));
|
||||
});
|
||||
|
||||
it('supports batch requeue of downstream deliveries', async () => {
|
||||
|
||||
Reference in New Issue
Block a user