
































@@ -8,6 +8,17 @@ type CreateFeishuWSClient = typeof import("./client.js").createFeishuWSClient;
88type ClearClientCache = typeof import("./client.js").clearClientCache;
99type SetFeishuClientRuntimeForTest = typeof import("./client.js").setFeishuClientRuntimeForTest;
101011+const requestInterceptorState = vi.hoisted(() => {
12+let registered: ((req: unknown) => unknown) | undefined;
13+return {
14+get registered() {
15+return registered;
16+},
17+use: vi.fn((fn: (req: unknown) => unknown) => {
18+registered = fn;
19+}),
20+};
21+});
1122const clientCtorMock = vi.hoisted(() =>
1223vi.fn(function clientCtor() {
1324return { connected: true };
@@ -23,16 +34,31 @@ const proxyAgentCtorMock = vi.hoisted(() =>
2334return { proxied: true };
2435}),
2536);
26-const mockBaseHttpInstance = vi.hoisted(() => ({
27-request: vi.fn().mockResolvedValue({}),
28-get: vi.fn().mockResolvedValue({}),
29-post: vi.fn().mockResolvedValue({}),
30-put: vi.fn().mockResolvedValue({}),
31-patch: vi.fn().mockResolvedValue({}),
32-delete: vi.fn().mockResolvedValue({}),
33-head: vi.fn().mockResolvedValue({}),
34-options: vi.fn().mockResolvedValue({}),
35-}));
37+const mockBaseHttpInstance = vi.hoisted(() => {
38+const requestInterceptors = { use: requestInterceptorState.use };
39+Object.defineProperty(requestInterceptors, "handlers", {
40+configurable: true,
41+get() {
42+throw new Error("Do not read axios private interceptor handlers");
43+},
44+set() {
45+throw new Error("Do not write axios private interceptor handlers");
46+},
47+});
48+return {
49+request: vi.fn().mockResolvedValue({}),
50+get: vi.fn().mockResolvedValue({}),
51+post: vi.fn().mockResolvedValue({}),
52+put: vi.fn().mockResolvedValue({}),
53+patch: vi.fn().mockResolvedValue({}),
54+delete: vi.fn().mockResolvedValue({}),
55+head: vi.fn().mockResolvedValue({}),
56+options: vi.fn().mockResolvedValue({}),
57+interceptors: {
58+request: requestInterceptors,
59+},
60+};
61+});
3662const proxyEnvKeys = ["https_proxy", "HTTPS_PROXY", "http_proxy", "HTTP_PROXY"] as const;
3763type ProxyEnvKey = (typeof proxyEnvKeys)[number];
3864const registerFeishuDocToolsMock = vi.hoisted(() => vi.fn());
@@ -52,6 +78,7 @@ let setFeishuClientRuntimeForTest: SetFeishuClientRuntimeForTest;
5278let FEISHU_HTTP_TIMEOUT_MS: number;
5379let FEISHU_HTTP_TIMEOUT_MAX_MS: number;
5480let FEISHU_HTTP_TIMEOUT_ENV_VAR: string;
81+let FEISHU_USER_AGENT: string;
55825683let priorProxyEnv: Partial<Record<ProxyEnvKey, string | undefined>> = {};
5784let priorFeishuTimeoutEnv: string | undefined;
@@ -179,6 +206,7 @@ beforeAll(async () => {
179206FEISHU_HTTP_TIMEOUT_MS,
180207FEISHU_HTTP_TIMEOUT_MAX_MS,
181208FEISHU_HTTP_TIMEOUT_ENV_VAR,
209+FEISHU_USER_AGENT,
182210} = await import("./client.js"));
183211});
184212@@ -240,6 +268,26 @@ afterAll(() => {
240268vi.resetModules();
241269});
242270271+describe("Feishu default User-Agent interceptor", () => {
272+it("registers through the public interceptor API and overrides the SDK User-Agent", () => {
273+expect(requestInterceptorState.registered).toBeTypeOf("function");
274+275+const req = { headers: { "User-Agent": "oapi-node-sdk/1.0.0" } };
276+expect(requestInterceptorState.registered?.(req)).toBe(req);
277+278+expect(req.headers["User-Agent"]).toBe(FEISHU_USER_AGENT);
279+});
280+281+it("sets the User-Agent on AxiosHeaders-like request headers", () => {
282+const headers = { set: vi.fn() };
283+const req = { headers };
284+285+expect(requestInterceptorState.registered?.(req)).toBe(req);
286+287+expect(headers.set).toHaveBeenCalledWith("User-Agent", FEISHU_USER_AGENT);
288+});
289+});
290+243291describe("createFeishuClient HTTP timeout", () => {
244292const readLastClientHttpInstance = (): HttpInstanceLike =>
245293requireHttpInstance(readCallOptions(clientCtorMock).httpInstance);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。