Files
gemini-cli/packages/core/src/utils/stdio.test.ts

69 lines
1.7 KiB
TypeScript

/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { patchStdio, createWorkingStdio } from './stdio.js';
import { coreEvents } from './events.js';
vi.mock('./events.js', () => ({
coreEvents: {
emitOutput: vi.fn(),
},
}));
describe('stdio utils', () => {
let originalStdoutWrite: typeof process.stdout.write;
let originalStderrWrite: typeof process.stderr.write;
beforeEach(() => {
originalStdoutWrite = process.stdout.write;
originalStderrWrite = process.stderr.write;
});
afterEach(() => {
process.stdout.write = originalStdoutWrite;
process.stderr.write = originalStderrWrite;
vi.restoreAllMocks();
});
it('patchStdio redirects stdout and stderr to coreEvents', () => {
const cleanup = patchStdio();
process.stdout.write('test stdout');
expect(coreEvents.emitOutput).toHaveBeenCalledWith(
false,
'test stdout',
undefined,
);
process.stderr.write('test stderr');
expect(coreEvents.emitOutput).toHaveBeenCalledWith(
true,
'test stderr',
undefined,
);
cleanup();
// Verify cleanup
expect(process.stdout.write).toBe(originalStdoutWrite);
expect(process.stderr.write).toBe(originalStderrWrite);
});
it('createWorkingStdio writes to real stdout/stderr bypassing patch', () => {
const cleanup = patchStdio();
const { stdout, stderr } = createWorkingStdio();
stdout.write('working stdout');
expect(coreEvents.emitOutput).not.toHaveBeenCalled();
stderr.write('working stderr');
expect(coreEvents.emitOutput).not.toHaveBeenCalled();
cleanup();
});
});