Skip to content

Commit 5970f74

Browse files
committed
test: verify cli Promise waits for async callback/command completion
1 parent 957e655 commit 5970f74

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

tests/specs/cli.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,42 @@ export default testSuite(({ describe }) => {
8383
// And it's awaitable
8484
await result;
8585
});
86+
87+
test('cli Promise waits for callback to complete', async () => {
88+
let callbackCompleted = false;
89+
90+
const result = cli({}, async () => {
91+
await setImmediate();
92+
callbackCompleted = true;
93+
});
94+
95+
// Callback shouldn't have completed yet
96+
expect(callbackCompleted).toBe(false);
97+
98+
// After awaiting cli, callback should be complete
99+
await result;
100+
expect(callbackCompleted).toBe(true);
101+
});
102+
103+
test('cli Promise never resolves if callback never resolves', async () => {
104+
let cliResolved = false;
105+
106+
const result = cli({}, async () => {
107+
// Never resolve - hang forever
108+
await new Promise(() => {});
109+
});
110+
111+
// Race the cli promise against a timeout
112+
await Promise.race([
113+
result.then(() => {
114+
cliResolved = true;
115+
}),
116+
setImmediate(50),
117+
]);
118+
119+
// cli should not have resolved
120+
expect(cliResolved).toBe(false);
121+
});
86122
});
87123
});
88124
});

tests/specs/command.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { setImmediate } from 'node:timers/promises';
12
import { testSuite, expect } from 'manten';
23
import { spy } from 'nanospy';
34
import { cli, command } from '#cleye';
@@ -344,5 +345,63 @@ export default testSuite(({ describe }) => {
344345
expect(cliCallback.called).toBe(false);
345346
});
346347
});
348+
349+
describe('async command callbacks', ({ test }) => {
350+
test('cli Promise waits for command callback to complete', async () => {
351+
let commandCompleted = false;
352+
353+
const testCommand = command({
354+
name: 'test',
355+
}, async () => {
356+
await setImmediate();
357+
commandCompleted = true;
358+
});
359+
360+
const result = cli(
361+
{
362+
commands: [testCommand],
363+
},
364+
undefined,
365+
['test'],
366+
);
367+
368+
// Command callback shouldn't have completed yet
369+
expect(commandCompleted).toBe(false);
370+
371+
// After awaiting cli, command callback should be complete
372+
await result;
373+
expect(commandCompleted).toBe(true);
374+
});
375+
376+
test('cli Promise never resolves if command callback never resolves', async () => {
377+
let cliResolved = false;
378+
379+
const testCommand = command({
380+
name: 'test',
381+
}, async () => {
382+
// Never resolve - hang forever
383+
await new Promise(() => {});
384+
});
385+
386+
const result = cli(
387+
{
388+
commands: [testCommand],
389+
},
390+
undefined,
391+
['test'],
392+
);
393+
394+
// Race the cli promise against a timeout
395+
await Promise.race([
396+
result.then(() => {
397+
cliResolved = true;
398+
}),
399+
setImmediate(50),
400+
]);
401+
402+
// cli should not have resolved
403+
expect(cliResolved).toBe(false);
404+
});
405+
});
347406
});
348407
});

0 commit comments

Comments
 (0)