

























@@ -1,22 +1,23 @@
11import { afterEach, describe, expect, it, vi } from "vitest";
2-import { TwilioApiError, twilioApiRequest } from "./api.js";
324-const apiMocks = vi.hoisted(() => ({
5-fetchWithSsrFGuard: vi.fn(),
3+const { fetchWithSsrFGuardMock } = vi.hoisted(() => ({
4+fetchWithSsrFGuardMock: vi.fn(),
65}));
768-vi.mock("openclaw/plugin-sdk/ssrf-runtime", () => ({
9-fetchWithSsrFGuard: apiMocks.fetchWithSsrFGuard,
7+vi.mock("../../../api.js", () => ({
8+fetchWithSsrFGuard: fetchWithSsrFGuardMock,
109}));
111011+import { TwilioApiError, twilioApiRequest } from "./api.js";
12+1213describe("twilioApiRequest", () => {
1314afterEach(() => {
14-apiMocks.fetchWithSsrFGuard.mockReset();
15+fetchWithSsrFGuardMock.mockReset();
1516});
16171718it("posts form bodies with basic auth and parses json", async () => {
1819const release = vi.fn(async () => {});
19-apiMocks.fetchWithSsrFGuard.mockResolvedValue({
20+fetchWithSsrFGuardMock.mockResolvedValue({
2021response: new Response(JSON.stringify({ sid: "CA123" }), { status: 200 }),
2122 release,
2223});
@@ -34,10 +35,12 @@ describe("twilioApiRequest", () => {
3435}),
3536).resolves.toEqual({ sid: "CA123" });
363737-const [{ url, init, auditContext, policy }] = apiMocks.fetchWithSsrFGuard.mock.calls[0] ?? [];
38+const [{ url, init, auditContext, policy, timeoutMs }] =
39+fetchWithSsrFGuardMock.mock.calls[0] ?? [];
3840expect(url).toBe("https://api.twilio.com/Calls.json");
3941expect(auditContext).toBe("voice-call.twilio.api");
4042expect(policy).toEqual({ allowedHostnames: ["api.twilio.com"] });
43+expect(timeoutMs).toBe(30_000);
4144expect(init).toEqual(
4245expect.objectContaining({
4346method: "POST",
@@ -63,7 +66,7 @@ describe("twilioApiRequest", () => {
6366new Response("missing", { status: 404 }),
6467];
6568const release = vi.fn(async () => {});
66-apiMocks.fetchWithSsrFGuard.mockImplementation(async () => ({
69+fetchWithSsrFGuardMock.mockImplementation(async () => ({
6770response: responses.shift()!,
6871 release,
6972}));
@@ -93,7 +96,7 @@ describe("twilioApiRequest", () => {
93969497it("throws twilio api errors for non-ok responses", async () => {
9598const release = vi.fn(async () => {});
96-apiMocks.fetchWithSsrFGuard.mockResolvedValue({
99+fetchWithSsrFGuardMock.mockResolvedValue({
97100response: new Response("bad request", { status: 400 }),
98101 release,
99102});
@@ -112,7 +115,7 @@ describe("twilioApiRequest", () => {
112115113116it("exposes structured Twilio error codes from json error bodies", async () => {
114117const release = vi.fn(async () => {});
115-apiMocks.fetchWithSsrFGuard.mockResolvedValue({
118+fetchWithSsrFGuardMock.mockResolvedValue({
116119response: new Response(
117120JSON.stringify({
118121code: 21220,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。