"""Tests for plugin-bridge: event bus, service registry""" import os import sys import pytest from pathlib import Path PLUGIN_DIR = Path(__file__).parent.parent / "store" / "NebulaShell" / "plugin-bridge" sys.path.insert(0, str(PLUGIN_DIR)) import importlib.util spec = importlib.util.spec_from_file_location("plugin_bridge_main", str(PLUGIN_DIR / "main.py")) main_module = importlib.util.module_from_spec(spec) spec.loader.exec_module(main_module) Bridge = main_module.Bridge class TestEventBus: def test_on_and_emit(self): b = Bridge() results = [] b.on("test.event", lambda *a, **kw: results.append((a, kw))) b.emit("test.event", "hello", x=1) assert len(results) == 1 assert results[0] == (("hello",), {"x": 1}) def test_multiple_handlers(self): b = Bridge() r1, r2 = [], [] b.on("evt", lambda: r1.append(1)) b.on("evt", lambda: r2.append(2)) b.emit("evt") assert r1 == [1] assert r2 == [2] def test_off(self): b = Bridge() results = [] handler = lambda: results.append(1) b.on("evt", handler) b.emit("evt") assert results == [1] b.off("evt", "unknown") b.emit("evt") assert results == [1] def test_no_listeners(self): b = Bridge() result = b.emit("nonexistent") assert result == [] def test_has_listeners(self): b = Bridge() assert not b.has_listeners("evt") b.on("evt", lambda: None) assert b.has_listeners("evt") def test_emit_async(self): import time b = Bridge() results = [] def slow(): time.sleep(0.05) results.append("done") b.on("async", slow) b.emit_async("async") assert len(results) == 0 time.sleep(0.1) assert results == ["done"] def test_clear(self): b = Bridge() b.on("evt", lambda: None) assert b.has_listeners("evt") b.event_bus.clear() assert not b.has_listeners("evt") class TestServiceRegistry: def test_register_and_get(self): b = Bridge() svc = {"name": "myservice"} b.provide("myservice", svc) assert b.use("myservice") is svc def test_has_service(self): b = Bridge() assert not b.has_service("x") b.provide("x", object()) assert b.has_service("x") def test_list_services(self): b = Bridge() b.provide("a", object()) b.provide("b", object()) svcs = b.list_services() assert "a" in svcs assert "b" in svcs def test_get_info(self): b = Bridge() info = b.get_info() assert "services" in info assert "event_listeners" in info class TestLifecycle: def test_init_start_stop(self): b = Bridge() b.init() b.start() b.stop() if __name__ == '__main__': pytest.main([__file__, '-v'])