68 lines
1.9 KiB
TypeScript
68 lines
1.9 KiB
TypeScript
import fs from "node:fs/promises";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
|
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
|
|
vi.mock("../globals.js", () => ({
|
|
isVerbose: () => false,
|
|
logVerbose: vi.fn(),
|
|
shouldLogVerbose: () => false,
|
|
}));
|
|
|
|
vi.mock("../process/exec.js", () => ({
|
|
runExec: vi.fn(),
|
|
}));
|
|
|
|
const runtime = {
|
|
error: vi.fn(),
|
|
};
|
|
|
|
describe("transcribeInboundAudio", () => {
|
|
afterEach(() => {
|
|
vi.resetAllMocks();
|
|
vi.unstubAllGlobals();
|
|
});
|
|
|
|
it("downloads mediaUrl to temp file and returns transcript", async () => {
|
|
const tmpBuf = Buffer.from("audio-bytes");
|
|
const tmpFile = path.join(os.tmpdir(), `clawdbot-audio-${Date.now()}.ogg`);
|
|
await fs.writeFile(tmpFile, tmpBuf);
|
|
|
|
const fetchMock = vi.fn(async () => ({
|
|
ok: true,
|
|
status: 200,
|
|
arrayBuffer: async () => tmpBuf,
|
|
})) as unknown as typeof fetch;
|
|
vi.stubGlobal("fetch", fetchMock);
|
|
|
|
const cfg = {
|
|
tools: {
|
|
audio: {
|
|
transcription: {
|
|
args: ["echo", "{{MediaPath}}"],
|
|
timeoutSeconds: 5,
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ctx = { MediaUrl: "https://example.com/audio.ogg" };
|
|
|
|
const execModule = await import("../process/exec.js");
|
|
vi.mocked(execModule.runExec).mockResolvedValue({
|
|
stdout: "transcribed text\n",
|
|
stderr: "",
|
|
});
|
|
const { transcribeInboundAudio } = await import("./transcription.js");
|
|
const result = await transcribeInboundAudio(cfg as never, ctx as never, runtime as never);
|
|
expect(result?.text).toBe("transcribed text");
|
|
expect(fetchMock).toHaveBeenCalled();
|
|
});
|
|
|
|
it("returns undefined when no transcription command", async () => {
|
|
const { transcribeInboundAudio } = await import("./transcription.js");
|
|
const res = await transcribeInboundAudio({ audio: {} } as never, {} as never, runtime as never);
|
|
expect(res).toBeUndefined();
|
|
});
|
|
});
|