import { test } from 'node:test'; import assert from 'node:assert/strict'; import { DecryptionFailureCode } from 'matrix-js-sdk/lib/crypto-api'; import { describeDecryptionFailure } from './decryptionReason'; test('every SDK failure code maps to a sentence without the raw code in it', () => { Object.values(DecryptionFailureCode).forEach((code) => { const r = describeDecryptionFailure(code); assert.ok(r.text.length > 10, code); assert.ok(!r.text.includes(code), `raw code leaked for ${code}`); assert.ok(!/[A-Z_]{8,}/.test(r.text), `shouty code-like text for ${code}: ${r.text}`); if (r.action !== 'none') assert.ok(r.actionLabel, `action without label for ${code}`); }); }); test('the fixable cases carry the right action', () => { assert.equal( describeDecryptionFailure(DecryptionFailureCode.HISTORICAL_MESSAGE_NO_KEY_BACKUP).action, 'setup-backup', ); assert.equal( describeDecryptionFailure(DecryptionFailureCode.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED).action, 'verify-session', ); assert.equal( describeDecryptionFailure(DecryptionFailureCode.HISTORICAL_MESSAGE_WORKING_BACKUP).action, 'retry', ); assert.equal( describeDecryptionFailure(DecryptionFailureCode.MEGOLM_KEY_WITHHELD_FOR_UNVERIFIED_DEVICE) .action, 'verify-session', ); assert.equal( describeDecryptionFailure(DecryptionFailureCode.MEGOLM_UNKNOWN_INBOUND_SESSION_ID).action, 'retry', ); assert.equal( describeDecryptionFailure(DecryptionFailureCode.UNKNOWN_SENDER_DEVICE).action, 'none', ); assert.equal(describeDecryptionFailure(undefined).action, 'none'); assert.equal(describeDecryptionFailure('SOMETHING_NEW').text, 'Unable to decrypt this message.'); });