Say undefined where the SMSC named no id for a segment it took (#101)
* Cover the ids a send gets back where the SMSC named only some of them * Say undefined where the SMSC named no id for a segment it took * Record why the merger takes the wider type, and de-duplicate the interop narrowing * Guard the numbering hole the merger must refuse, and correct the phase record
This commit is contained in:
@@ -489,6 +489,38 @@ describe('an SMSC that reports each segment under an id of its own', () => {
|
||||
|
||||
assert.equal(sent.err, undefined);
|
||||
assert.equal(smsc.octets.length, 3, 'every segment goes out whatever the peer answers');
|
||||
assert.deepEqual(sent.smsIds, [id, '', '']);
|
||||
assert.deepEqual(sent.smsIds, [id, undefined, undefined]);
|
||||
assert.equal(sent.smsIds.length, sent.pduObjs.length, 'an entry per accepted segment, positional with pduObjs');
|
||||
});
|
||||
|
||||
test('reports the segment that was named and merges nothing where the others were not', async t => {
|
||||
const base = '01a09739-0a98-7ac0-8a9a-fcd3a7648e62';
|
||||
const smsc = await dummySmsc(t, { messageIds: [`${base}-1`] });
|
||||
const session = await bindToSmsc(t, smsc.port);
|
||||
const merged: MessageDlr[] = [];
|
||||
const reported = collect<Dlr>(1, push => { session.on('dlr', push); });
|
||||
|
||||
session.on('messageDlr', report => merged.push(report));
|
||||
|
||||
const sent = await session.sendSms({ dlr: true, message: 'x'.repeat(400), ...message });
|
||||
|
||||
assert.deepEqual(sent.smsIds, [`${base}-1`, undefined, undefined]);
|
||||
smsc.deliver(receiptBody(`${base}-1`));
|
||||
|
||||
const [dlr] = await reported;
|
||||
|
||||
assert.equal(dlr?.smsId, `${base}-1`);
|
||||
assert.deepEqual(merged, [], 'a send with an unnamed segment spells out no message to merge');
|
||||
});
|
||||
});
|
||||
|
||||
describe('an SMSC that answers a submit with no message id at all', () => {
|
||||
test('reads an empty message_id as no id, on a single-segment send as much as a split one', async t => {
|
||||
const smsc = await dummySmsc(t, { messageIds: [] });
|
||||
const session = await bindToSmsc(t, smsc.port);
|
||||
const sent = await session.sendSms({ dlr: true, message: 'one segment', ...message });
|
||||
|
||||
assert.equal(sent.err, undefined);
|
||||
assert.deepEqual(sent.smsIds, [undefined]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -2872,6 +2872,7 @@ describe('message id notation', () => {
|
||||
assert.deepEqual(sent.smsIds, [1, 2].map(part => `${sms.smsId}-${String(part)}`));
|
||||
|
||||
for (const smsId of sent.smsIds) {
|
||||
assert.ok(smsId);
|
||||
await sendReceipt(peerOf(smpp), smsId);
|
||||
}
|
||||
|
||||
|
||||
@@ -2498,11 +2498,18 @@ describe('merged delivery report bounds', () => {
|
||||
test('arms nothing for a send whose ids do not number one message', () => {
|
||||
const dlrMerger = merger();
|
||||
|
||||
dlrMerger.expect(['5cb0ea53b5d61093529174ca44e23871', '', '']);
|
||||
dlrMerger.expect(['5cb0ea53b5d61093529174ca44e23871', undefined, undefined]);
|
||||
assert.equal(dlrMerger.size, 0, 'an id the peer never named numbers nothing');
|
||||
|
||||
dlrMerger.expect(['bf53ad8b-1', '40ccdce2-2']);
|
||||
assert.equal(dlrMerger.size, 0, 'nor do ids numbered off a base each');
|
||||
|
||||
const holed = '01a09739-0a9a-767d-ad1d-1c27667e1ca4';
|
||||
|
||||
// Dropping the unnamed entry rather than passing it through leaves 1 and 3 spelling out a
|
||||
// whole 2-part message, and a send of 3 reports as delivered on two receipts.
|
||||
dlrMerger.expect([`${holed}-1`, undefined, `${holed}-3`]);
|
||||
assert.equal(dlrMerger.size, 0, 'nor does a hole between two parts of one base');
|
||||
});
|
||||
|
||||
// A receipt for whole-3 would otherwise fill the slot whole-2 was registered for, truncating the report.
|
||||
|
||||
Reference in New Issue
Block a user