Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

switch to esmock, re #221 #225

Merged
merged 5 commits into from
Jul 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"node": ">=14.16"
},
"scripts": {
"test": "xo && ava"
"test": "xo && NODE_OPTIONS='--loader=esmock --no-warnings' ava"
},
"files": [
"index.js",
Expand Down Expand Up @@ -56,7 +56,7 @@
"ava": "^4.3.0",
"clear-module": "^4.1.2",
"fixture-stdout": "^0.2.1",
"mock-require": "^3.0.3",
"esmock": "^1.7.8",
"strip-ansi": "^7.0.1",
"xo": "^0.50.0"
},
Expand Down
40 changes: 17 additions & 23 deletions test/notify.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import process from 'node:process';
import {inherits} from 'node:util';
import clearModule from 'clear-module';
import FixtureStdout from 'fixture-stdout';
import stripAnsi from 'strip-ansi';
import test from 'ava';
import mock from 'mock-require';
import esmock from 'esmock';

const stderr = new FixtureStdout({
stream: process.stderr,
Expand All @@ -20,16 +19,12 @@ function Control(shouldNotifyInNpmScript) {
}

const setupTest = async isNpmReturnValue => {
for (const name of ['..', 'is-npm']) {
clearModule(name);
}

process.stdout.isTTY = true;

// TODO: Switch to https://github.com/iambumblehead/esmock
mock('is-npm', {isNpmOrYarn: isNpmReturnValue || false});
const UpdateNotifier = await esmock('../update-notifier.js', {
'is-npm': {isNpmOrYarn: isNpmReturnValue || false},
});

const {default: UpdateNotifier} = await import('../update-notifier.js');
inherits(Control, UpdateNotifier);
};

Expand All @@ -45,12 +40,11 @@ test.beforeEach(async () => {
});

test.afterEach(() => {
mock.stopAll();
stderr.release();
errorLogs = '';
});

test.failing('use pretty boxen message by default', t => {
test('use pretty boxen message by default', t => {
const notifier = new Control();
notifier.notify({defer: false, isGlobal: true});

Expand All @@ -67,7 +61,7 @@ test.failing('use pretty boxen message by default', t => {
`);
});

test.failing('supports custom message', t => {
test('supports custom message', t => {
const notifier = new Control();
notifier.notify({
defer: false,
Expand All @@ -78,7 +72,7 @@ test.failing('supports custom message', t => {
t.true(stripAnsi(errorLogs).includes('custom message'));
});

test.failing('supports message with placeholders', t => {
test('supports message with placeholders', t => {
const notifier = new Control();
notifier.notify({
defer: false,
Expand All @@ -104,42 +98,42 @@ test.failing('supports message with placeholders', t => {
`);
});

test.failing('exclude -g argument when `isGlobal` option is `false`', t => {
test('exclude -g argument when `isGlobal` option is `false`', t => {
const notifier = new Control();
notifier.notify({defer: false, isGlobal: false});
t.not(stripAnsi(errorLogs).indexOf('Run npm i update-notifier-tester to update'), -1);
});

test.failing('shouldNotifyInNpmScript should default to false', t => {
test('shouldNotifyInNpmScript should default to false', t => {
const notifier = new Control();
notifier.notify({defer: false});
t.not(stripAnsi(errorLogs).indexOf('Update available'), -1);
});

test('suppress output when running as npm script', t => {
setupTest(true);
test('suppress output when running as npm script', async t => {
await setupTest(true);
const notifier = new Control();
notifier.notify({defer: false});
t.false(stripAnsi(errorLogs).includes('Update available'));
});

test('should output if running as npm script and shouldNotifyInNpmScript option set', t => {
setupTest(true);
test('should output if running as npm script and shouldNotifyInNpmScript option set', async t => {
await setupTest(true);
const notifier = new Control(true);
notifier.notify({defer: false});
t.true(stripAnsi(errorLogs).includes('Update available'));
});

test('should not output if current version is the latest', t => {
setupTest(true);
test('should not output if current version is the latest', async t => {
await setupTest(true);
const notifier = new Control(true);
notifier.update.current = '1.0.0';
notifier.notify({defer: false});
t.false(stripAnsi(errorLogs).includes('Update available'));
});

test('should not output if current version is more recent than the reported latest', t => {
setupTest(true);
test('should not output if current version is more recent than the reported latest', async t => {
await setupTest(true);
const notifier = new Control(true);
notifier.update.current = '1.0.1';
notifier.notify({defer: false});
Expand Down
21 changes: 13 additions & 8 deletions test/update-notifier.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import process from 'node:process';
import fs from 'node:fs';
import test from 'ava';
import mockRequire from 'mock-require';
import updateNotifier from '../index.js';

mockRequire('is-ci', false);
import esmock from 'esmock';

const generateSettings = (options = {}) => ({
pkg: {
Expand All @@ -22,7 +19,6 @@ test.beforeEach(() => {
process.env.NODE_ENV = 'ava-test';

argv = [...process.argv];
configstorePath = updateNotifier(generateSettings()).config.path;
});

test.afterEach(() => {
Expand All @@ -34,30 +30,39 @@ test.afterEach(() => {
});

test('fetch info', async t => {
const updateNotifier = await esmock('../index.js', undefined, {'is-ci': false});
configstorePath = updateNotifier(generateSettings()).config.path;
const update = await updateNotifier(generateSettings()).fetchInfo();
console.log(update);
t.is(update.latest, '0.0.2');
});

test('fetch info with dist-tag', async t => {
const updateNotifier = await esmock('../index.js', undefined, {'is-ci': false});
configstorePath = updateNotifier(generateSettings()).config.path;
const update = await updateNotifier(generateSettings({distTag: '0.0.3-rc1'})).fetchInfo();
t.is(update.latest, '0.0.3-rc1');
});

test('don\'t initialize configStore when NO_UPDATE_NOTIFIER is set', t => {
test('don\'t initialize configStore when NO_UPDATE_NOTIFIER is set', async t => {
const updateNotifier = await esmock('../index.js', undefined, {'is-ci': false});
configstorePath = updateNotifier(generateSettings()).config.path;
process.env.NO_UPDATE_NOTIFIER = '1';
const notifier = updateNotifier(generateSettings());
t.is(notifier.config, undefined);
});

test('don\'t initialize configStore when --no-update-notifier is set', t => {
test('don\'t initialize configStore when --no-update-notifier is set', async t => {
const updateNotifier = await esmock('../index.js', undefined, {'is-ci': false});
configstorePath = updateNotifier(generateSettings()).config.path;
process.argv.push('--no-update-notifier');
const notifier = updateNotifier(generateSettings());
t.is(notifier.config, undefined);
});

test('don\'t initialize configStore when NODE_ENV === "test"', t => {
test('don\'t initialize configStore when NODE_ENV === "test"', async t => {
process.env.NODE_ENV = 'test';
const updateNotifier = await esmock('../index.js', undefined, {'is-ci': false});
const notifier = updateNotifier(generateSettings());
t.is(notifier.config, undefined);
});