let caller;
let callee;
setup(async () => {
const domain = env("SIP_DOMAIN");
caller = new Agent("Caller", {
username: env("A_USER"),
domain,
password: env("A_PASS"),
});
callee = new Agent("Callee", {
username: env("B_USER"),
domain,
password: env("B_PASS"),
});
caller.register();
callee.register();
await Promise.all([
until(() => expect(caller.registered).toBeTruthy(), "10s"),
until(() => expect(callee.registered).toBeTruthy(), "10s"),
]);
});
teardown(() => caller.hangup());
scenario("answered call", { tags: ["smoke"] }, async () => {
caller.dial(callee);
await until(() => expect(callee.state).toBe(State.Ringing), "15s");
callee.accept();
await until(() => expect(caller.state).toBe(State.Established), "10s");
caller.hangup();
await until(() => expect(caller.state).toBe(State.Idle), "10s");
});
scenario("rejected call", { tags: ["smoke"] }, async () => {
caller.dial(callee);
await until(() => expect(callee.state).toBe(State.Ringing), "15s");
callee.hangup(); await until(() => expect(caller.state).toBe(State.Idle), "10s");
});
scenario("busy callee is rejected with 486", { tags: ["smoke"] }, async () => {
callee.respondIncoming(486, "Busy Here");
caller.dial(callee);
await until(() => expect(caller.statusCode).toBe(486), "10s");
await until(() => expect(caller.state).toBe(State.Idle), "10s");
});
scenario(
"flaky under load",
{ tags: ["slow"], skip: "needs investigation" },
async () => {
caller.dial(callee);
await until(() => expect(callee.state).toBe(State.Ringing), "15s");
},
);
scenario("voicemail deposit", { tags: ["slow"] }, async () => {
if (!env("VOICEMAIL_NUMBER")) skip("VOICEMAIL_NUMBER not configured");
caller.dial(env("VOICEMAIL_NUMBER"));
await until(() => expect(caller.state).toBe(State.Established), "15s");
caller.sendAudio(tone(440));
await wait(2);
caller.hangup();
});