-
Notifications
You must be signed in to change notification settings - Fork 15.7k
Expand file tree
/
Copy pathmanager.test.ts
More file actions
113 lines (99 loc) · 4.04 KB
/
manager.test.ts
File metadata and controls
113 lines (99 loc) · 4.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import { describe, expect, test, mock } from 'bun:test'
import { createMcpManager } from '../manager.js'
import type { McpManager } from '../manager.js'
import type { McpClientDependencies } from '../interfaces.js'
import type { ScopedMcpServerConfig, MCPServerConnection, ConnectedMCPServer } from '../types.js'
import type { Client } from '@modelcontextprotocol/sdk/client/index.js'
function createMockDeps(): McpClientDependencies {
return {
logger: {
debug: mock(() => {}),
info: mock(() => {}),
warn: mock(() => {}),
error: mock(() => {}),
},
httpConfig: {
getUserAgent: () => 'test-agent/1.0',
getSessionId: () => 'test-session',
},
}
}
describe('createMcpManager', () => {
test('creates a manager instance', () => {
const manager = createMcpManager(createMockDeps())
expect(manager).toBeDefined()
expect(manager.getConnections).toBeTypeOf('function')
expect(manager.connect).toBeTypeOf('function')
expect(manager.disconnect).toBeTypeOf('function')
expect(manager.getTools).toBeTypeOf('function')
expect(manager.getAllTools).toBeTypeOf('function')
expect(manager.callTool).toBeTypeOf('function')
expect(manager.on).toBeTypeOf('function')
expect(manager.off).toBeTypeOf('function')
})
test('connect throws if connectFn not set', async () => {
const manager = createMcpManager(createMockDeps())
await expect(manager.connect('test', { command: 'npx', args: [] }))
.rejects.toThrow('connectFn not set')
})
test('connect calls connectFn and emits connected event', async () => {
const manager = createMcpManager(createMockDeps()) as any
let connectedEvent: string | null = null
manager.on('connected', (name: string) => { connectedEvent = name })
const mockConnection: ConnectedMCPServer = {
type: 'connected',
name: 'test-server',
client: {
request: mock(() => Promise.resolve({ tools: [] })),
onclose: null,
} as unknown as Client,
capabilities: {},
config: { command: 'npx', args: [], scope: 'dynamic' } as ScopedMcpServerConfig,
cleanup: mock(() => Promise.resolve()),
}
manager.setConnectFn(async (name: string, config: ScopedMcpServerConfig) => {
expect(name).toBe('test-server')
expect(config.scope).toBe('dynamic')
return mockConnection
})
const result = await manager.connect('test-server', { command: 'npx', args: [] })
expect(result.type).toBe('connected')
expect(connectedEvent as unknown as string).toBe('test-server')
})
test('disconnect calls cleanup and emits disconnected', async () => {
const manager = createMcpManager(createMockDeps()) as any
let disconnected = false
manager.on('disconnected', () => { disconnected = true })
const mockCleanup = mock(() => Promise.resolve())
const mockConnection: ConnectedMCPServer = {
type: 'connected',
name: 'test-server',
client: { request: mock(() => Promise.resolve({ tools: [] })) } as unknown as Client,
capabilities: {},
config: { command: 'npx', args: [], scope: 'dynamic' } as ScopedMcpServerConfig,
cleanup: mockCleanup,
}
manager.setConnectFn(async () => mockConnection)
await manager.connect('test-server', { command: 'npx', args: [] })
await manager.disconnect('test-server')
expect(mockCleanup).toHaveBeenCalled()
expect(disconnected).toBe(true)
expect(manager.getConnections().size).toBe(0)
})
test('on/off event handling', () => {
const manager = createMcpManager(createMockDeps()) as any
const handler = mock(() => {})
manager.on('error', handler)
manager.off('error', handler)
// No crash — just verifying it works
expect(true).toBe(true)
})
test('getTools returns empty array for unknown server', () => {
const manager = createMcpManager(createMockDeps())
expect(manager.getTools('unknown')).toEqual([])
})
test('getAllTools returns empty array initially', () => {
const manager = createMcpManager(createMockDeps())
expect(manager.getAllTools()).toEqual([])
})
})