@@ -7,6 +7,17 @@ type CreateFeishuWSClient = typeof import("./client.js").createFeishuWSClient;
77type ClearClientCache = typeof import ( "./client.js" ) . clearClientCache ;
88type SetFeishuClientRuntimeForTest = typeof import ( "./client.js" ) . setFeishuClientRuntimeForTest ;
99
10+ const requestInterceptorState = vi . hoisted ( ( ) => {
11+ let registered : ( ( req : unknown ) => unknown ) | undefined ;
12+ return {
13+ get registered ( ) {
14+ return registered ;
15+ } ,
16+ use : vi . fn ( ( fn : ( req : unknown ) => unknown ) => {
17+ registered = fn ;
18+ } ) ,
19+ } ;
20+ } ) ;
1021const clientCtorMock = vi . hoisted ( ( ) =>
1122 vi . fn ( function clientCtor ( ) {
1223 return { connected : true } ;
@@ -22,16 +33,31 @@ const proxyAgentCtorMock = vi.hoisted(() =>
2233 return { proxied : true } ;
2334 } ) ,
2435) ;
25- const mockBaseHttpInstance = vi . hoisted ( ( ) => ( {
26- request : vi . fn ( ) . mockResolvedValue ( { } ) ,
27- get : vi . fn ( ) . mockResolvedValue ( { } ) ,
28- post : vi . fn ( ) . mockResolvedValue ( { } ) ,
29- put : vi . fn ( ) . mockResolvedValue ( { } ) ,
30- patch : vi . fn ( ) . mockResolvedValue ( { } ) ,
31- delete : vi . fn ( ) . mockResolvedValue ( { } ) ,
32- head : vi . fn ( ) . mockResolvedValue ( { } ) ,
33- options : vi . fn ( ) . mockResolvedValue ( { } ) ,
34- } ) ) ;
36+ const mockBaseHttpInstance = vi . hoisted ( ( ) => {
37+ const requestInterceptors = { use : requestInterceptorState . use } ;
38+ Object . defineProperty ( requestInterceptors , "handlers" , {
39+ configurable : true ,
40+ get ( ) {
41+ throw new Error ( "Do not read axios private interceptor handlers" ) ;
42+ } ,
43+ set ( ) {
44+ throw new Error ( "Do not write axios private interceptor handlers" ) ;
45+ } ,
46+ } ) ;
47+ return {
48+ request : vi . fn ( ) . mockResolvedValue ( { } ) ,
49+ get : vi . fn ( ) . mockResolvedValue ( { } ) ,
50+ post : vi . fn ( ) . mockResolvedValue ( { } ) ,
51+ put : vi . fn ( ) . mockResolvedValue ( { } ) ,
52+ patch : vi . fn ( ) . mockResolvedValue ( { } ) ,
53+ delete : vi . fn ( ) . mockResolvedValue ( { } ) ,
54+ head : vi . fn ( ) . mockResolvedValue ( { } ) ,
55+ options : vi . fn ( ) . mockResolvedValue ( { } ) ,
56+ interceptors : {
57+ request : requestInterceptors ,
58+ } ,
59+ } ;
60+ } ) ;
3561const proxyEnvKeys = [ "https_proxy" , "HTTPS_PROXY" , "http_proxy" , "HTTP_PROXY" ] as const ;
3662type ProxyEnvKey = ( typeof proxyEnvKeys ) [ number ] ;
3763const registerFeishuDocToolsMock = vi . hoisted ( ( ) => vi . fn ( ) ) ;
@@ -51,6 +77,7 @@ let setFeishuClientRuntimeForTest: SetFeishuClientRuntimeForTest;
5177let FEISHU_HTTP_TIMEOUT_MS : number ;
5278let FEISHU_HTTP_TIMEOUT_MAX_MS : number ;
5379let FEISHU_HTTP_TIMEOUT_ENV_VAR : string ;
80+ let FEISHU_USER_AGENT : string ;
5481
5582let priorProxyEnv : Partial < Record < ProxyEnvKey , string | undefined > > = { } ;
5683let priorFeishuTimeoutEnv : string | undefined ;
@@ -178,6 +205,7 @@ beforeAll(async () => {
178205 FEISHU_HTTP_TIMEOUT_MS ,
179206 FEISHU_HTTP_TIMEOUT_MAX_MS ,
180207 FEISHU_HTTP_TIMEOUT_ENV_VAR ,
208+ FEISHU_USER_AGENT ,
181209 } = await import ( "./client.js" ) ) ;
182210} ) ;
183211
@@ -239,6 +267,26 @@ afterAll(() => {
239267 vi . resetModules ( ) ;
240268} ) ;
241269
270+ describe ( "Feishu default User-Agent interceptor" , ( ) => {
271+ it ( "registers through the public interceptor API and overrides the SDK User-Agent" , ( ) => {
272+ expect ( requestInterceptorState . registered ) . toBeTypeOf ( "function" ) ;
273+
274+ const req = { headers : { "User-Agent" : "oapi-node-sdk/1.0.0" } } ;
275+ expect ( requestInterceptorState . registered ?.( req ) ) . toBe ( req ) ;
276+
277+ expect ( req . headers [ "User-Agent" ] ) . toBe ( FEISHU_USER_AGENT ) ;
278+ } ) ;
279+
280+ it ( "sets the User-Agent on AxiosHeaders-like request headers" , ( ) => {
281+ const headers = { set : vi . fn ( ) } ;
282+ const req = { headers } ;
283+
284+ expect ( requestInterceptorState . registered ?.( req ) ) . toBe ( req ) ;
285+
286+ expect ( headers . set ) . toHaveBeenCalledWith ( "User-Agent" , FEISHU_USER_AGENT ) ;
287+ } ) ;
288+ } ) ;
289+
242290describe ( "createFeishuClient HTTP timeout" , ( ) => {
243291 const readLastClientHttpInstance = ( ) : HttpInstanceLike =>
244292 requireHttpInstance ( readCallOptions ( clientCtorMock ) . httpInstance ) ;
0 commit comments