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.
		
		
		
		
			
				
					195 lines
				
				5.4 KiB
			
		
		
			
		
	
	
					195 lines
				
				5.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								/* 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()
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 |