Skip to content

Commit db42728

Browse files
committed
unit tests
1 parent 0ada32e commit db42728

File tree

6 files changed

+128
-1
lines changed

6 files changed

+128
-1
lines changed

fixtures/async-exit-code.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import process from 'node:process';
2+
import exitHook, {asyncExitHook, gracefulExit} from '../index.js';
3+
4+
exitHook(() => {
5+
console.log('foo');
6+
});
7+
8+
exitHook(() => {
9+
console.log('bar');
10+
});
11+
12+
const unsubscribe = exitHook(() => {
13+
console.log('baz');
14+
});
15+
16+
unsubscribe();
17+
18+
asyncExitHook(
19+
async () => {
20+
await new Promise(resolve => {
21+
setTimeout(() => {
22+
resolve();
23+
}, 100);
24+
});
25+
26+
console.log('quux');
27+
},
28+
{
29+
wait: 200,
30+
},
31+
);
32+
33+
process.exitCode = 1;
34+
35+
if (process.env.EXIT_HOOK_SYNC === '1') {
36+
process.exit(); // eslint-disable-line unicorn/no-process-exit
37+
}
38+
39+
gracefulExit();

fixtures/empty-exit-code.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import process from 'node:process';
2+
import exitHook from '../index.js';
3+
4+
process.exitCode = 1;
5+
exitHook(() => {
6+
// https://github.com/sindresorhus/exit-hook/issues/23
7+
});

fixtures/signal-exit-code.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import exitHook, {asyncExitHook} from '../index.js';
2+
3+
exitHook(signal => {
4+
console.log(signal);
5+
});
6+
7+
asyncExitHook(async signal => {
8+
console.log(signal);
9+
}, {
10+
wait: 200,
11+
});
12+
13+
setInterval(() => {}, 1e9);

fixtures/sync-exit-code.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import process from 'node:process';
2+
import exitHook from '../index.js';
3+
4+
exitHook(() => {
5+
console.log('foo');
6+
});
7+
8+
exitHook(() => {
9+
console.log('bar');
10+
});
11+
12+
const unsubscribe = exitHook(() => {
13+
console.log('baz');
14+
});
15+
16+
unsubscribe();
17+
18+
process.exitCode = 1;
19+
20+
process.exit(); // eslint-disable-line unicorn/no-process-exit

index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ async function exit(shouldManuallyExit, isSynchronous, signal) {
2323
].join(' '));
2424
}
2525

26-
const exitCode = (typeof process.exitCode === 'number') ? process.exitCode : 128 + signal;
26+
const exitCode = (typeof process.exitCode === 'number' || typeof process.exitCode === 'string') ? process.exitCode : 128 + signal;
2727

2828
const done = (force = false) => {
2929
if (force === true || shouldManuallyExit === true) {

test.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,52 @@ test('main', async t => {
1010
t.is(exitCode, 0);
1111
});
1212

13+
test('main with exitCode', async t => {
14+
try {
15+
await execa(process.execPath, ['./fixtures/sync-exit-code.js']);
16+
t.fail();
17+
} catch ({stdout, stderr, exitCode}) {
18+
t.is(stdout, 'foo\nbar');
19+
t.is(stderr, '');
20+
t.is(exitCode, 1);
21+
}
22+
});
23+
1324
test('main-empty', async t => {
1425
const {stderr, exitCode} = await execa(process.execPath, ['./fixtures/empty.js']);
1526
t.is(stderr, '');
1627
t.is(exitCode, 0);
1728
});
1829

30+
test('main-empty with exitCode', async t => {
31+
try {
32+
await execa(process.execPath, ['./fixtures/empty-exit-code.js']);
33+
t.fail();
34+
} catch ({stdout, stderr, exitCode}) {
35+
t.is(stdout, '');
36+
t.is(stderr, '');
37+
t.is(exitCode, 1);
38+
}
39+
});
40+
1941
test('main-async', async t => {
2042
const {stdout, stderr, exitCode} = await execa(process.execPath, ['./fixtures/async.js']);
2143
t.is(stdout, 'foo\nbar\nquux');
2244
t.is(stderr, '');
2345
t.is(exitCode, 0);
2446
});
2547

48+
test('main-async with exitCode', async t => {
49+
try {
50+
await execa(process.execPath, ['./fixtures/async-exit-code.js']);
51+
t.fail();
52+
} catch ({stdout, stderr, exitCode}) {
53+
t.is(stdout, 'foo\nbar\nquux');
54+
t.is(stderr, '');
55+
t.is(exitCode, 1);
56+
}
57+
});
58+
2659
test('main-async-notice', async t => {
2760
const {stdout, stderr, exitCode} = await execa(process.execPath, ['./fixtures/async.js'], {
2861
env: {
@@ -34,6 +67,21 @@ test('main-async-notice', async t => {
3467
t.is(exitCode, 0);
3568
});
3669

70+
test('main-async-notice with exitCode', async t => {
71+
try {
72+
await execa(process.execPath, ['./fixtures/async-exit-code.js'], {
73+
env: {
74+
EXIT_HOOK_SYNC: '1',
75+
},
76+
});
77+
t.fail();
78+
} catch ({stdout, stderr, exitCode}) {
79+
t.is(stdout, 'foo\nbar');
80+
t.regex(stderr, /SYNCHRONOUS TERMINATION NOTICE/);
81+
t.is(exitCode, 1);
82+
}
83+
});
84+
3785
test('listener count', t => {
3886
t.is(process.listenerCount('exit'), 0);
3987

0 commit comments

Comments
 (0)