from livekit.rtc import EventEmitter from typing import Any, Literal import pytest def test_events() -> None: EventTypes = Literal["connected", "reconnected", "disconnected"] emitter = EventEmitter[EventTypes]() connected_calls = [] @emitter.once("connected") def on_connected() -> None: connected_calls.append(True) emitter.emit("connected") emitter.emit("connected") assert len(connected_calls) == 1 emitter.emit("unknown_event") # type: ignore reconnected_calls = [] @emitter.on("reconnected") def on_reconnected() -> None: reconnected_calls.append(True) emitter.emit("reconnected") emitter.emit("reconnected") assert len(reconnected_calls) == 2 disconnected_calls = [] @emitter.on("disconnected") def on_disconnected() -> None: disconnected_calls.append(True) @emitter.on("disconnected") def on_disconnected_another() -> None: disconnected_calls.append(True) emitter.emit("disconnected") emitter.emit("disconnected") emitter.off("disconnected", on_disconnected) emitter.emit("disconnected") assert len(disconnected_calls) == 5 def test_args() -> None: EventTypes = Literal["whatever"] emitter = EventEmitter[EventTypes]() calls = [] @emitter.on("whatever") def on_whatever(first: Any, second: Any, third: Any) -> None: calls.append((first, second, third)) emitter.emit("whatever", 1, 2, 3) emitter.emit("whatever", 1, 2, 3, 4, 5) # only 3 arguments will be passed assert calls == [(1, 2, 3), (1, 2, 3)] with pytest.raises(TypeError): emitter.emit("whatever", 1, 2) def test_varargs() -> None: EventTypes = Literal["whatever"] emitter = EventEmitter[EventTypes]() calls = [] @emitter.on("whatever") def on_whatever_varargs(*args: Any) -> None: calls.append(args) emitter.emit("whatever", 1, 2, 3, 4, 5) emitter.emit("whatever", 1, 2) assert calls == [(1, 2, 3, 4, 5), (1, 2)] def test_throw() -> None: EventTypes = Literal["error"] emitter = EventEmitter[EventTypes]() calls = [] @emitter.on("error") def on_error() -> None: calls.append(True) raise ValueError("error") @emitter.on("error") def on_error_another() -> None: calls.append(True) emitter.emit("error") assert len(calls) == 2