fix(backend): stop showing the clinician null, NaN and the wrong failure
Two ways a voice failure described itself wrongly. describe() built the quoted-back text from fields that are all nullable on the wire, and toVoiceIntent casts rather than checks — so a half-classified deadline rendered as “null null” — not a usable date, and an offset with no amount as “+NaN day”. Blank is already handled by the sheet; it now falls back to that. The DTO's constraints resolved to unrelated codes: maxLength fell through to VALIDATION_FIELD_REQUIRED, so an oversized recording said a field was missing, and isIn maps to VALIDATION_LANGUAGE_INVALID, so an unsupported container said the language was invalid. Both now name their own code — the validation factory already returns a message verbatim when it is itself a known ErrorCode, so this needs no change to the shared mapping. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -346,3 +346,40 @@ describe('resolveDueDate', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('what an unresolvable deadline quotes back', () => {
|
||||
// The wire shape allows nulls in every field and toVoiceIntent casts rather than
|
||||
// checks, so these reach the resolver intact. The sheet renders `spoken` verbatim.
|
||||
it('never puts "null" or "NaN" in front of the clinician', () => {
|
||||
const bad = [
|
||||
{ kind: 'weekday', weekday: null, which: null },
|
||||
{ kind: 'offset', unit: null, amount: null },
|
||||
{ kind: 'offset', unit: 'day', amount: Number.NaN },
|
||||
{ kind: 'jalali', jy: null, jm: 7, jd: 25 },
|
||||
{ kind: 'gregorian', y: 2026, m: null, d: null },
|
||||
];
|
||||
for (const intent of bad) {
|
||||
const result = resolveDueDate(
|
||||
intent as unknown as DueIntent,
|
||||
SATURDAY,
|
||||
FA_WEEK,
|
||||
);
|
||||
expect(result.dueDate).toBeNull();
|
||||
expect(result.unresolved?.spoken ?? '').not.toMatch(/null|NaN/);
|
||||
}
|
||||
});
|
||||
|
||||
it('still quotes a deadline it did understand the words of', () => {
|
||||
const result = resolveDueDate(
|
||||
{
|
||||
kind: 'weekday',
|
||||
weekday: 'thursday',
|
||||
which: null,
|
||||
} as unknown as DueIntent,
|
||||
SATURDAY,
|
||||
FA_WEEK,
|
||||
);
|
||||
// A weekday with no "this/next" resolves, so nothing is quoted back at all.
|
||||
expect(result.dueDate).not.toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user