Newer
Older
navi-1 / tests / unit / core / test_registry.py
@Eugene Sukhodolskiy Eugene Sukhodolskiy on 29 Apr 2 KB Bootstrap test suite — Phase 1 unit tests
"""Unit tests for ToolRegistry, ProfileRegistry, BackendRegistry."""

import pytest

from navi.core.registry import BackendRegistry, ProfileRegistry, ToolRegistry
from navi.exceptions import ProfileNotFound, ToolNotFound
from tests.conftest_factory import FakeLLMBackend, FakeTool, make_profile


class TestToolRegistry:
    def test_register_and_get(self):
        reg = ToolRegistry()
        tool = FakeTool("test")
        reg.register(tool)
        assert reg.get("test") is tool

    def test_get_missing_raises(self):
        reg = ToolRegistry()
        with pytest.raises(ToolNotFound):
            reg.get("missing")

    def test_resolve(self):
        reg = ToolRegistry()
        reg.register(FakeTool("a"), builtin=True)
        reg.register(FakeTool("b"))
        tools = reg.resolve(["a", "b"])
        assert [t.name for t in tools] == ["a", "b"]

    def test_all(self):
        reg = ToolRegistry()
        reg.register(FakeTool("a"))
        reg.register(FakeTool("b"))
        assert len(reg.all()) == 2

    def test_builtin_names_preserved_on_reload(self):
        reg = ToolRegistry()
        reg.register(FakeTool("builtin"), builtin=True)
        reg.register(FakeTool("user"))
        # reload_user_tools would drop non-builtins — simulate by checking names
        assert "builtin" in reg._builtin_names
        assert "user" not in reg._builtin_names


class TestProfileRegistry:
    def test_register_and_get(self):
        reg = ProfileRegistry()
        p = make_profile("dev")
        reg.register(p)
        assert reg.get("dev") is p

    def test_get_missing_raises(self):
        reg = ProfileRegistry()
        with pytest.raises(ProfileNotFound):
            reg.get("missing")

    def test_all(self):
        reg = ProfileRegistry()
        reg.register(make_profile("a"))
        reg.register(make_profile("b"))
        assert len(reg.all()) == 2


class TestBackendRegistry:
    def test_register_and_get(self):
        reg = BackendRegistry()
        backend = FakeLLMBackend()
        reg.register("ollama", backend)
        assert reg.get("ollama") is backend

    def test_get_missing_raises(self):
        reg = BackendRegistry()
        with pytest.raises(KeyError, match="not registered"):
            reg.get("missing")

    def test_all_keys(self):
        reg = BackendRegistry()
        reg.register("a", FakeLLMBackend())
        reg.register("b", FakeLLMBackend())
        assert sorted(reg.all_keys()) == ["a", "b"]