2026-02-21 05:11:48 +00:00
|
|
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
2026-02-22 13:30:46 +00:00
|
|
|
import { createDeleteCommand } from '../../src/commands/delete.js';
|
|
|
|
|
import { createLogsCommand } from '../../src/commands/logs.js';
|
2026-02-21 05:11:48 +00:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-22 13:30:46 +00:00
|
|
|
describe('delete command', () => {
|
2026-02-21 05:11:48 +00:00
|
|
|
let client: ReturnType<typeof mockClient>;
|
|
|
|
|
let output: string[];
|
|
|
|
|
const log = (...args: unknown[]) => output.push(args.map(String).join(' '));
|
|
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
|
client = mockClient();
|
|
|
|
|
output = [];
|
|
|
|
|
});
|
|
|
|
|
|
2026-02-22 13:30:46 +00:00
|
|
|
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');
|
2026-02-21 05:11:48 +00:00
|
|
|
});
|
|
|
|
|
|
2026-02-22 13:30:46 +00:00
|
|
|
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');
|
|
|
|
|
});
|
2026-02-21 05:11:48 +00:00
|
|
|
|
2026-02-22 13:30:46 +00:00
|
|
|
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');
|
2026-02-21 05:11:48 +00:00
|
|
|
});
|
|
|
|
|
|
2026-02-22 13:30:46 +00:00
|
|
|
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');
|
2026-02-21 05:11:48 +00:00
|
|
|
});
|
|
|
|
|
|
2026-02-22 13:30:46 +00:00
|
|
|
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');
|
2026-02-21 05:11:48 +00:00
|
|
|
});
|
|
|
|
|
|
2026-02-22 13:30:46 +00:00
|
|
|
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');
|
2026-02-21 05:11:48 +00:00
|
|
|
});
|
2026-02-22 13:30:46 +00:00
|
|
|
});
|
2026-02-21 05:11:48 +00:00
|
|
|
|
2026-02-22 13:30:46 +00:00
|
|
|
describe('logs command', () => {
|
|
|
|
|
let client: ReturnType<typeof mockClient>;
|
|
|
|
|
let output: string[];
|
|
|
|
|
const log = (...args: unknown[]) => output.push(args.map(String).join(' '));
|
|
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
|
client = mockClient();
|
|
|
|
|
output = [];
|
|
|
|
|
});
|
2026-02-21 05:11:48 +00:00
|
|
|
|
2026-02-22 13:30:46 +00:00
|
|
|
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');
|
2026-02-21 05:11:48 +00:00
|
|
|
});
|
|
|
|
|
|
2026-02-22 13:30:46 +00:00
|
|
|
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');
|
2026-02-21 05:11:48 +00:00
|
|
|
});
|
|
|
|
|
});
|