From c35297b80ad3f889481b0b8a7f3f3831feca8c21 Mon Sep 17 00:00:00 2001 From: Andrey Avtomonov <7889985+andreybavt@users.noreply.github.com> Date: Tue, 12 May 2026 11:36:15 +0200 Subject: [PATCH] test(cli): cover output channel invariants --- packages/cli/src/index.test.ts | 18 ++++++++++++++++++ packages/cli/src/ingest.test.ts | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/index.test.ts b/packages/cli/src/index.test.ts index a575eeed..8ee74016 100644 --- a/packages/cli/src/index.test.ts +++ b/packages/cli/src/index.test.ts @@ -2,6 +2,7 @@ import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'; import { createRequire } from 'node:module'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; +import { initKtxProject } from '@ktx/context/project'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { @@ -310,6 +311,23 @@ describe('runKtxCli', () => { expect(testIo.stderr()).toBe(''); }); + it('keeps representative JSON command stdout parseable', async () => { + const projectDir = join(tempDir, 'project'); + await initKtxProject({ projectDir, projectName: 'warehouse' }); + const commands = [ + ['--project-dir', projectDir, 'setup', 'status', '--json'], + ['--project-dir', projectDir, 'sl', 'list', '--json'], + ]; + + for (const argv of commands) { + const testIo = makeIo(); + await expect(runKtxCli(argv, testIo.io)).resolves.toBe(0); + + expect(() => JSON.parse(testIo.stdout())).not.toThrow(); + expect(testIo.stderr()).toBe(''); + } + }); + it('starts setup for bare ktx in a TTY when no project is discoverable', async () => { const { mkdtemp, realpath, rm } = await import('node:fs/promises'); const { tmpdir } = await import('node:os'); diff --git a/packages/cli/src/ingest.test.ts b/packages/cli/src/ingest.test.ts index 2573262a..bf27be15 100644 --- a/packages/cli/src/ingest.test.ts +++ b/packages/cli/src/ingest.test.ts @@ -399,11 +399,11 @@ describe('runKtxIngest', () => { io.io, { runLocalMetabaseIngest: async (input) => { - input.progress?.onMetabaseFanoutPlanned({ + input.progress?.onMetabaseFanoutPlanned?.({ metabaseConnectionId: 'prod-metabase', children: [{ metabaseDatabaseId: 1, targetConnectionId: 'warehouse_a' }], }); - input.progress?.onMetabaseChildStarted({ + input.progress?.onMetabaseChildStarted?.({ metabaseConnectionId: 'prod-metabase', metabaseDatabaseId: 1, targetConnectionId: 'warehouse_a',