231 lines
5.6 KiB
JavaScript
231 lines
5.6 KiB
JavaScript
|
'use strict'
|
||
|
|
||
|
delete process.env.PYTHON
|
||
|
|
||
|
const test = require('tap').test
|
||
|
const findPython = require('../lib/find-python')
|
||
|
const execFile = require('child_process').execFile
|
||
|
const PythonFinder = findPython.test.PythonFinder
|
||
|
|
||
|
require('npmlog').level = 'warn'
|
||
|
|
||
|
test('find python', function (t) {
|
||
|
t.plan(4)
|
||
|
|
||
|
findPython.test.findPython(null, function (err, found) {
|
||
|
t.strictEqual(err, null)
|
||
|
var proc = execFile(found, ['-V'], function (err, stdout, stderr) {
|
||
|
t.strictEqual(err, null)
|
||
|
if (/Python 2/.test(stderr)) {
|
||
|
t.strictEqual(stdout, '')
|
||
|
t.ok(/Python 2/.test(stderr))
|
||
|
} else {
|
||
|
t.ok(/Python 3/.test(stdout))
|
||
|
t.strictEqual(stderr, '')
|
||
|
}
|
||
|
})
|
||
|
proc.stdout.setEncoding('utf-8')
|
||
|
proc.stderr.setEncoding('utf-8')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
function poison (object, property) {
|
||
|
function fail () {
|
||
|
console.error(Error(`Property ${property} should not have been accessed.`))
|
||
|
process.abort()
|
||
|
}
|
||
|
var descriptor = {
|
||
|
configurable: false,
|
||
|
enumerable: false,
|
||
|
get: fail,
|
||
|
set: fail
|
||
|
}
|
||
|
Object.defineProperty(object, property, descriptor)
|
||
|
}
|
||
|
|
||
|
function TestPythonFinder () {
|
||
|
PythonFinder.apply(this, arguments)
|
||
|
}
|
||
|
TestPythonFinder.prototype = Object.create(PythonFinder.prototype)
|
||
|
// Silence npmlog - remove for debugging
|
||
|
TestPythonFinder.prototype.log = {
|
||
|
silly: () => {},
|
||
|
verbose: () => {},
|
||
|
info: () => {},
|
||
|
warn: () => {},
|
||
|
error: () => {}
|
||
|
}
|
||
|
delete TestPythonFinder.prototype.env.NODE_GYP_FORCE_PYTHON
|
||
|
|
||
|
test('find python - python', function (t) {
|
||
|
t.plan(6)
|
||
|
|
||
|
var f = new TestPythonFinder('python', done)
|
||
|
f.execFile = function (program, args, opts, cb) {
|
||
|
f.execFile = function (program, args, opts, cb) {
|
||
|
poison(f, 'execFile')
|
||
|
t.strictEqual(program, '/path/python')
|
||
|
t.ok(/sys\.version_info/.test(args[1]))
|
||
|
cb(null, '2.7.15')
|
||
|
}
|
||
|
t.strictEqual(program,
|
||
|
process.platform === 'win32' ? '"python"' : 'python')
|
||
|
t.ok(/sys\.executable/.test(args[1]))
|
||
|
cb(null, '/path/python')
|
||
|
}
|
||
|
f.findPython()
|
||
|
|
||
|
function done (err, python) {
|
||
|
t.strictEqual(err, null)
|
||
|
t.strictEqual(python, '/path/python')
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('find python - python too old', function (t) {
|
||
|
t.plan(2)
|
||
|
|
||
|
var f = new TestPythonFinder(null, done)
|
||
|
f.execFile = function (program, args, opts, cb) {
|
||
|
if (/sys\.executable/.test(args[args.length - 1])) {
|
||
|
cb(null, '/path/python')
|
||
|
} else if (/sys\.version_info/.test(args[args.length - 1])) {
|
||
|
cb(null, '2.3.4')
|
||
|
} else {
|
||
|
t.fail()
|
||
|
}
|
||
|
}
|
||
|
f.findPython()
|
||
|
|
||
|
function done (err) {
|
||
|
t.ok(/Could not find any Python/.test(err))
|
||
|
t.ok(/not supported/i.test(f.errorLog))
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('find python - no python', function (t) {
|
||
|
t.plan(2)
|
||
|
|
||
|
var f = new TestPythonFinder(null, done)
|
||
|
f.execFile = function (program, args, opts, cb) {
|
||
|
if (/sys\.executable/.test(args[args.length - 1])) {
|
||
|
cb(new Error('not found'))
|
||
|
} else if (/sys\.version_info/.test(args[args.length - 1])) {
|
||
|
cb(new Error('not a Python executable'))
|
||
|
} else {
|
||
|
t.fail()
|
||
|
}
|
||
|
}
|
||
|
f.findPython()
|
||
|
|
||
|
function done (err) {
|
||
|
t.ok(/Could not find any Python/.test(err))
|
||
|
t.ok(/not in PATH/.test(f.errorLog))
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('find python - no python2, no python, unix', function (t) {
|
||
|
t.plan(2)
|
||
|
|
||
|
var f = new TestPythonFinder(null, done)
|
||
|
f.checkPyLauncher = t.fail
|
||
|
f.win = false
|
||
|
|
||
|
f.execFile = function (program, args, opts, cb) {
|
||
|
if (/sys\.executable/.test(args[args.length - 1])) {
|
||
|
cb(new Error('not found'))
|
||
|
} else {
|
||
|
t.fail()
|
||
|
}
|
||
|
}
|
||
|
f.findPython()
|
||
|
|
||
|
function done (err) {
|
||
|
t.ok(/Could not find any Python/.test(err))
|
||
|
t.ok(/not in PATH/.test(f.errorLog))
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('find python - no python, use python launcher', function (t) {
|
||
|
t.plan(3)
|
||
|
|
||
|
var f = new TestPythonFinder(null, done)
|
||
|
f.win = true
|
||
|
|
||
|
f.execFile = function (program, args, opts, cb) {
|
||
|
if (program === 'py.exe') {
|
||
|
t.notEqual(args.indexOf('-c'), -1)
|
||
|
return cb(null, 'Z:\\snake.exe')
|
||
|
}
|
||
|
if (/sys\.executable/.test(args[args.length - 1])) {
|
||
|
cb(new Error('not found'))
|
||
|
} else if (f.winDefaultLocations.includes(program)) {
|
||
|
cb(new Error('not found'))
|
||
|
} else if (/sys\.version_info/.test(args[args.length - 1])) {
|
||
|
if (program === 'Z:\\snake.exe') {
|
||
|
cb(null, '2.7.14')
|
||
|
} else {
|
||
|
t.fail()
|
||
|
}
|
||
|
} else {
|
||
|
t.fail()
|
||
|
}
|
||
|
}
|
||
|
f.findPython()
|
||
|
|
||
|
function done (err, python) {
|
||
|
t.strictEqual(err, null)
|
||
|
t.strictEqual(python, 'Z:\\snake.exe')
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('find python - no python, no python launcher, good guess', function (t) {
|
||
|
t.plan(2)
|
||
|
|
||
|
var re = /C:[\\/]Python37[\\/]python[.]exe/
|
||
|
var f = new TestPythonFinder(null, done)
|
||
|
f.win = true
|
||
|
|
||
|
f.execFile = function (program, args, opts, cb) {
|
||
|
if (program === 'py.exe') {
|
||
|
return cb(new Error('not found'))
|
||
|
}
|
||
|
if (/sys\.executable/.test(args[args.length - 1])) {
|
||
|
cb(new Error('not found'))
|
||
|
} else if (re.test(program) &&
|
||
|
/sys\.version_info/.test(args[args.length - 1])) {
|
||
|
cb(null, '3.7.3')
|
||
|
} else {
|
||
|
t.fail()
|
||
|
}
|
||
|
}
|
||
|
f.findPython()
|
||
|
|
||
|
function done (err, python) {
|
||
|
t.strictEqual(err, null)
|
||
|
t.ok(re.test(python))
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('find python - no python, no python launcher, bad guess', function (t) {
|
||
|
t.plan(2)
|
||
|
|
||
|
var f = new TestPythonFinder(null, done)
|
||
|
f.win = true
|
||
|
|
||
|
f.execFile = function (program, args, opts, cb) {
|
||
|
if (/sys\.executable/.test(args[args.length - 1])) {
|
||
|
cb(new Error('not found'))
|
||
|
} else if (/sys\.version_info/.test(args[args.length - 1])) {
|
||
|
cb(new Error('not a Python executable'))
|
||
|
} else {
|
||
|
t.fail()
|
||
|
}
|
||
|
}
|
||
|
f.findPython()
|
||
|
|
||
|
function done (err) {
|
||
|
t.ok(/Could not find any Python/.test(err))
|
||
|
t.ok(/not in PATH/.test(f.errorLog))
|
||
|
}
|
||
|
})
|