103 new tests across 7 files: - setup/status: emitStatus output structure - setup/packages: loadPackageList (real files), loadAllPackageLists - setup/tailscale: maybeEnableTailscaleInJail enabled/disabled/pkg-fail paths - setup/bastille-helpers: bastille(), jailRoot, jailExists, resolveJailName - setup/hosts: syncLocalHosts with jail discovery and skip logic - src/upstream/classify: classifyUpstreamFiles, classificationHint, summarizeCommit - src/upstream/git: getUpstreamConfig, isGitRepo, listRemotes, readEnvFlag/writeEnvFlag, countCommitsBetween, listCommitHashes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --- Build: FAIL | Tests: pass — Tests 1493 passed (1493)
65 lines
1.9 KiB
TypeScript
65 lines
1.9 KiB
TypeScript
/**
|
|
* setup/status.test.ts — emitStatus unit tests.
|
|
*
|
|
* Run with: npx vitest run setup/status.test.ts
|
|
*/
|
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
import { emitStatus } from './status.js';
|
|
|
|
describe('emitStatus', () => {
|
|
let consoleSpy: ReturnType<typeof vi.spyOn>;
|
|
|
|
beforeEach(() => {
|
|
consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
});
|
|
|
|
afterEach(() => {
|
|
consoleSpy.mockRestore();
|
|
});
|
|
|
|
it('outputs a header line with the step name', () => {
|
|
emitStatus('MY_STEP', {});
|
|
const output = consoleSpy.mock.calls[0][0] as string;
|
|
expect(output).toContain('MY_STEP');
|
|
expect(output).toContain('CLAWDIE SETUP');
|
|
});
|
|
|
|
it('outputs an END marker', () => {
|
|
emitStatus('MY_STEP', {});
|
|
const output = consoleSpy.mock.calls[0][0] as string;
|
|
expect(output).toContain('=== END ===');
|
|
});
|
|
|
|
it('includes each key=value pair', () => {
|
|
emitStatus('TEST', { STATUS: 'success', COUNT: 3, FLAG: true });
|
|
const output = consoleSpy.mock.calls[0][0] as string;
|
|
expect(output).toContain('STATUS: success');
|
|
expect(output).toContain('COUNT: 3');
|
|
expect(output).toContain('FLAG: true');
|
|
});
|
|
|
|
it('handles empty fields object', () => {
|
|
emitStatus('EMPTY', {});
|
|
const output = consoleSpy.mock.calls[0][0] as string;
|
|
expect(output).toContain('EMPTY');
|
|
expect(output).toContain('=== END ===');
|
|
});
|
|
|
|
it('calls console.log exactly once', () => {
|
|
emitStatus('STEP', { A: '1' });
|
|
expect(consoleSpy).toHaveBeenCalledOnce();
|
|
});
|
|
|
|
it('handles number values', () => {
|
|
emitStatus('NUMS', { X: 42, Y: 0 });
|
|
const output = consoleSpy.mock.calls[0][0] as string;
|
|
expect(output).toContain('X: 42');
|
|
expect(output).toContain('Y: 0');
|
|
});
|
|
|
|
it('handles boolean false', () => {
|
|
emitStatus('BOOLS', { ENABLED: false });
|
|
const output = consoleSpy.mock.calls[0][0] as string;
|
|
expect(output).toContain('ENABLED: false');
|
|
});
|
|
});
|