mirror of https://github.com/openclaw/openclaw.git
63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import { resolveDiscordRestFetch } from "./rest-fetch.js";
|
|
|
|
const { undiciFetchMock, proxyAgentSpy } = vi.hoisted(() => ({
|
|
undiciFetchMock: vi.fn(),
|
|
proxyAgentSpy: vi.fn(),
|
|
}));
|
|
|
|
vi.mock("undici", () => {
|
|
class ProxyAgent {
|
|
proxyUrl: string;
|
|
constructor(proxyUrl: string) {
|
|
if (proxyUrl === "bad-proxy") {
|
|
throw new Error("bad proxy");
|
|
}
|
|
this.proxyUrl = proxyUrl;
|
|
proxyAgentSpy(proxyUrl);
|
|
}
|
|
}
|
|
return {
|
|
ProxyAgent,
|
|
fetch: undiciFetchMock,
|
|
};
|
|
});
|
|
|
|
describe("resolveDiscordRestFetch", () => {
|
|
it("uses undici proxy fetch when a proxy URL is configured", async () => {
|
|
const runtime = {
|
|
log: vi.fn(),
|
|
error: vi.fn(),
|
|
exit: vi.fn(),
|
|
} as const;
|
|
undiciFetchMock.mockClear().mockResolvedValue(new Response("ok", { status: 200 }));
|
|
proxyAgentSpy.mockClear();
|
|
const fetcher = resolveDiscordRestFetch("http://proxy.test:8080", runtime);
|
|
|
|
await fetcher("https://discord.com/api/v10/oauth2/applications/@me");
|
|
|
|
expect(proxyAgentSpy).toHaveBeenCalledWith("http://proxy.test:8080");
|
|
expect(undiciFetchMock).toHaveBeenCalledWith(
|
|
"https://discord.com/api/v10/oauth2/applications/@me",
|
|
expect.objectContaining({
|
|
dispatcher: expect.objectContaining({ proxyUrl: "http://proxy.test:8080" }),
|
|
}),
|
|
);
|
|
expect(runtime.log).toHaveBeenCalledWith("discord: rest proxy enabled");
|
|
expect(runtime.error).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("falls back to global fetch when proxy URL is invalid", async () => {
|
|
const runtime = {
|
|
log: vi.fn(),
|
|
error: vi.fn(),
|
|
exit: vi.fn(),
|
|
} as const;
|
|
const fetcher = resolveDiscordRestFetch("bad-proxy", runtime);
|
|
|
|
expect(fetcher).toBe(fetch);
|
|
expect(runtime.error).toHaveBeenCalled();
|
|
expect(runtime.log).not.toHaveBeenCalled();
|
|
});
|
|
});
|