131 lines
4.2 KiB
TypeScript
131 lines
4.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { VoiceCallConfigSchema } from "./config.js";
|
|
import { CallManager } from "./manager.js";
|
|
import {
|
|
createTestStorePath,
|
|
FakeProvider,
|
|
makePersistedCall,
|
|
writeCallsToStore,
|
|
} from "./manager.test-harness.js";
|
|
|
|
describe("CallManager verification on restore", () => {
|
|
it("skips stale calls reported terminal by provider", async () => {
|
|
const storePath = createTestStorePath();
|
|
const call = makePersistedCall();
|
|
writeCallsToStore(storePath, [call]);
|
|
|
|
const provider = new FakeProvider();
|
|
provider.getCallStatusResult = { status: "completed", isTerminal: true };
|
|
|
|
const config = VoiceCallConfigSchema.parse({
|
|
enabled: true,
|
|
provider: "plivo",
|
|
fromNumber: "+15550000000",
|
|
});
|
|
const manager = new CallManager(config, storePath);
|
|
await manager.initialize(provider, "https://example.com/voice/webhook");
|
|
|
|
expect(manager.getActiveCalls()).toHaveLength(0);
|
|
});
|
|
|
|
it("keeps calls reported active by provider", async () => {
|
|
const storePath = createTestStorePath();
|
|
const call = makePersistedCall();
|
|
writeCallsToStore(storePath, [call]);
|
|
|
|
const provider = new FakeProvider();
|
|
provider.getCallStatusResult = { status: "in-progress", isTerminal: false };
|
|
|
|
const config = VoiceCallConfigSchema.parse({
|
|
enabled: true,
|
|
provider: "plivo",
|
|
fromNumber: "+15550000000",
|
|
});
|
|
const manager = new CallManager(config, storePath);
|
|
await manager.initialize(provider, "https://example.com/voice/webhook");
|
|
|
|
expect(manager.getActiveCalls()).toHaveLength(1);
|
|
expect(manager.getActiveCalls()[0]?.callId).toBe(call.callId);
|
|
});
|
|
|
|
it("keeps calls when provider returns unknown (transient error)", async () => {
|
|
const storePath = createTestStorePath();
|
|
const call = makePersistedCall();
|
|
writeCallsToStore(storePath, [call]);
|
|
|
|
const provider = new FakeProvider();
|
|
provider.getCallStatusResult = { status: "error", isTerminal: false, isUnknown: true };
|
|
|
|
const config = VoiceCallConfigSchema.parse({
|
|
enabled: true,
|
|
provider: "plivo",
|
|
fromNumber: "+15550000000",
|
|
});
|
|
const manager = new CallManager(config, storePath);
|
|
await manager.initialize(provider, "https://example.com/voice/webhook");
|
|
|
|
expect(manager.getActiveCalls()).toHaveLength(1);
|
|
});
|
|
|
|
it("skips calls older than maxDurationSeconds", async () => {
|
|
const storePath = createTestStorePath();
|
|
const call = makePersistedCall({
|
|
startedAt: Date.now() - 600_000,
|
|
answeredAt: Date.now() - 590_000,
|
|
});
|
|
writeCallsToStore(storePath, [call]);
|
|
|
|
const provider = new FakeProvider();
|
|
|
|
const config = VoiceCallConfigSchema.parse({
|
|
enabled: true,
|
|
provider: "plivo",
|
|
fromNumber: "+15550000000",
|
|
maxDurationSeconds: 300,
|
|
});
|
|
const manager = new CallManager(config, storePath);
|
|
await manager.initialize(provider, "https://example.com/voice/webhook");
|
|
|
|
expect(manager.getActiveCalls()).toHaveLength(0);
|
|
});
|
|
|
|
it("skips calls without providerCallId", async () => {
|
|
const storePath = createTestStorePath();
|
|
const call = makePersistedCall({ providerCallId: undefined, state: "initiated" });
|
|
writeCallsToStore(storePath, [call]);
|
|
|
|
const provider = new FakeProvider();
|
|
|
|
const config = VoiceCallConfigSchema.parse({
|
|
enabled: true,
|
|
provider: "plivo",
|
|
fromNumber: "+15550000000",
|
|
});
|
|
const manager = new CallManager(config, storePath);
|
|
await manager.initialize(provider, "https://example.com/voice/webhook");
|
|
|
|
expect(manager.getActiveCalls()).toHaveLength(0);
|
|
});
|
|
|
|
it("keeps call when getCallStatus throws (verification failure)", async () => {
|
|
const storePath = createTestStorePath();
|
|
const call = makePersistedCall();
|
|
writeCallsToStore(storePath, [call]);
|
|
|
|
const provider = new FakeProvider();
|
|
provider.getCallStatus = async () => {
|
|
throw new Error("network failure");
|
|
};
|
|
|
|
const config = VoiceCallConfigSchema.parse({
|
|
enabled: true,
|
|
provider: "plivo",
|
|
fromNumber: "+15550000000",
|
|
});
|
|
const manager = new CallManager(config, storePath);
|
|
await manager.initialize(provider, "https://example.com/voice/webhook");
|
|
|
|
expect(manager.getActiveCalls()).toHaveLength(1);
|
|
});
|
|
});
|