from __future__ import annotations import asyncio import pytest from aura.core.hotkey import GlobalHotkeyManager from aura.core.ipc import UnixSocketServer from aura.core.llm_router import OllamaRouter from aura.core.tools import ToolRegistry, ToolSpec, build_tool_schema from aura.core.tray import TrayController def test_tool_registry_branches(): registry = ToolRegistry() schema = build_tool_schema("echo", "Echo input", {"type": "object"}, {"type": "object"}, 1) assert schema["name"] == "echo" registry.register(ToolSpec("echo", "Echo input", 1, {"type": "object"}, {"type": "object"}, lambda args: args["value"])) assert registry.list_tools()[0].name == "echo" with pytest.raises(ValueError): registry.register(ToolSpec("echo", "Dup", 1, {}, {}, lambda args: args)) assert asyncio.run(registry.execute("missing")).error == "unknown-tool:missing" assert asyncio.run(registry.execute("echo", {"value": "hi"})).result == "hi" registry.register(ToolSpec("danger", "Dangerous", 3, {"type": "object"}, {"type": "object"}, lambda args: "done")) blocked = asyncio.run(registry.execute("danger")) assert blocked.error == "tier-3-confirmation-required" allowed = asyncio.run(registry.execute("danger", confirm=True)) assert allowed.result == "done" async def async_handler(_args): return "async" registry.register(ToolSpec("async", "Async", 1, {"type": "object"}, {"type": "object"}, async_handler)) assert asyncio.run(registry.execute("async")).result == "async" registry.clear() assert registry.list_tools() == [] def test_llm_router_branches(monkeypatch): monkeypatch.setattr("aura.core.llm_router.ollama", None) router = OllamaRouter(model="llama3", client=None) assert asyncio.run(router.chat([{"role": "user", "content": "hi"}])).error == "ollama-client-unavailable" class Client: def __init__(self, payload): self.payload = payload def chat(self, **kwargs): return self.payload router = OllamaRouter(model="llama3", client=Client({"message": {"content": "hello"}})) assert asyncio.run(router.chat([{"role": "user", "content": "hi"}])).content == "hello" router = OllamaRouter(model="llama3", client=Client({"response": "hello"})) assert asyncio.run(router.generate("hi")).content == "hello" class AwaitableClient: def chat(self, **kwargs): async def _result(): return {"message": {"content": "awaited"}} return _result() router = OllamaRouter(model="llama3", client=AwaitableClient()) assert asyncio.run(router.generate("hi")).content == "awaited" class ErrorClient: def chat(self, **kwargs): raise RuntimeError("boom") router = OllamaRouter(model="llama3", client=ErrorClient()) assert asyncio.run(router.chat([{"role": "user", "content": "hi"}])).error == "boom" def test_hotkey_and_tray_branches(): hotkey = GlobalHotkeyManager(callback=lambda: None, listener_factory=lambda mapping: type("L", (), {"start": lambda self: None, "stop": lambda self: None})()) assert hotkey.start().ok is True assert hotkey.stop().ok is True hotkey_fail = GlobalHotkeyManager(listener_factory=lambda mapping: (_ for _ in ()).throw(RuntimeError("no hotkey"))) assert hotkey_fail.start().ok is False tray = TrayController(icon_factory=lambda: type("I", (), {"run_detached": lambda self: None, "stop": lambda self: None})()) assert tray.start().ok is True assert tray.stop().ok is True tray_fail = TrayController(icon_factory=lambda: (_ for _ in ()).throw(RuntimeError("no tray"))) assert tray_fail.start().ok is False @pytest.mark.asyncio async def test_ipc_branches(monkeypatch, tmp_path): server = UnixSocketServer(tmp_path / "aura.sock", handler=lambda message: message.upper()) monkeypatch.setattr("aura.core.ipc.supports_unix_sockets", lambda: False) assert (await server.start()).ok is False monkeypatch.setattr("aura.core.ipc.supports_unix_sockets", lambda: True) async def fake_start_unix_server(handler, path): class FakeServer: def close(self): pass async def wait_closed(self): return None return FakeServer() monkeypatch.setattr("aura.core.ipc.asyncio.start_unix_server", fake_start_unix_server) assert (await server.start()).ok is True class Reader: async def readline(self): return b"hello\n" class Writer: def __init__(self): self.buffer = b"" def write(self, data): self.buffer += data async def drain(self): return None def close(self): return None async def wait_closed(self): return None writer = Writer() await server._handle_client(Reader(), writer) assert writer.buffer == b"HELLO\n" assert (await server.stop()).ok is True