11/**
22 * @vitest -environment node
33 */
4- import { afterEach , beforeEach , describe , expect , it , vi } from 'vitest'
4+ import { beforeEach , describe , expect , it , vi } from 'vitest'
55
6- const { mockAgent, mockCreatePinnedLookup, mockFetch, capturedAgentOptions } = vi . hoisted ( ( ) => {
7- const capturedAgentOptions : unknown [ ] = [ ]
8- class MockAgent {
9- constructor ( options : unknown ) {
10- capturedAgentOptions . push ( options )
6+ const { mockAgent, mockCreatePinnedLookup, mockUndiciFetch, capturedAgentOptions } = vi . hoisted (
7+ ( ) => {
8+ const capturedAgentOptions : unknown [ ] = [ ]
9+ class MockAgent {
10+ constructor ( options : unknown ) {
11+ capturedAgentOptions . push ( options )
12+ }
13+ }
14+ return {
15+ mockAgent : MockAgent ,
16+ mockCreatePinnedLookup : vi . fn ( ) ,
17+ mockUndiciFetch : vi . fn ( ) ,
18+ capturedAgentOptions,
1119 }
1220 }
13- return {
14- mockAgent : MockAgent ,
15- mockCreatePinnedLookup : vi . fn ( ) ,
16- mockFetch : vi . fn ( ) ,
17- capturedAgentOptions,
18- }
19- } )
21+ )
2022
21- vi . mock ( 'undici' , ( ) => ( { Agent : mockAgent } ) )
23+ vi . mock ( 'undici' , ( ) => ( { Agent : mockAgent , fetch : mockUndiciFetch } ) )
2224vi . mock ( '@/lib/core/security/input-validation.server' , ( ) => ( {
2325 createPinnedLookup : mockCreatePinnedLookup ,
2426} ) )
2527
26- import { createMcpPinnedFetch } from '. /pinned-fetch'
28+ import { createMcpPinnedFetch } from '@/lib/mcp /pinned-fetch'
2729
2830describe ( 'createMcpPinnedFetch' , ( ) => {
29- const originalFetch = globalThis . fetch
30-
3131 beforeEach ( ( ) => {
3232 vi . clearAllMocks ( )
3333 capturedAgentOptions . length = 0
3434 mockCreatePinnedLookup . mockReturnValue ( 'pinned-lookup-fn' )
35- globalThis . fetch = mockFetch as unknown as typeof fetch
36- mockFetch . mockResolvedValue ( new Response ( 'ok' ) )
37- } )
38-
39- afterEach ( ( ) => {
40- globalThis . fetch = originalFetch
35+ mockUndiciFetch . mockResolvedValue ( new Response ( 'ok' ) )
4136 } )
4237
4338 it ( 'builds an undici Agent with the pinned lookup for the resolved IP' , ( ) => {
@@ -50,8 +45,8 @@ describe('createMcpPinnedFetch', () => {
5045 it ( 'forwards the dispatcher on every fetch call' , async ( ) => {
5146 const fetchLike = createMcpPinnedFetch ( '203.0.113.10' )
5247 await fetchLike ( 'https://example.com/mcp' , { method : 'POST' } )
53- expect ( mockFetch ) . toHaveBeenCalledTimes ( 1 )
54- const [ url , init ] = mockFetch . mock . calls [ 0 ]
48+ expect ( mockUndiciFetch ) . toHaveBeenCalledTimes ( 1 )
49+ const [ url , init ] = mockUndiciFetch . mock . calls [ 0 ]
5550 expect ( url ) . toBe ( 'https://example.com/mcp' )
5651 expect ( ( init as { dispatcher ?: unknown } ) . dispatcher ) . toBeInstanceOf ( mockAgent )
5752 expect ( ( init as { method ?: string } ) . method ) . toBe ( 'POST' )
@@ -65,7 +60,7 @@ describe('createMcpPinnedFetch', () => {
6560 headers : { 'x-test' : '1' } ,
6661 signal : controller . signal ,
6762 } )
68- const init = mockFetch . mock . calls [ 0 ] [ 1 ] as RequestInit & { dispatcher ?: unknown }
63+ const init = mockUndiciFetch . mock . calls [ 0 ] [ 1 ] as RequestInit & { dispatcher ?: unknown }
6964 expect ( init . headers ) . toEqual ( { 'x-test' : '1' } )
7065 expect ( init . signal ) . toBe ( controller . signal )
7166 expect ( init . dispatcher ) . toBeInstanceOf ( mockAgent )
@@ -74,7 +69,7 @@ describe('createMcpPinnedFetch', () => {
7469 it ( 'handles undefined init gracefully' , async ( ) => {
7570 const fetchLike = createMcpPinnedFetch ( '203.0.113.10' )
7671 await fetchLike ( 'https://example.com/mcp' )
77- const init = mockFetch . mock . calls [ 0 ] [ 1 ] as { dispatcher ?: unknown }
72+ const init = mockUndiciFetch . mock . calls [ 0 ] [ 1 ] as { dispatcher ?: unknown }
7873 expect ( init . dispatcher ) . toBeInstanceOf ( mockAgent )
7974 } )
8075
@@ -83,8 +78,8 @@ describe('createMcpPinnedFetch', () => {
8378 await fetchLike ( 'https://example.com/a' )
8479 await fetchLike ( 'https://example.com/b' )
8580 expect ( capturedAgentOptions ) . toHaveLength ( 1 )
86- const d1 = ( mockFetch . mock . calls [ 0 ] [ 1 ] as { dispatcher : unknown } ) . dispatcher
87- const d2 = ( mockFetch . mock . calls [ 1 ] [ 1 ] as { dispatcher : unknown } ) . dispatcher
81+ const d1 = ( mockUndiciFetch . mock . calls [ 0 ] [ 1 ] as { dispatcher : unknown } ) . dispatcher
82+ const d2 = ( mockUndiciFetch . mock . calls [ 1 ] [ 1 ] as { dispatcher : unknown } ) . dispatcher
8883 expect ( d1 ) . toBe ( d2 )
8984 } )
9085} )
0 commit comments