Files
selfphoneng/apps/api/test/asterisk/verified.ts
T
iamdoubz a0121d4975 test: Asterisk upgrade check
verified.ts records what the code relies on Asterisk doing and the version it
was measured on; pnpm test fails while the Dockerfile pins another one.
pnpm test:asterisk-upgrade boots the image next to a TLS provider and lists
every behaviour that moved and what depends on it.
2026-10-28 17:01:26 -05:00

69 lines
2.8 KiB
TypeScript

// SPDX-License-Identifier: AGPL-3.0-or-later
// What the code relies on Asterisk doing, as last measured by upgrade-test.ts, and on which
// version. asterisk-version.test.ts fails when asterisk/Dockerfile pins another version: run
// `pnpm test:asterisk-upgrade` on the new image, act on each change it lists, then update this.
import { readFileSync } from 'node:fs';
export const VERIFIED_ASTERISK = '24.0.0-rc2';
/** The version asterisk/Dockerfile builds. */
export function pinnedAsterisk(): string {
const file = readFileSync(new URL('../../../../asterisk/Dockerfile', import.meta.url), 'utf8');
const v = /^ARG ASTERISK_VERSION=(\S+)$/m.exec(file)?.[1];
if (!v) throw new Error('asterisk/Dockerfile has no ARG ASTERISK_VERSION');
return v;
}
/** `expect`: the answer on VERIFIED_ASTERISK. `where`: what depends on it, to change if it moves. */
export const FACTS = {
riskyModulesGone: {
expect: true,
what: 'app_system, func_shell, app_disa, res_agi and app_externalivr are not loaded',
where: 'asterisk/conf/modules.conf noload lines (08 §6): a renamed module would load again',
},
mwiSubscribeReplaces: {
expect: true,
what: 'endpoints take mwi_subscribe_replaces_unsolicited',
where: 'generator/pjsip.ts: without it a phone that SUBSCRIBEs for MWI gets a 500 (03 §5.2)',
},
setVarKeepsUnderscores: {
expect: true,
what: 'set_var = __SP_DIRECTION=… loads as "__SP_DIRECTION"',
where: 'generator/pjsip.ts set_var lines; dialplan reads SP_DIRECTION on dialed legs (03 §5.2)',
},
staticContactsInShowContacts: {
expect: false,
what: 'PJSIPShowContacts lists static (contact =) AOR contacts',
where: 'live/state.ts reads trunk reachability from PJSIPShowEndpoint instead (04 §5.1)',
},
endpointShowsContactStatus: {
expect: true,
what: 'PJSIPShowEndpoint has a ContactStatusDetail for a static contact',
where: 'live/state.ts trunk reachability (04 §5.1)',
},
voicemailMoveRemove: {
expect: true,
what: 'the AMI actions VoicemailMove and VoicemailRemove exist',
where: 'services/voicemail.ts mark read and delete (04 §5.6)',
},
cdrLinkedId: {
expect: true,
what: 'Cdr AMI events carry LinkedID (cdr_manager.conf mapping)',
where: 'services/cdr.ts groups a call by it (01 §3.15, 04 §5.4)',
},
cdrTimesUtcNoZone: {
expect: true,
what: 'Cdr StartTime is "YYYY-MM-DD HH:MM:SS" in UTC, no zone',
where: 'services/cdr.ts utc() adds the Z itself',
},
tlsQualifyByHostname: {
expect: false,
what: 'a qualify OPTIONS over TLS checks the certificate against the host name, not the IP',
where:
'generator/pjsip.ts sets qualify_frequency = 0 on TLS trunks because of this (08 §2.1); ' +
'24.0.0-rc3 says it fixes it ("Preserve target hostname for qualified OPTIONS destination")',
},
} as const;
export type Fact = keyof typeof FACTS;