195 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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.deepEqual(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.deepEqual(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.deepEqual(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.equal(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(data.hasOwnProperty('stdout'))
 | |
|         assert(data.hasOwnProperty('stderr'))
 | |
|         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()
 | |
|       })
 | |
|     })
 | |
|   })
 | |
| })
 |