UNPKG

@mbc-cqrs-serverless/cli

Version:

a CLI to get started with MBC CQRS serverless framework

146 lines (145 loc) 8.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const child_process_1 = require("child_process"); const events_1 = require("events"); const abstract_runner_1 = require("./abstract.runner"); jest.mock('child_process'); describe('Abstract Runner', () => { const mockSpawn = child_process_1.spawn; let mockChildProcess; beforeEach(() => { jest.clearAllMocks(); mockChildProcess = new events_1.EventEmitter(); mockChildProcess.stdout = new events_1.EventEmitter(); mockChildProcess.stderr = new events_1.EventEmitter(); mockSpawn.mockReturnValue(mockChildProcess); }); describe('Overview: Base runner functionality for command execution', () => { describe('Purpose: Test successful command execution', () => { it('should execute command successfully with default options', async () => { const runner = new abstract_runner_1.AbstractRunner('npm', ['--version']); const runPromise = runner.run('install'); mockChildProcess.emit('close', 0); await expect(runPromise).resolves.toBeNull(); expect(mockSpawn).toHaveBeenCalledWith('npm', ['--version', 'install'], expect.any(Object)); }); it('should execute command with custom arguments', async () => { const runner = new abstract_runner_1.AbstractRunner('node', ['-v']); const runPromise = runner.run('--help'); mockChildProcess.emit('close', 0); await expect(runPromise).resolves.toBeNull(); expect(mockSpawn).toHaveBeenCalledWith('node', ['-v', '--help'], expect.any(Object)); }); it('should collect output when collectResult is true', async () => { const runner = new abstract_runner_1.AbstractRunner('echo', ['hello']); const runPromise = runner.run('world', true); mockChildProcess.stdout.emit('data', Buffer.from('hello\n')); const result = await runPromise; expect(result).toBe('hello'); }); }); describe('Purpose: Test error handling scenarios', () => { it('should handle command execution failure', async () => { const runner = new abstract_runner_1.AbstractRunner('invalid-command', []); const runPromise = runner.run('test'); mockChildProcess.emit('close', 1); await expect(runPromise).rejects.toBeUndefined(); }); it('should handle spawn errors', async () => { const runner = new abstract_runner_1.AbstractRunner('invalid-command', []); const runPromise = runner.run('test'); mockChildProcess.emit('close', 1); await expect(runPromise).rejects.toBeUndefined(); }); it('should handle stderr output as error', async () => { const runner = new abstract_runner_1.AbstractRunner('test-command', []); const runPromise = runner.run('test'); mockChildProcess.emit('close', 1); await expect(runPromise).rejects.toBeUndefined(); }); }); describe('Purpose: Test command string generation', () => { it('should generate correct command string with binary and arguments', () => { const runner = new abstract_runner_1.AbstractRunner('npm', ['install', '--save']); const commandString = runner.rawFullCommand('test'); expect(commandString).toBe('npm install --save test'); }); it('should generate command string with empty arguments', () => { const runner = new abstract_runner_1.AbstractRunner('node', []); const commandString = runner.rawFullCommand('test'); expect(commandString).toBe('node test'); }); it('should handle arguments with spaces', () => { const runner = new abstract_runner_1.AbstractRunner('echo', ['hello world', 'test']); const commandString = runner.rawFullCommand('command'); expect(commandString).toBe('echo hello world test command'); }); }); describe('Purpose: Test output collection functionality', () => { it('should collect stdout when collectResult is enabled', async () => { const runner = new abstract_runner_1.AbstractRunner('cat', ['file.txt']); const runPromise = runner.run('test', true); mockChildProcess.stdout.emit('data', Buffer.from('line 1\n')); const result = await runPromise; expect(result).toBe('line 1'); }); it('should not collect output when collectResult is false', async () => { const runner = new abstract_runner_1.AbstractRunner('echo', ['test']); const runPromise = runner.run('command', false); mockChildProcess.emit('close', 0); const result = await runPromise; expect(result).toBeNull(); }); it('should handle empty stdout output', async () => { const runner = new abstract_runner_1.AbstractRunner('true', []); const runPromise = runner.run('test', false); mockChildProcess.emit('close', 0); const result = await runPromise; expect(result).toBeNull(); }); }); describe('Purpose: Test edge cases and error scenarios', () => { it('should handle process exit with signal', async () => { const runner = new abstract_runner_1.AbstractRunner('test-command', []); const runPromise = runner.run('test'); mockChildProcess.emit('close', null, 'SIGTERM'); await expect(runPromise).rejects.toBeUndefined(); }); it('should handle multiple stderr chunks', async () => { const runner = new abstract_runner_1.AbstractRunner('test-command', []); const runPromise = runner.run('test'); mockChildProcess.emit('close', 1); await expect(runPromise).rejects.toBeUndefined(); }); it('should handle very long command arguments', async () => { const longArgs = Array(100).fill('very-long-argument-name'); const runner = new abstract_runner_1.AbstractRunner('test-command', longArgs); const commandString = runner.rawFullCommand('test'); expect(commandString).toContain('test-command'); expect(commandString.split(' ')).toHaveLength(102); }); }); describe('Purpose: Test concurrent execution scenarios', () => { it('should handle multiple runner instances', async () => { const runner1 = new abstract_runner_1.AbstractRunner('echo', ['test1']); const runner2 = new abstract_runner_1.AbstractRunner('echo', ['test2']); const promise1 = runner1.run('command1'); const promise2 = runner2.run('command2'); mockChildProcess.emit('close', 0); const results = await Promise.all([promise1, promise2]); expect(results).toEqual([null, null]); }); it('should handle rapid successive runs', async () => { const runner = new abstract_runner_1.AbstractRunner('echo', ['test']); const promises = Array(5) .fill(null) .map((_, i) => { return runner.run(`command${i}`); }); mockChildProcess.emit('close', 0); const results = await Promise.all(promises); expect(results).toEqual([null, null, null, null, null]); }); }); }); });