import { describe, it, expect, vi, beforeEach } from 'vitest'; import { createDeleteCommand } from '../../src/commands/delete.js'; import { createLogsCommand } from '../../src/commands/logs.js'; import type { ApiClient } from '../../src/api-client.js'; function mockClient(): ApiClient { return { get: vi.fn(async () => []), post: vi.fn(async () => ({})), put: vi.fn(async () => ({})), delete: vi.fn(async () => {}), } as unknown as ApiClient; } describe('delete command', () => { let client: ReturnType; let output: string[]; const log = (...args: unknown[]) => output.push(args.map(String).join(' ')); beforeEach(() => { client = mockClient(); output = []; }); it('deletes an instance by ID', async () => { const cmd = createDeleteCommand({ client, log }); await cmd.parseAsync(['instance', 'inst-1'], { from: 'user' }); expect(client.delete).toHaveBeenCalledWith('/api/v1/instances/inst-1'); expect(output.join('\n')).toContain('deleted'); }); it('deletes a server by ID', async () => { const cmd = createDeleteCommand({ client, log }); await cmd.parseAsync(['server', 'srv-1'], { from: 'user' }); expect(client.delete).toHaveBeenCalledWith('/api/v1/servers/srv-1'); expect(output.join('\n')).toContain('deleted'); }); it('resolves server name to ID', async () => { vi.mocked(client.get).mockResolvedValue([ { id: 'srv-abc', name: 'ha-mcp' }, ]); const cmd = createDeleteCommand({ client, log }); await cmd.parseAsync(['server', 'ha-mcp'], { from: 'user' }); expect(client.delete).toHaveBeenCalledWith('/api/v1/servers/srv-abc'); }); it('deletes a profile', async () => { const cmd = createDeleteCommand({ client, log }); await cmd.parseAsync(['profile', 'prof-1'], { from: 'user' }); expect(client.delete).toHaveBeenCalledWith('/api/v1/profiles/prof-1'); }); it('deletes a project', async () => { const cmd = createDeleteCommand({ client, log }); await cmd.parseAsync(['project', 'proj-1'], { from: 'user' }); expect(client.delete).toHaveBeenCalledWith('/api/v1/projects/proj-1'); }); it('accepts resource aliases', async () => { const cmd = createDeleteCommand({ client, log }); await cmd.parseAsync(['srv', 'srv-1'], { from: 'user' }); expect(client.delete).toHaveBeenCalledWith('/api/v1/servers/srv-1'); }); }); describe('logs command', () => { let client: ReturnType; let output: string[]; const log = (...args: unknown[]) => output.push(args.map(String).join(' ')); beforeEach(() => { client = mockClient(); output = []; }); it('shows logs', async () => { vi.mocked(client.get).mockResolvedValue({ stdout: 'hello world\n', stderr: '' }); const cmd = createLogsCommand({ client, log }); await cmd.parseAsync(['inst-1'], { from: 'user' }); expect(client.get).toHaveBeenCalledWith('/api/v1/instances/inst-1/logs'); expect(output.join('\n')).toContain('hello world'); }); it('passes tail option', async () => { vi.mocked(client.get).mockResolvedValue({ stdout: '', stderr: '' }); const cmd = createLogsCommand({ client, log }); await cmd.parseAsync(['inst-1', '-t', '50'], { from: 'user' }); expect(client.get).toHaveBeenCalledWith('/api/v1/instances/inst-1/logs?tail=50'); }); });