diff --git a/python/beeai_framework/emitter/emitter.py b/python/beeai_framework/emitter/emitter.py index 34cc87eb7..f9f2389a7 100644 --- a/python/beeai_framework/emitter/emitter.py +++ b/python/beeai_framework/emitter/emitter.py @@ -292,12 +292,12 @@ def _create_event(self, name: str) -> EventMeta: async def clone(self) -> "Emitter": cloned = Emitter( - str(self._group_id), - self.namespace.copy(), - self.creator if self.creator else None, - self.context.copy(), - self.trace.model_copy() if self.trace else None, - self._events.copy(), + group_id=self._group_id, + namespace=self.namespace.copy(), + creator=self.creator, + context=self.context.copy(), + trace=self.trace.model_copy() if self.trace else None, + events=self._events.copy(), ) for listener in self._listeners: cloned.on(listener.raw, listener.callback, listener.options.model_copy() if listener.options else None) diff --git a/python/tests/test_emitter.py b/python/tests/test_emitter.py index 6c5288121..9576b4c4c 100644 --- a/python/tests/test_emitter.py +++ b/python/tests/test_emitter.py @@ -64,6 +64,52 @@ async def test_clone() -> None: assert clone.events is not emitter.events +@pytest.mark.unit +@pytest.mark.asyncio +async def test_clone_preserves_group_id() -> None: + emitter = Emitter(group_id="test_group", namespace=["namespace"]) + clone = await emitter.clone() + + assert clone._group_id == "test_group" + + +@pytest.mark.unit +@pytest.mark.asyncio +async def test_clone_keeps_absent_group_id_absent() -> None: + # Agents build their emitter without a group id, so the clone must not turn + # the absent value into something truthy. + emitter = Emitter(namespace=["namespace"]) + assert emitter._group_id is None + + clone = await emitter.clone() + + assert clone._group_id is None + + +@pytest.mark.unit +@pytest.mark.asyncio +async def test_clone_emits_events_without_a_group_id() -> None: + emitter = Emitter(namespace=["app"]) + clone = await emitter.clone() + + group_ids: list[str | None] = [] + clone.on("*", lambda _, event: group_ids.append(event.group_id)) + await clone.emit("a", 1) + + assert group_ids == [None] + + +@pytest.mark.unit +@pytest.mark.asyncio +async def test_child_of_clone_inherits_absent_group_id() -> None: + emitter = Emitter(namespace=["app"]) + clone = await emitter.clone() + + child = clone.child(namespace=["child"]) + + assert child._group_id is None + + class TestEventsPropagation: @pytest.mark.unit @pytest.mark.asyncio