SurfSense/surfsense_backend/tests/unit/event_bus/test_event.py
CREDO23 d6dfe53d62 feat(event_bus): add in-process domain event bus
A standalone, domain-agnostic pub/sub seam: an EventBus that owns its
subscriber registry and streams Event values from producers to listeners
in process. Boundary-crossing (Celery/DB/workers) is left to subscribers,
keeping the bus single-responsibility. Includes the immutable Event value
object and full unit coverage.
2026-05-29 15:26:12 +02:00

53 lines
1.6 KiB
Python

"""``Event`` contract: carry caller facts + engine-stamped id/time, round-trip JSON."""
from __future__ import annotations
from datetime import datetime
import pytest
from app.event_bus.event import Event
pytestmark = pytest.mark.unit
def test_event_carries_caller_supplied_facts() -> None:
"""The three caller inputs are stored verbatim."""
event = Event(
event_type="document.indexed",
payload={"document_id": 42, "content_type": "pdf"},
search_space_id=7,
)
assert event.event_type == "document.indexed"
assert event.payload == {"document_id": 42, "content_type": "pdf"}
assert event.search_space_id == 7
def test_event_stamps_identity_and_time_when_not_supplied() -> None:
"""Engine stamps id + time so subscribers can dedup/order."""
event = Event(event_type="x.happened", payload={}, search_space_id=1)
assert event.event_id
assert isinstance(event.occurred_at, datetime)
def test_event_ids_are_unique_per_instance() -> None:
"""Two events published with identical content are still distinct facts."""
first = Event(event_type="x.happened", payload={}, search_space_id=1)
second = Event(event_type="x.happened", payload={}, search_space_id=1)
assert first.event_id != second.event_id
def test_event_survives_json_round_trip() -> None:
"""Serialize → deserialize reproduces the event (subscribers queue it as JSON)."""
original = Event(
event_type="podcast.generated",
payload={"podcast_id": 9, "duration_s": 123.5},
search_space_id=3,
)
restored = Event.model_validate_json(original.model_dump_json())
assert restored == original