Files
bun.sh/test/js/node/readline/readline_promises.node.test.ts
Alistair Smith efdbe3b54f bun install Security Scanner API (#21183)
### What does this PR do?

Fixes #22014

todo:
- [x] not spawn sync
- [x] better comm to subprocess (not stderr)
- [x] tty
- [x] more tests (also include some tests for the actual implementation
of a provider)
- [x] disable autoinstall?

Scanner template: https://github.com/oven-sh/security-scanner-template

<!-- **Please explain what your changes do**, example: -->

<!--

This adds a new flag --bail to bun test. When set, it will stop running
tests after the first failure. This is useful for CI environments where
you want to fail fast.

-->

---

- [x] Documentation or TypeScript types (it's okay to leave the rest
blank in this case)
- [x] Code changes

### How did you verify your code works?

<!-- **For code changes, please include automated tests**. Feel free to
uncomment the line below -->

<!-- I wrote automated tests -->

<!-- If JavaScript/TypeScript modules or builtins changed:

- [ ] I included a test for the new code, or existing tests cover it
- [ ] I ran my tests locally and they pass (`bun-debug test
test-file-name.test`)

-->

<!-- If Zig files changed:

- [ ] I checked the lifetime of memory allocated to verify it's (1)
freed and (2) only freed when it should be
- [ ] I included a test for the new code, or an existing test covers it
- [ ] JSValue used outside of the stack is either wrapped in a
JSC.Strong or is JSValueProtect'ed
- [ ] I wrote TypeScript/JavaScript tests and they pass locally
(`bun-debug test test-file-name.test`)
-->

<!-- If new methods, getters, or setters were added to a publicly
exposed class:

- [ ] I added TypeScript types for the new methods, getters, or setters
-->

<!-- If dependencies in tests changed:

- [ ] I made sure that specific versions of dependencies are used
instead of ranged or tagged versions
-->

<!-- If a new builtin ESM/CJS module was added:

- [ ] I updated Aliases in `module_loader.zig` to include the new module
- [ ] I added a test that imports the module
- [ ] I added a test that require() the module
-->


tests (bad currently)

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Dylan Conway <dylan-conway@users.noreply.github.com>
Co-authored-by: Dylan Conway <dylan.conway567@gmail.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2025-08-21 14:53:50 -07:00

96 lines
2.5 KiB
TypeScript

import { createTest } from "node-harness";
import { EventEmitter } from "node:events";
import readlinePromises from "node:readline/promises";
const { describe, it, expect, createDoneDotAll, createCallCheckCtx, assert } = createTest(import.meta.path);
// ----------------------------------------------------------------------------
// Helpers
// ----------------------------------------------------------------------------
class FakeInput extends EventEmitter {
output = "";
resume() {}
pause() {}
write(data: any) {
this.output += data;
}
end() {}
reset() {
this.output = "";
}
}
// ----------------------------------------------------------------------------
// Tests
// ----------------------------------------------------------------------------
describe("readline/promises.createInterface()", () => {
it("should throw an error when failed completion", done => {
const createDone = createDoneDotAll(done);
const { mustCall, mustNotCall } = createCallCheckCtx(createDone());
const fi = new FakeInput();
// @ts-ignore
const rli = new readlinePromises.Interface({
input: fi,
output: fi,
terminal: true,
completer: mustCall(() => Promise.reject(new Error("message"))),
});
rli.on("line", mustNotCall());
fi.emit("data", "\t");
queueMicrotask(() => {
expect(fi.output).toMatch(/^Tab completion error/);
rli.close();
done();
});
});
it("should support Symbol.dispose for using statements", () => {
const fi = new FakeInput();
let closed = false;
{
using rl = readlinePromises.createInterface({
input: fi,
output: fi,
});
rl.on("close", () => {
closed = true;
});
// Verify the interface has the Symbol.dispose method
assert.strictEqual(typeof rl[Symbol.dispose], "function");
assert.strictEqual(!closed, true);
}
// After exiting the using block, the interface should be closed
assert.strictEqual(closed, true);
});
it("should support Symbol.dispose as alias for close()", () => {
const fi = new FakeInput();
let closed = false;
const rl = readlinePromises.createInterface({
input: fi,
output: fi,
});
rl.on("close", () => {
closed = true;
});
// Verify Symbol.dispose exists and works the same as close()
assert.strictEqual(typeof rl[Symbol.dispose], "function");
assert.strictEqual(!closed, true);
rl[Symbol.dispose]();
assert.strictEqual(closed, true);
assert.strictEqual(rl.closed, true);
});
});