mirror of
https://github.com/oven-sh/bun
synced 2026-02-02 15:08:46 +00:00
### 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>
96 lines
2.5 KiB
TypeScript
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);
|
|
});
|
|
});
|