var fs = require('fs') var path = require('path') var mkdirp = require('mkdirp') var osenv = require('osenv') var rimraf = require('rimraf') var test = require('tap').test var common = require('../common-tap.js') var pkg = path.resolve(__dirname, 'lifecycle-path') var link = path.resolve(pkg, 'node-bin') var PATH if (process.platform === 'win32') { // On Windows the 'comspec' environment variable is used, // so cmd.exe does not need to be on the path. PATH = 'C:\\foo\\bar' } else { // On non-Windows, without the path to the shell, nothing usually works. PATH = '/bin:/usr/bin' } var printPath = 'console.log(process.env.PATH)\n' var json = { name: 'glorb', version: '1.2.3', scripts: { path: './node-bin/node print-path.js' } } test('setup', function (t) { cleanup() mkdirp.sync(pkg) fs.writeFileSync( path.join(pkg, 'package.json'), JSON.stringify(json, null, 2) ) fs.writeFileSync(path.join(pkg, 'print-path.js'), printPath) fs.symlinkSync(path.dirname(process.execPath), link, 'dir') t.end() }) test('make sure the path is correct', function (t) { common.npm(['run-script', 'path'], { cwd: pkg, env: { PATH: PATH, stdio: [ 0, 'pipe', 2 ] } }, function (er, code, stdout) { if (er) throw er t.equal(code, 0, 'exit code') // remove the banner, we just care about the last line stdout = stdout.trim().split(/\r|\n/).pop() var pathSplit = process.platform === 'win32' ? ';' : ':' var root = path.resolve(__dirname, '../..') var actual = stdout.split(pathSplit).map(function (p) { if (p.indexOf(root) === 0) { p = '{{ROOT}}' + p.substr(root.length) } return p.replace(/\\/g, '/') }) // get the ones we tacked on, then the system-specific requirements var expect = [ '{{ROOT}}/bin/node-gyp-bin', '{{ROOT}}/test/tap/lifecycle-path/node_modules/.bin', path.dirname(process.execPath) ].concat(PATH.split(pathSplit).map(function (p) { return p.replace(/\\/g, '/') })) t.same(actual, expect) t.end() }) }) test('cleanup', function (t) { cleanup() t.end() }) function cleanup () { process.chdir(osenv.tmpdir()) rimraf.sync(pkg) }