You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							194 lines
						
					
					
						
							5.4 KiB
						
					
					
				
			
		
		
	
	
							194 lines
						
					
					
						
							5.4 KiB
						
					
					
				/* global describe, it, beforeEach, afterEach */ | 
						|
var execSh = require('..') | 
						|
var assert = require('assert') | 
						|
var sinon = require('sinon') | 
						|
var cp = require('child_process') | 
						|
 | 
						|
describe('exec-sh', function () { | 
						|
  describe('module.exports', function () { | 
						|
    it('should export a single function', function () { | 
						|
      assert.strictEqual(typeof execSh, 'function') | 
						|
    }) | 
						|
 | 
						|
    it('should export promise interface', function () { | 
						|
      assert.strictEqual(typeof execSh.promise, 'function') | 
						|
    }) | 
						|
  }) | 
						|
 | 
						|
  describe('#execSh() arguments', function () { | 
						|
    var spawn, exitCode, stream | 
						|
 | 
						|
    stream = { | 
						|
      on: function (e, c) { | 
						|
        if (e === 'data') { | 
						|
          // execute callback two times to check if stream | 
						|
          // aggregation works correctly | 
						|
          c('1') | 
						|
          c('2') | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    beforeEach(function () { | 
						|
      exitCode = 0 | 
						|
      spawn = sinon.stub(cp, 'spawn') | 
						|
      spawn.returns({ | 
						|
        spawn_return: true, | 
						|
        on: function (e, c) { | 
						|
          if (e === 'close') { | 
						|
            c(exitCode) | 
						|
          } | 
						|
        }, | 
						|
        stdout: stream, | 
						|
        stderr: stream | 
						|
      }) | 
						|
    }) | 
						|
 | 
						|
    afterEach(function () { | 
						|
      cp.spawn.restore() | 
						|
    }) | 
						|
 | 
						|
    it('should pass command to spawn function', function () { | 
						|
      execSh('command') | 
						|
      sinon.assert.calledOnce(spawn) | 
						|
      assert.strictEqual('command', spawn.getCall(0).args[1][1]) | 
						|
    }) | 
						|
 | 
						|
    it('should accept array of commands to run', function () { | 
						|
      execSh(['command1', 'command2']) | 
						|
      sinon.assert.calledOnce(spawn) | 
						|
      assert.strictEqual('command1;command2', spawn.getCall(0).args[1][1]) | 
						|
    }) | 
						|
 | 
						|
    it('should accept true as options argument', function () { | 
						|
      execSh('command', true) | 
						|
      sinon.assert.calledOnce(spawn) | 
						|
      assert.strictEqual(spawn.getCall(0).args[2].stdio, null) | 
						|
    }) | 
						|
 | 
						|
    it('should merge defaults with options', function () { | 
						|
      var options = { key: 'value' } | 
						|
      var expectedOptions = { | 
						|
        key: 'value', | 
						|
        stdio: 'inherit' | 
						|
      } | 
						|
      execSh('command', options) | 
						|
      assert.deepStrictEqual(spawn.getCall(0).args[2], expectedOptions) | 
						|
    }) | 
						|
 | 
						|
    it('should allow overriding default options', function () { | 
						|
      var options = { foo: 'bar', stdio: null } | 
						|
      var expectedOptions = { | 
						|
        foo: 'bar', | 
						|
        stdio: null | 
						|
      } | 
						|
      execSh('command', options) | 
						|
      assert.deepStrictEqual(spawn.getCall(0).args[2], expectedOptions) | 
						|
    }) | 
						|
 | 
						|
    it('should allow passing nested environment options', function () { | 
						|
      var options = { | 
						|
        env: { | 
						|
          key1: 'value 1', | 
						|
          key2: 'value 2' | 
						|
        } | 
						|
      } | 
						|
      var expectedOptions = { | 
						|
        env: { | 
						|
          key1: 'value 1', | 
						|
          key2: 'value 2' | 
						|
        }, | 
						|
        stdio: 'inherit' | 
						|
      } | 
						|
      execSh('command', options) | 
						|
      assert.deepStrictEqual(spawn.getCall(0).args[2], expectedOptions) | 
						|
    }) | 
						|
 | 
						|
    it("should accept optional 'callback' parameter", function () { | 
						|
      var callback = sinon.spy() | 
						|
      execSh('command', callback) | 
						|
      execSh('command', { key: 'value' }, callback) | 
						|
      sinon.assert.callCount(callback, 2) | 
						|
    }) | 
						|
 | 
						|
    it("should use 'cmd /C' command prefix on windows", function () { | 
						|
      var platform = process.platform | 
						|
      Object.defineProperty(process, 'platform', { value: 'win32' }) | 
						|
      execSh('command') | 
						|
      Object.defineProperty(process, 'platform', { value: platform }) | 
						|
 | 
						|
      sinon.assert.calledOnce(spawn) | 
						|
      assert.strictEqual(spawn.getCall(0).args[0], 'cmd') | 
						|
    }) | 
						|
 | 
						|
    it("should use 'sh -c' command prefix on *nix", function () { | 
						|
      var platform = process.platform | 
						|
      process.platform = 'linux' | 
						|
      execSh('command') | 
						|
      process.platform = platform | 
						|
 | 
						|
      sinon.assert.calledOnce(spawn) | 
						|
      assert.strictEqual(spawn.getCall(0).args[1][0], '-c') | 
						|
      assert.strictEqual(spawn.getCall(0).args[0], 'sh') | 
						|
    }) | 
						|
 | 
						|
    it('should return spawn() result', function () { | 
						|
      assert(execSh('command').spawn_return) | 
						|
    }) | 
						|
 | 
						|
    it('should aggregate stdoout and stderr', function (done) { | 
						|
      execSh('command', function (_err, stdout, stderr) { | 
						|
        assert.strictEqual(stdout, '12') | 
						|
        assert.strictEqual(stderr, '12') | 
						|
        done() | 
						|
      }) | 
						|
    }) | 
						|
 | 
						|
    it('should catch exceptions thrown by spawn', function (done) { | 
						|
      spawn.throws() | 
						|
      execSh('command', function (err, stdout, stderr) { | 
						|
        assert(err instanceof Error) | 
						|
        done() | 
						|
      }) | 
						|
    }) | 
						|
 | 
						|
    it('should return empty stdout and stderr when spawn throws', function (done) { | 
						|
      spawn.throws() | 
						|
      stream = null | 
						|
      execSh('command', function (_err, stdout, stderr) { | 
						|
        assert.strictEqual(stderr, '') | 
						|
        assert.strictEqual(stdout, '') | 
						|
        done() | 
						|
      }) | 
						|
    }) | 
						|
 | 
						|
    it('should run callback with error when shell exit with non-zero code', function (done) { | 
						|
      exitCode = 1 | 
						|
      execSh('command', function (err) { | 
						|
        assert(err instanceof Error) | 
						|
        assert.strictEqual(exitCode, err.code) | 
						|
        done() | 
						|
      }) | 
						|
    }) | 
						|
 | 
						|
    it('promise interface: should return promise', function () { | 
						|
      assert(execSh.promise('command') instanceof Promise) | 
						|
    }) | 
						|
 | 
						|
    it('promise interface: should resolve with stderr and stdout', function (done) { | 
						|
      execSh.promise('command').then(function (data) { | 
						|
        assert.ok('stdout' in data) | 
						|
        assert.ok('stderr' in data) | 
						|
        done() | 
						|
      }) | 
						|
    }) | 
						|
 | 
						|
    it('promise interface: should reject promise when exceptions thrown by spawn', function (done) { | 
						|
      spawn.throws() | 
						|
      execSh.promise('command').catch(function (err) { | 
						|
        assert(err instanceof Error) | 
						|
        done() | 
						|
      }) | 
						|
    }) | 
						|
  }) | 
						|
})
 | 
						|
 |