add basic shell command tests

This commit is contained in:
oleg 2014-12-04 01:23:41 +03:00
parent 6cce9c9bbf
commit 75734b8d9a
6 changed files with 54 additions and 13 deletions

View File

@ -4,22 +4,22 @@ var ParentCommand = require('./spawn').Command,
inherits = require('util').inherits; inherits = require('util').inherits;
function Command(params) { function Command(params) {
params = params || {};
ParentCommand.call(this, params); ParentCommand.call(this, params);
this.shell = params.shell || '/bin/sh';
} }
exports.ShellCommand = Command; exports.Command = Command;
inherits(Command, ParentCommand); inherits(Command, ParentCommand);
/** /**
* Executes `params.cmd` (e.g. 'echo 1 && echo 2') in `params.shell` * Executes `params.cmd` (e.g. 'echo 1 && echo 2') in a `shell`
* (e.g. '/bin/sh') with `params.options` * (which was set at constructor) with `params.options`
*/ */
Command.prototype.run = function(params, callback) { Command.prototype.run = function(params, callback) {
if (!params.shell) return callback(new Error('`shell` is not set')); ParentCommand.prototype.run.call(this, {
if (!params.cmd) return callback(new Error('`cmd` is not set')); cmd: this.shell, args: ['-c', params.cmd], options: params.options
ParentCommand.prototype.exec.call(this, {
cmd: params.shell, args: ['-c', params.cmd], options: params.options
}, callback); }, callback);
}; };

View File

@ -27,6 +27,7 @@ Command.prototype.run = function(params, callback) {
var cmd = spawn(params.cmd, params.args, params.options); var cmd = spawn(params.cmd, params.args, params.options);
cmd.stdout.on('data', function(data) { cmd.stdout.on('data', function(data) {
if (self.isEmit) self.emit('stdout', data); if (self.isEmit) self.emit('stdout', data);
// TODO: join stdout only if flag is set
stdout += data; stdout += data;
}); });
cmd.stderr.on('data', function(data) { cmd.stderr.on('data', function(data) {
@ -34,11 +35,13 @@ Command.prototype.run = function(params, callback) {
cmd.kill(); cmd.kill();
}); });
cmd.on('exit', function(code) { cmd.on('exit', function(code) {
var err = null; if (code !== 0) callback(new Error(
if (code !== 0) err = new Error( 'Spawned command exits with non-zero code: ' + code
'Scm command exits with non-zero code: ' + code ));
); });
callback(err, stdout); // TODO; callback should be called only once (port once from underscore)
cmd.on('close', function() {
callback(null, stdout);
}); });
return cmd; return cmd;
}; };

View File

@ -6,7 +6,7 @@
"nci": "bin/nci" "nci": "bin/nci"
}, },
"scripts": { "scripts": {
"test": "mocha --bail --reporter=spec test" "test": "mocha --bail --reporter=spec test/index"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

3
test/commands/index.js Normal file
View File

@ -0,0 +1,3 @@
'use strict';
require('./shell');

31
test/commands/shell.js Normal file
View File

@ -0,0 +1,31 @@
'use strict';
var expect = require('expect.js'),
ShellCommand = require('../../lib/command/shell').Command;
describe('Shell command', function() {
var shellCommand;
it('Should be created without errors', function() {
shellCommand = new ShellCommand({
isEmit: true
});
});
it('Default shell should be sh', function() {
expect(shellCommand.shell).equal('/bin/sh');
});
it('echo "Hello world" should be done', function(done) {
var stdout = '';
shellCommand.on('stdout', function(data) {
stdout += data;
});
shellCommand.run({cmd: 'echo "Hello world"'}, function(err) {
expect(err).not.ok();
expect(stdout).equal('Hello world\n');
done();
});
});
});

4
test/index.js Normal file
View File

@ -0,0 +1,4 @@
'use strict';
require('./commands');
require('./scm')