deno/tests/unit_node/events_test.ts
Nicholas Berlette a70f1cfab4
Some checks failed
ci / pre-build (push) Has been cancelled
ci / lint debug windows-x86_64 (push) Has been cancelled
ci / test debug linux-x86_64 (push) Has been cancelled
ci / test release linux-x86_64 (push) Has been cancelled
ci / test debug macos-x86_64 (push) Has been cancelled
ci / test release macos-x86_64 (push) Has been cancelled
ci / test debug windows-x86_64 (push) Has been cancelled
ci / test release windows-x86_64 (push) Has been cancelled
ci / build libs (push) Has been cancelled
ci / test debug linux-aarch64 (push) Has been cancelled
ci / test release linux-aarch64 (push) Has been cancelled
ci / test debug macos-aarch64 (push) Has been cancelled
ci / test release macos-aarch64 (push) Has been cancelled
ci / bench release linux-x86_64 (push) Has been cancelled
ci / lint debug linux-x86_64 (push) Has been cancelled
ci / lint debug macos-x86_64 (push) Has been cancelled
ci / publish canary (push) Has been cancelled
fix(node): use primordials more consistently in _events.mjs (#29930)
Fixes #29929

---------

Signed-off-by: Nicholas Berlette <11234104+nberlette@users.noreply.github.com>
Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
2025-06-28 19:03:21 +02:00

112 lines
2.9 KiB
TypeScript

// Copyright 2018-2025 the Deno authors. MIT license.
import events, { addAbortListener, EventEmitter } from "node:events";
EventEmitter.captureRejections = true;
Deno.test("regression #20441", async () => {
const { promise, resolve } = Promise.withResolvers<void>();
const ee = new EventEmitter();
ee.on("foo", function () {
const p = new Promise((_resolve, reject) => {
setTimeout(() => {
reject();
}, 100);
});
return p;
});
ee.on("error", function (_: unknown) {
resolve();
});
ee.emit("foo");
await promise;
});
Deno.test("eventemitter async resource", () => {
// @ts-ignore: @types/node is outdated
class Foo extends events.EventEmitterAsyncResource {}
const foo = new Foo();
// @ts-ignore: @types/node is outdated
foo.emit("bar");
});
Deno.test("addAbortListener", async () => {
const { promise, resolve } = Promise.withResolvers<void>();
const abortController = new AbortController();
addAbortListener(abortController.signal, () => {
resolve();
});
abortController.abort();
await promise;
});
Deno.test("EventEmitter works when Object.create is deleted (#29929)", () => {
const ObjectCreate = Object.create;
Object.create = undefined!;
try {
const emitter = new EventEmitter();
let called = false;
emitter.on("foo", () => {
called = true;
});
emitter.emit("foo");
if (!called) throw new Error("Listener was not called");
} finally {
Object.create = ObjectCreate;
}
});
Deno.test("EventEmitter works if Array.prototype.unshift is deleted", () => {
const ArrayPrototypeUnshift = Array.prototype.unshift;
// @ts-ignore -- this is fine for testing purposes
delete Array.prototype.unshift;
try {
const emitter = new EventEmitter();
let called = false;
emitter.on("bar", () => {
called = true;
});
emitter.emit("bar");
if (!called) throw new Error("Listener was not called");
} finally {
Array.prototype.unshift = ArrayPrototypeUnshift;
}
});
Deno.test("EventEmitter works if Array.prototype.push is deleted", () => {
const ArrayPrototypePush = Array.prototype.push;
// @ts-ignore -- this is fine for testing purposes
delete Array.prototype.push;
try {
const emitter = new EventEmitter();
let called = false;
emitter.on("baz", () => {
called = true;
});
emitter.emit("baz");
if (!called) throw new Error("Listener was not called");
} finally {
Array.prototype.push = ArrayPrototypePush;
}
});
Deno.test("EventEmitter works if Object.setPrototypeOf is deleted", () => {
const ObjectSetPrototypeOf = Object.setPrototypeOf;
Object.setPrototypeOf = undefined!;
try {
const emitter = new EventEmitter();
let called = false;
emitter.on("zap", () => {
called = true;
});
emitter.emit("zap");
if (!called) throw new Error("Listener was not called");
} finally {
Object.setPrototypeOf = ObjectSetPrototypeOf;
}
});