defaultTimeout("15s");
let caller;
let callee;
let target;
setup(() => {
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"),
});
target = new Agent("Target", {
username: env("C_USER"),
domain,
password: env("C_PASS"),
});
});
teardown(() => caller.hangup());
scenario("blind transfer connects caller and target", async () => {
for (const a of [caller, callee, target]) a.register();
await Promise.all([
until(() => expect(caller.registered).toBeTruthy(), "10s"),
until(() => expect(callee.registered).toBeTruthy(), "10s"),
until(() => expect(target.registered).toBeTruthy(), "10s"),
]);
caller.dial(callee);
await until(() => expect(callee.state).toBe(State.Ringing));
callee.accept();
await Promise.all([
until(() => expect(caller.state).toBe(State.Established)),
until(() => expect(callee.state).toBe(State.Established)),
]);
callee.transfer(target);
await until(() => expect(target.state).toBe(State.Ringing));
log("Target's incoming caller: " + target.peer?.number);
target.accept();
await Promise.all([
until(() => expect(caller.state).toBe(State.Established)),
until(() => expect(target.state).toBe(State.Established)),
until(() => expect(callee.state).toBe(State.Idle), "10s"),
]);
await verifyAudioConnection(caller, target);
await wait(3); caller.hangup();
await Promise.all([
until(() => expect(caller.state).toBe(State.Idle), "10s"),
until(() => expect(target.state).toBe(State.Idle), "10s"),
]);
});