Files
waggle-os/tests/sidecar/mcp-manager.test.ts
Oleg Maslov 0c3e2ead3b
Some checks failed
Installer Smoke / installer-smoke (push) Has been cancelled
moving
2026-09-02 10:10:29 +02:00

62 lines
2.0 KiB
TypeScript

import { describe, it, expect, beforeEach } from 'vitest';
import { McpManager, type McpServerConfig } from '../../sidecar/src/mcp-manager.js';
describe('MCP Manager', () => {
let manager: McpManager;
beforeEach(() => {
manager = new McpManager();
});
it('starts with no servers', () => {
expect(manager.listServers()).toEqual([]);
});
it('adds a server config', () => {
const config: McpServerConfig = {
id: 'filesystem',
name: 'File System',
command: 'npx',
args: ['-y', '@modelcontextprotocol/server-filesystem', '/tmp'],
};
manager.addServer(config);
expect(manager.listServers()).toHaveLength(1);
expect(manager.listServers()[0].id).toBe('filesystem');
});
it('removes a server config', () => {
manager.addServer({ id: 'test', name: 'Test', command: 'echo', args: ['hello'] });
expect(manager.listServers()).toHaveLength(1);
manager.removeServer('test');
expect(manager.listServers()).toHaveLength(0);
});
it('prevents duplicate server IDs', () => {
manager.addServer({ id: 'dup', name: 'First', command: 'a', args: [] });
expect(() => {
manager.addServer({ id: 'dup', name: 'Second', command: 'b', args: [] });
}).toThrow('already exists');
});
it('gets server by ID', () => {
manager.addServer({ id: 'fs', name: 'FS', command: 'npx', args: [] });
const server = manager.getServer('fs');
expect(server?.name).toBe('FS');
});
it('returns undefined for unknown server', () => {
expect(manager.getServer('nope')).toBeUndefined();
});
it('serializes and deserializes config', () => {
manager.addServer({ id: 'a', name: 'A', command: 'x', args: ['1'] });
manager.addServer({ id: 'b', name: 'B', command: 'y', args: ['2'], env: { FOO: 'bar' } });
const json = manager.toJSON();
const restored = McpManager.fromJSON(json);
expect(restored.listServers()).toHaveLength(2);
expect(restored.getServer('b')?.env).toEqual({ FOO: 'bar' });
});
});