Files
2025-02-25 14:34:49 -08:00

161 lines
4.2 KiB
TypeScript

import {describe, it, expect, beforeEach, vi} from "vitest"
import {Emitter} from "../src/Emitter"
describe("Emitter", () => {
let emitter: Emitter
beforeEach(() => {
emitter = new Emitter()
})
it("should emit events to specific listeners", () => {
const listener = vi.fn()
emitter.on("test", listener)
const args = ["arg1", 2, {key: "value"}]
emitter.emit("test", ...args)
expect(listener).toHaveBeenCalledWith(...args)
expect(listener).toHaveBeenCalledTimes(1)
})
it("should emit events to wildcard listeners", () => {
const wildcardListener = vi.fn()
emitter.on("*", wildcardListener)
const args = ["arg1", 2, {key: "value"}]
emitter.emit("test", ...args)
expect(wildcardListener).toHaveBeenCalledWith("test", ...args)
expect(wildcardListener).toHaveBeenCalledTimes(1)
})
it("should emit to both specific and wildcard listeners", () => {
const specificListener = vi.fn()
const wildcardListener = vi.fn()
emitter.on("test", specificListener)
emitter.on("*", wildcardListener)
const args = ["arg1", 2, {key: "value"}]
emitter.emit("test", ...args)
expect(specificListener).toHaveBeenCalledWith(...args)
expect(wildcardListener).toHaveBeenCalledWith("test", ...args)
})
it("should return true if both listeners exist", () => {
emitter.on("test", () => {})
emitter.on("*", () => {})
const result = emitter.emit("test", "arg")
expect(result).toBe(true)
})
it("should return false if no listeners exist", () => {
const result = emitter.emit("test", "arg")
expect(result).toBe(false)
})
it("should handle multiple listeners for same event", () => {
const listener1 = vi.fn()
const listener2 = vi.fn()
emitter.on("test", listener1)
emitter.on("test", listener2)
emitter.emit("test", "arg")
expect(listener1).toHaveBeenCalledWith("arg")
expect(listener2).toHaveBeenCalledWith("arg")
})
it("should handle multiple wildcard listeners", () => {
const listener1 = vi.fn()
const listener2 = vi.fn()
emitter.on("*", listener1)
emitter.on("*", listener2)
emitter.emit("test", "arg")
expect(listener1).toHaveBeenCalledWith("test", "arg")
expect(listener2).toHaveBeenCalledWith("test", "arg")
})
it("should handle listener removal", () => {
const listener = vi.fn()
emitter.on("test", listener)
emitter.removeListener("test", listener)
emitter.emit("test", "arg")
expect(listener).not.toHaveBeenCalled()
})
it("should handle wildcard listener removal", () => {
const listener = vi.fn()
emitter.on("*", listener)
emitter.removeListener("*", listener)
emitter.emit("test", "arg")
expect(listener).not.toHaveBeenCalled()
})
it("should handle once listeners", () => {
const listener = vi.fn()
emitter.once("test", listener)
emitter.emit("test", "arg1")
emitter.emit("test", "arg2")
expect(listener).toHaveBeenCalledTimes(1)
expect(listener).toHaveBeenCalledWith("arg1")
})
it("should handle once wildcard listeners", () => {
const listener = vi.fn()
emitter.once("*", listener)
emitter.emit("test1", "arg1")
emitter.emit("test2", "arg2")
expect(listener).toHaveBeenCalledTimes(1)
expect(listener).toHaveBeenCalledWith("test1", "arg1")
})
it("should handle nostr event data", () => {
const listener = vi.fn()
const wildcardListener = vi.fn()
emitter.on("test", listener)
emitter.on("*", wildcardListener)
const complexData = {
id: "ff".repeat(32), // Realistic event ID
pubkey: "ee".repeat(32), // Realistic pubkey
created_at: Math.floor(Date.now() / 1000),
kind: 1,
tags: [["p", "ee".repeat(32)]],
content: "Hello Nostr!",
}
emitter.emit("test", complexData)
expect(listener).toHaveBeenCalledWith(complexData)
expect(wildcardListener).toHaveBeenCalledWith("test", complexData)
})
it("should maintain correct event order", () => {
const events: string[] = []
emitter.on("test", () => events.push("specific"))
emitter.on("*", () => events.push("wildcard"))
emitter.emit("test")
expect(events).toEqual(["specific", "wildcard"])
})
})