import { describe, it, expect, vi } from 'vitest'; import { createDescribeCommand } from '../../src/commands/describe.js'; import type { DescribeCommandDeps } from '../../src/commands/describe.js'; function makeDeps(item: unknown = {}): DescribeCommandDeps & { output: string[] } { const output: string[] = []; return { output, fetchResource: vi.fn(async () => item), log: (...args: string[]) => output.push(args.join(' ')), }; } describe('describe command', () => { it('shows detailed server info', async () => { const deps = makeDeps({ id: 'srv-1', name: 'slack', transport: 'STDIO', packageName: '@slack/mcp', dockerImage: null, envTemplate: [], }); const cmd = createDescribeCommand(deps); await cmd.parseAsync(['node', 'test', 'server', 'srv-1']); expect(deps.fetchResource).toHaveBeenCalledWith('servers', 'srv-1'); const text = deps.output.join('\n'); expect(text).toContain('--- Server ---'); expect(text).toContain('name: slack'); expect(text).toContain('transport: STDIO'); expect(text).toContain('dockerImage: -'); }); it('resolves resource aliases', async () => { const deps = makeDeps({ id: 'p1' }); const cmd = createDescribeCommand(deps); await cmd.parseAsync(['node', 'test', 'prof', 'p1']); expect(deps.fetchResource).toHaveBeenCalledWith('profiles', 'p1'); }); it('outputs JSON format', async () => { const deps = makeDeps({ id: 'srv-1', name: 'slack' }); const cmd = createDescribeCommand(deps); await cmd.parseAsync(['node', 'test', 'server', 'srv-1', '-o', 'json']); const parsed = JSON.parse(deps.output[0] ?? ''); expect(parsed.name).toBe('slack'); }); it('outputs YAML format', async () => { const deps = makeDeps({ id: 'srv-1', name: 'slack' }); const cmd = createDescribeCommand(deps); await cmd.parseAsync(['node', 'test', 'server', 'srv-1', '-o', 'yaml']); expect(deps.output[0]).toContain('name: slack'); }); it('formats nested objects', async () => { const deps = makeDeps({ id: 'srv-1', name: 'slack', metadata: { version: '1.0', nested: { deep: true } }, }); const cmd = createDescribeCommand(deps); await cmd.parseAsync(['node', 'test', 'server', 'srv-1']); const text = deps.output.join('\n'); expect(text).toContain('metadata:'); expect(text).toContain('version: 1.0'); }); it('formats arrays correctly', async () => { const deps = makeDeps({ id: 'srv-1', permissions: ['read', 'write'], envTemplate: [], }); const cmd = createDescribeCommand(deps); await cmd.parseAsync(['node', 'test', 'server', 'srv-1']); const text = deps.output.join('\n'); expect(text).toContain('permissions: read, write'); expect(text).toContain('envTemplate: []'); }); });