fix: harden upstream and downstream receipt delivery
This commit is contained in:
@@ -4,7 +4,9 @@ import { GatewayEventsController } from './gateway-events.controller';
|
||||
describe('GatewayEventsController protocol logging', () => {
|
||||
const sendChain = {
|
||||
handleSubmitResult: jest.fn(),
|
||||
handleSubmitSegmentResult: jest.fn(),
|
||||
handleReceipt: jest.fn(),
|
||||
intakeReceipt: jest.fn(),
|
||||
};
|
||||
const protocolLogs = {
|
||||
record: jest.fn(),
|
||||
@@ -30,6 +32,51 @@ describe('GatewayEventsController protocol logging', () => {
|
||||
expect(protocolLogs.record).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('persists each supplier segment response without adding a duplicate protocol log', async () => {
|
||||
sendChain.handleSubmitSegmentResult.mockResolvedValue({ accepted: true });
|
||||
const body = {
|
||||
messageId: 'MSG-LONG-1',
|
||||
channelId: 'channel-1',
|
||||
submitId: 'submit-1',
|
||||
segmentIndex: 2,
|
||||
segmentTotal: 3,
|
||||
gatewayMessageId: '456',
|
||||
sequenceId: 8,
|
||||
submitStatus: 'accepted' as const,
|
||||
};
|
||||
|
||||
await expect(controller.submitSegmentResult(body)).resolves.toEqual({ accepted: true });
|
||||
expect(sendChain.handleSubmitSegmentResult).toHaveBeenCalledWith(body);
|
||||
expect(protocolLogs.record).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('logs a supplier receipt only after it is durably accepted by the inbox', async () => {
|
||||
sendChain.intakeReceipt.mockResolvedValue({ accepted: true, inboxId: 'inbox-1', status: 'pending' });
|
||||
const body = {
|
||||
messageId: 'receipt-456',
|
||||
channelId: 'channel-1',
|
||||
connectionId: 'channel-1:0',
|
||||
gatewayMessageId: '456',
|
||||
phoneNumber: '13127620092',
|
||||
receiptStatus: 'undelivered' as const,
|
||||
rawStatus: 'UNDELIV',
|
||||
};
|
||||
|
||||
await expect(controller.receiptIntake(body)).resolves.toEqual({
|
||||
accepted: true,
|
||||
inboxId: 'inbox-1',
|
||||
status: 'pending',
|
||||
});
|
||||
expect(protocolLogs.record).toHaveBeenCalledWith(expect.objectContaining({
|
||||
direction: 'channel_to_platform',
|
||||
eventType: 'deliver_receipt',
|
||||
channelId: 'channel-1',
|
||||
messageId: 'receipt-456',
|
||||
gatewayMessageId: '456',
|
||||
status: 'success',
|
||||
}));
|
||||
});
|
||||
|
||||
it('accepts only safe outbound Gateway packet events', () => {
|
||||
expect(controller.protocolLog({
|
||||
protocol: 'cmpp',
|
||||
|
||||
Reference in New Issue
Block a user