refactor(cli): extract Query CLI Adapter Module seam (#3074)

* refactor(cli): extract query adapter seam from cli entrypoint

* test: update ws forwarding guard for query-cli-adapter seam

* fix(query): close remaining CodeRabbit findings on cli adapter

* test: address remaining CodeRabbit nitpicks on ws forwarding coverage
This commit is contained in:
Tom Boucher
2026-05-03 15:57:01 -04:00
committed by GitHub
parent b6c401dc90
commit 5c9f34bd31
5 changed files with 152 additions and 66 deletions

View File

@@ -0,0 +1,58 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
const dispatchSpy = vi.hoisted(() => vi.fn());
const runQueryDispatchSpy = vi.hoisted(() => vi.fn());
vi.mock('./helpers.js', () => ({
findProjectRoot: (projectDir: string) => projectDir,
}));
vi.mock('./index.js', () => ({
createRegistry: () => ({ dispatch: dispatchSpy }),
}));
vi.mock('./query-dispatch.js', () => ({
runQueryDispatch: (...args: unknown[]) => runQueryDispatchSpy(...args),
}));
import { runQueryCliCommand } from './query-cli-adapter.js';
describe('query-cli-adapter', () => {
beforeEach(() => {
dispatchSpy.mockReset();
runQueryDispatchSpy.mockReset();
});
it('returns validation failure for missing query command', async () => {
runQueryDispatchSpy.mockResolvedValueOnce({
ok: false,
exit_code: 10,
stdout: '',
stderr: [],
error: { kind: 'validation_error', message: 'query requires a command', details: {} },
});
const out = await runQueryCliCommand({
projectDir: process.cwd(),
queryArgv: [],
});
expect(out.exitCode).toBe(10);
expect(out.stderrLines.join('\n')).toContain('requires a command');
});
it('forwards ws to registry.dispatch via dispatchNative', async () => {
runQueryDispatchSpy.mockImplementationOnce(async (input: any) => {
await input.dispatchNative('state', ['show']);
return { ok: true, exit_code: 0, stdout: '', stderr: [] };
});
await runQueryCliCommand({
projectDir: process.cwd(),
ws: 'alpha',
queryArgv: ['state', 'show'],
});
expect(dispatchSpy).toHaveBeenCalledWith('state', ['show'], process.cwd(), 'alpha');
});
});