Skip to content

Commit

Permalink
refactor: rebased off master, updating to ava tests
Browse files Browse the repository at this point in the history
  • Loading branch information
nfischer committed Dec 28, 2016
1 parent eb13b72 commit a949406
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 102 deletions.
2 changes: 1 addition & 1 deletion src/cmd.js
Expand Up @@ -130,7 +130,7 @@ function _cmd() {
// common.state.stderr = result.stderr;
// common.state.code = result.status;
// return stdout;
return new common.ShellString(result.stdout, result.stderr, result.status);
return new common.ShellString(result.stdout.toString(), result.stderr.toString(), result.status);
} else {
try {
return cmdSync(command, cmdArgs, options, pipe);
Expand Down
223 changes: 122 additions & 101 deletions test/cmd.js
@@ -1,32 +1,38 @@
var shell = require('..');
var common = require('../src/common');
import path from 'path';
import os from 'os';

var assert = require('assert');
var path = require('path');
var os = require('os');
import test from 'ava';

import shell from '..';
import common from '../src/common';

shell.config.silent = true;
const oldFatal = shell.config.fatal;

test.afterEach.always(() => {
shell.config.fatal = oldFatal;
});

//
// Invalids
//

shell.cmd();
assert.ok(shell.error());

var result = shell.cmd('asdfasdf'); // could not find command
assert.notEqual(result.code, 0);

// Test 'fatal' mode for cmd, temporarily overriding process.exit
var oldFatal = shell.config.fatal;

shell.config.fatal = true;
test('no args', t => {
shell.cmd();
t.truthy(shell.error());
});

assert.throws(function () {
shell.cmd('asdfasdf'); // could not find command
}, 'cmd: must specify command');
test('could not find command', t => {
const result = shell.cmd('asdfasdf'); // could not find command
t.not(result.code, 0);
});

shell.config.fatal = oldFatal;
test('Test fatal mode for cmd, temporarily overriding process.exit', t => {
shell.config.fatal = true;
t.throws(() => {
shell.cmd('asdfasdf'); // could not find command
}, 'cmd: command not found: asdfasdf');
});

//
// Valids
Expand All @@ -36,87 +42,102 @@ shell.config.fatal = oldFatal;
// sync
//

// check if stdout goes to output
result = shell.cmd(common.nodeBinPath, '-e', 'console.log(1234);');
assert.ok(!shell.error());
assert.equal(result.code, 0);
assert.equal(result.stdout, '1234\n');

// check if stderr goes to output
result = shell.cmd(common.nodeBinPath, '-e', 'console.error(1234);');
assert.ok(!shell.error());
assert.equal(result.code, 0);
assert.equal(result.stdout, '');
assert.equal(result.stderr, '1234\n');

// check if stdout + stderr go to output
result = shell.cmd(common.nodeBinPath, '-e', 'console.error(1234); console.log(666);');
assert.ok(!shell.error());
assert.equal(result.code, 0);
assert.equal(result.stdout, '666\n');
assert.equal(result.stderr, '1234\n');

// check exit code
result = shell.cmd(common.nodeBinPath, '-e', 'process.exit(12);');
assert.ok(shell.error());
assert.equal(result.code, 12);

// interaction with cd
shell.cd('resources/external');
result = shell.cmd(common.nodeBinPath, 'node_script.js');
assert.ok(!shell.error());
assert.equal(result.code, 0);
assert.equal(result.stdout, 'node_script_1234\n');
shell.cd('../..');

// set cwd
result = shell.cmd('shx', 'pwd', { cwd: '..' });
assert.ok(!shell.error());
assert.equal(result.code, 0);
assert.equal(result.stdout, path.resolve('..') + os.EOL);

// supports globbing by default
result = shell.cmd('echo', 'resources/*.txt');
assert.equal(result.stdout, 'resources/a.txt resources/file1.txt resources/file2.txt\n');
assert.equal(result.stderr, '');
assert.ok(!shell.error());

// globbing can be disabled
shell.set('-f');
result = shell.cmd('echo', 'resources/*.txt');
assert.equal(result.stdout, 'resources/*.txt\n');
assert.equal(result.stderr, '');
assert.ok(!shell.error());
shell.set('+f');

// cmd returns a ShellString
result = shell.cmd('echo', 'foo');
assert.equal(typeof result, 'object');
assert.ok(result instanceof String);
assert.equal(typeof result.stdout, 'string');
assert.strictEqual(result.toString(), result.stdout);
test('check if stdout goes to output', t => {
const result = shell.cmd(common.nodeBinPath, '-e', 'console.log(1234);');
t.falsy(shell.error());
t.is(result.code, 0);
t.is(result.stdout, '1234\n');
});

test('check if stderr goes to output', t => {
const result = shell.cmd(common.nodeBinPath, '-e', 'console.error(1234);');
t.falsy(shell.error());
t.is(result.code, 0);
t.is(typeof result.stdout, 'string');
t.is(typeof result.stderr, 'string');
t.is(result.stdout, '');
t.is(result.stderr, '1234\n');
});

test('check if stdout + stderr go to output', t => {
const result = shell.cmd(common.nodeBinPath, '-e', 'console.error(1234); console.log(666);');
t.falsy(shell.error());
t.is(result.code, 0);
t.is(result.stdout, '666\n');
t.is(result.stderr, '1234\n');
});

test('check exit code', t => {
const result = shell.cmd(common.nodeBinPath, '-e', 'process.exit(12);');
t.truthy(shell.error());
t.is(result.code, 12);
});

test('interaction with cd', t => {
shell.cd('resources/external');
const result = shell.cmd(common.nodeBinPath, 'node_script.js');
t.falsy(shell.error());
t.is(result.code, 0);
t.is(result.stdout, 'node_script_1234\n');
shell.cd('../..');
});

test('set cwd', t => {
const result = shell.cmd('shx', 'pwd', { cwd: '..' });
t.falsy(shell.error());
t.is(result.code, 0);
t.is(result.stdout, path.resolve('..') + os.EOL);
});

test('supports globbing by default', t => {
const result = shell.cmd('echo', 'resources/*.txt');
t.is(result.stdout, 'resources/a.txt resources/file1.txt resources/file2.txt\n');
t.is(result.stderr, '');
t.falsy(shell.error());
});

test('globbing can be disabled', t => {
shell.set('-f');
const result = shell.cmd('echo', 'resources/*.txt');
t.is(result.stdout, 'resources/*.txt\n');
t.is(result.stderr, '');
t.falsy(shell.error());
shell.set('+f');
});

test('cmd returns a ShellString', t => {
const result = shell.cmd('echo', 'foo');
t.is(typeof result, 'object');
t.truthy(result instanceof String);
t.is(typeof result.stdout, 'string');
t.is(result.toString(), result.stdout);
});

// TODO(nate): make it exactly equivalent to stderr, unless stderr === ''
// shell.error() contains the stderr of external command in the case of an error
result = shell.cmd(common.nodeBinPath, '-e', 'console.error(1234); process.exit(1);');
assert.equal(shell.error(), 'cmd: ' + result.stderr);
assert.equal(result.code, 1);
assert.equal(result.stdout, '');
assert.equal(result.stderr, '1234\n');

// option: realtimeOutput === false
result = shell.cmd(common.nodeBinPath, '-e', 'console.error(1234); console.log(5678);', {
realtimeOutput: false
});
assert.ok(!shell.error());
assert.equal(result.code, 0);
assert.equal(result.stdout, '5678\n');
assert.equal(result.stderr, '1234\n');

// cmd works, even if it's piped while in silent mode
result = shell.ShellString('foo bar baz').cmd('cat', { silent: true });
assert.equal(typeof result, 'object');
assert.ok(result instanceof String);
assert.equal(result.stdout, 'foo bar baz');

shell.exit(123);
test.skip('shell.error() contains the stderr of external command in the case of an error', t => {
const result = shell.cmd(common.nodeBinPath, '-e', 'console.error(1234); process.exit(3);');
t.is(shell.error(), result.stderr);
t.is(result.code, 3);
t.is(result.stdout, '');
// TODO(nate): fix the 'internal error' that I'm seeing
t.is(result.stderr, '1234\n');
});

test('option: realtimeOutput === false', t => {
const result = shell.cmd(common.nodeBinPath, '-e', 'console.error(1234); console.log(5678);', {
realtimeOutput: false,
});
t.falsy(shell.error());
t.is(typeof result.stdout, 'string');
t.is(typeof result.stderr, 'string');
t.is(result.code, 0);
t.is(result.stdout, '5678\n');
t.is(result.stderr, '1234\n');
});

test('cmd works, even if it\'s piped while in silent mode', t => {
const result = shell.ShellString('foo bar baz').cmd('cat', { silent: true });
t.is(typeof result, 'object');
t.truthy(result instanceof String);
t.is(result.stdout, 'foo bar baz');
});

0 comments on commit a949406

Please sign in to comment.