161 lines
4.2 KiB
TypeScript
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"])
|
|
})
|
|
})
|