From 071d0a282a14633493e9d8b4e5b686c43da64368 Mon Sep 17 00:00:00 2001 From: ehmicky Date: Wed, 18 May 2022 07:40:30 +0200 Subject: [PATCH] Re-enable Windows in CI (#500) --- .github/workflows/main.yml | 2 +- package.json | 1 + test/command.js | 6 ++---- test/error.js | 5 ++--- test/helpers/fixtures-dir.js | 14 ++++++++++++++ test/kill.js | 5 ++--- test/node.js | 5 ++--- test/override-promise.js | 7 ++----- test/promise.js | 6 ++---- test/stream.js | 5 ++--- test/test.js | 20 ++++++++++++++------ 11 files changed, 44 insertions(+), 32 deletions(-) create mode 100644 test/helpers/fixtures-dir.js diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dc2cede0d2..1cc851db09 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,7 +16,7 @@ jobs: os: - ubuntu-latest - macos-latest - # - windows-latest + - windows-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 diff --git a/package.json b/package.json index 9c420b204b..8acb858de4 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "get-node": "^12.0.0", "is-running": "^2.1.0", "p-event": "^5.0.1", + "path-key": "^4.0.0", "tempfile": "^4.0.0", "tsd": "^0.19.1", "xo": "^0.48.0" diff --git a/test/command.js b/test/command.js index b020d7a2ae..4286b4996b 100644 --- a/test/command.js +++ b/test/command.js @@ -1,10 +1,8 @@ -import path from 'node:path'; -import process from 'node:process'; -import {fileURLToPath} from 'node:url'; import test from 'ava'; import {execa, execaSync, execaCommand, execaCommandSync} from '../index.js'; +import {setFixtureDir} from './helpers/fixtures-dir.js'; -process.env.PATH = fileURLToPath(new URL('fixtures', import.meta.url)) + path.delimiter + process.env.PATH; +setFixtureDir(); const command = async (t, expected, ...args) => { const {command: failCommand} = await t.throwsAsync(execa('fail.js', args)); diff --git a/test/error.js b/test/error.js index 378ef34014..36bc0ec413 100644 --- a/test/error.js +++ b/test/error.js @@ -1,14 +1,13 @@ -import path from 'node:path'; import process from 'node:process'; import childProcess from 'node:child_process'; -import {fileURLToPath} from 'node:url'; import {promisify} from 'node:util'; import test from 'ava'; import {execa, execaSync} from '../index.js'; +import {setFixtureDir} from './helpers/fixtures-dir.js'; const pExec = promisify(childProcess.exec); -process.env.PATH = fileURLToPath(new URL('fixtures', import.meta.url)) + path.delimiter + process.env.PATH; +setFixtureDir(); const TIMEOUT_REGEXP = /timed out after/; diff --git a/test/helpers/fixtures-dir.js b/test/helpers/fixtures-dir.js new file mode 100644 index 0000000000..15a978b445 --- /dev/null +++ b/test/helpers/fixtures-dir.js @@ -0,0 +1,14 @@ +import path from 'node:path'; +import process from 'node:process'; +import {fileURLToPath} from 'node:url'; +import pathKey from 'path-key'; + +export const PATH_KEY = pathKey(); +const FIXTURES_DIR = fileURLToPath(new URL('../fixtures', import.meta.url)); + +// Add the fixtures directory to PATH so fixtures can be executed without adding +// `node`. This is only meant to make writing tests simpler. +export const setFixtureDir = () => { + process.env[PATH_KEY] = FIXTURES_DIR + path.delimiter + process.env[PATH_KEY]; +}; + diff --git a/test/kill.js b/test/kill.js index c0a02bb045..dc6b8922d3 100644 --- a/test/kill.js +++ b/test/kill.js @@ -1,12 +1,11 @@ -import path from 'node:path'; import process from 'node:process'; -import {fileURLToPath} from 'node:url'; import test from 'ava'; import {pEvent} from 'p-event'; import isRunning from 'is-running'; import {execa, execaSync} from '../index.js'; +import {setFixtureDir} from './helpers/fixtures-dir.js'; -process.env.PATH = fileURLToPath(new URL('fixtures', import.meta.url)) + path.delimiter + process.env.PATH; +setFixtureDir(); const TIMEOUT_REGEXP = /timed out after/; diff --git a/test/node.js b/test/node.js index 31a132a792..e50b057318 100644 --- a/test/node.js +++ b/test/node.js @@ -1,11 +1,10 @@ -import path from 'node:path'; import process from 'node:process'; -import {fileURLToPath} from 'node:url'; import test from 'ava'; import {pEvent} from 'p-event'; import {execaNode} from '../index.js'; +import {setFixtureDir} from './helpers/fixtures-dir.js'; -process.env.PATH = fileURLToPath(new URL('fixtures', import.meta.url)) + path.delimiter + process.env.PATH; +setFixtureDir(); async function inspectMacro(t, input) { const originalArgv = process.execArgv; diff --git a/test/override-promise.js b/test/override-promise.js index 660ffe45ed..076b54b4bd 100644 --- a/test/override-promise.js +++ b/test/override-promise.js @@ -1,15 +1,12 @@ -import path from 'node:path'; -import process from 'node:process'; -import {fileURLToPath} from 'node:url'; import test from 'ava'; // The helper module overrides Promise on import so has to be imported before `execa`. import {restorePromise} from './helpers/override-promise.js'; // eslint-disable-next-line import/order import {execa} from '../index.js'; +import {setFixtureDir} from './helpers/fixtures-dir.js'; restorePromise(); - -process.env.PATH = fileURLToPath(new URL('fixtures', import.meta.url)) + path.delimiter + process.env.PATH; +setFixtureDir(); test('should work with third-party Promise', async t => { const {stdout} = await execa('noop.js', ['foo']); diff --git a/test/promise.js b/test/promise.js index c32e91346d..f2310c274e 100644 --- a/test/promise.js +++ b/test/promise.js @@ -1,10 +1,8 @@ -import path from 'node:path'; -import process from 'node:process'; -import {fileURLToPath} from 'node:url'; import test from 'ava'; import {execa} from '../index.js'; +import {setFixtureDir} from './helpers/fixtures-dir.js'; -process.env.PATH = fileURLToPath(new URL('fixtures', import.meta.url)) + path.delimiter + process.env.PATH; +setFixtureDir(); test('promise methods are not enumerable', t => { const descriptors = Object.getOwnPropertyDescriptors(execa('noop.js')); diff --git a/test/stream.js b/test/stream.js index b3341aafdc..32c3d0c678 100644 --- a/test/stream.js +++ b/test/stream.js @@ -1,15 +1,14 @@ import {Buffer} from 'node:buffer'; -import path from 'node:path'; import process from 'node:process'; import fs from 'node:fs'; -import {fileURLToPath} from 'node:url'; import Stream from 'node:stream'; import test from 'ava'; import getStream from 'get-stream'; import tempfile from 'tempfile'; import {execa, execaSync} from '../index.js'; +import {setFixtureDir} from './helpers/fixtures-dir.js'; -process.env.PATH = fileURLToPath(new URL('fixtures', import.meta.url)) + path.delimiter + process.env.PATH; +setFixtureDir(); test('buffer', async t => { const {stdout} = await execa('noop.js', ['foo'], {encoding: null}); diff --git a/test/test.js b/test/test.js index 69cced782d..da0cb67aed 100644 --- a/test/test.js +++ b/test/test.js @@ -5,8 +5,9 @@ import test from 'ava'; import isRunning from 'is-running'; import getNode from 'get-node'; import {execa, execaSync} from '../index.js'; +import {setFixtureDir, PATH_KEY} from './helpers/fixtures-dir.js'; -process.env.PATH = fileURLToPath(new URL('fixtures', import.meta.url)) + path.delimiter + process.env.PATH; +setFixtureDir(); process.env.FOO = 'foo'; const ENOENT_REGEXP = process.platform === 'win32' ? /failed with exit code 1/ : /spawn.* ENOENT/; @@ -76,16 +77,23 @@ test('stripFinalNewline in sync mode on failure', t => { t.is(stderr, 'foo'); }); +const getPathWithoutLocalDir = () => { + const newPath = process.env[PATH_KEY].split(path.delimiter).filter(pathDir => !BIN_DIR_REGEXP.test(pathDir)).join(path.delimiter); + return {[PATH_KEY]: newPath}; +}; + +const BIN_DIR_REGEXP = /node_modules[\\/]\.bin/; + test('preferLocal: true', async t => { - await t.notThrowsAsync(execa('ava', ['--version'], {preferLocal: true, env: {Path: '', PATH: ''}})); + await t.notThrowsAsync(execa('ava', ['--version'], {preferLocal: true, env: getPathWithoutLocalDir()})); }); test('preferLocal: false', async t => { - await t.throwsAsync(execa('ava', ['--version'], {preferLocal: false, env: {Path: '', PATH: ''}}), {message: ENOENT_REGEXP}); + await t.throwsAsync(execa('ava', ['--version'], {preferLocal: false, env: getPathWithoutLocalDir()}), {message: ENOENT_REGEXP}); }); test('preferLocal: undefined', async t => { - await t.throwsAsync(execa('ava', ['--version'], {env: {Path: '', PATH: ''}}), {message: ENOENT_REGEXP}); + await t.throwsAsync(execa('ava', ['--version'], {env: getPathWithoutLocalDir()}), {message: ENOENT_REGEXP}); }); test('localDir option', async t => { @@ -189,12 +197,12 @@ test('use environment variables by default', async t => { }); test('extend environment variables by default', async t => { - const {stdout} = await execa('environment.js', [], {env: {BAR: 'bar'}}); + const {stdout} = await execa('environment.js', [], {env: {BAR: 'bar', [PATH_KEY]: process.env[PATH_KEY]}}); t.deepEqual(stdout.split('\n'), ['foo', 'bar']); }); test('do not extend environment with `extendEnv: false`', async t => { - const {stdout} = await execa('environment.js', [], {env: {BAR: 'bar', PATH: process.env.PATH}, extendEnv: false}); + const {stdout} = await execa('environment.js', [], {env: {BAR: 'bar', [PATH_KEY]: process.env[PATH_KEY]}, extendEnv: false}); t.deepEqual(stdout.split('\n'), ['undefined', 'bar']); });