Read a valueless count as unstated, and pin a CRLF receipt end to end

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Csos3Vfm66NrAywQUe3e4V
This commit is contained in:
2026-09-01 21:48:07 +02:00
parent 0fd6da1542
commit f10c8e58cb
2 changed files with 5 additions and 3 deletions
+3 -2
View File
@@ -66,12 +66,13 @@ const patterns = {
stat: field('stat'), stat: field('stat'),
sub: field('sub'), sub: field('sub'),
submitDate: field('submit date'), submitDate: field('submit date'),
// The last field, and the only one that may hold a space: it carries the message's own start. // The one field that may hold a space, carrying the message's own start, so it ends at its line.
text: /\btext:([^\r\n]*)/i, text: /\btext:([^\r\n]*)/i,
}; };
function toNumber(value: string | undefined): number | undefined { function toNumber(value: string | undefined): number | undefined {
if (value === undefined) return undefined; // Number('') is 0, which would report a receipt that stated no count as one that stated none sent.
if (value === undefined || value === '') return undefined;
const parsed = Number(value); const parsed = Number(value);
+2 -1
View File
@@ -61,7 +61,7 @@ describe('parseReceipt()', () => {
}); });
test('leaves absent fields undefined rather than guessing', () => { test('leaves absent fields undefined rather than guessing', () => {
const receipt = parseReceipt('id:abc stat:UNDELIV'); const receipt = parseReceipt('id:abc sub: stat:UNDELIV');
assert.equal(receipt.id, 'abc'); assert.equal(receipt.id, 'abc');
assert.equal(receipt.stat, 'UNDELIV'); assert.equal(receipt.stat, 'UNDELIV');
@@ -94,6 +94,7 @@ describe('dlrFromPdu()', () => {
assert.equal(dlr.statusId, 2); assert.equal(dlr.statusId, 2);
assert.equal(dlr.errorCode, '000'); assert.equal(dlr.errorCode, '000');
assert.equal(dlr.doneDate?.toISOString(), '2025-08-25T14:31:00.000Z'); assert.equal(dlr.doneDate?.toISOString(), '2025-08-25T14:31:00.000Z');
assert.equal(dlrFromPdu(deliverSm('id:beef-1\r\nstat:DELIVRD'))?.smsId, 'beef-1');
}); });
test('maps every spec status code back to its message state and id', () => { test('maps every spec status code back to its message state and id', () => {