From 632ce2a4ce81c59b32037986b0bcada7b1f0d00a Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Sun, 2 Aug 2026 00:42:10 +0200 Subject: [PATCH] Add route registry tests --- tests/test_route_registry.py | 157 +++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 tests/test_route_registry.py diff --git a/tests/test_route_registry.py b/tests/test_route_registry.py new file mode 100644 index 0000000..b341968 --- /dev/null +++ b/tests/test_route_registry.py @@ -0,0 +1,157 @@ +import importlib +import sys +from types import ModuleType, SimpleNamespace +from unittest.mock import MagicMock + +import pytest + +PACKAGE_NAME = "comfyui-model-resolver" +registry_module = importlib.import_module( + f"{PACKAGE_NAME}.core.routes.registry" +) +base_models_module = importlib.import_module( + f"{PACKAGE_NAME}.core.routes.base_models" +) + + +class RecordingRoutes: + """Minimal PromptServer route registry for integration tests.""" + + def __init__(self): + self.registered = {} + + def _decorator(self, method, path): + def register(handler): + self.registered[(method, path)] = handler + return handler + + return register + + def get(self, path): + return self._decorator("GET", path) + + def post(self, path): + return self._decorator("POST", path) + + +def _make_extension(): + return SimpleNamespace( + routes_setup=False, + logger=MagicMock(), + analysis_progress=MagicMock(), + hash_tracker=MagicMock(), + loaded_progress=MagicMock(), + metadata_builder_progress=MagicMock(), + search_tracker=MagicMock(), + search_result_timestamps={}, + _update_analysis_progress=MagicMock(), + _update_loaded_progress=MagicMock(), + _update_metadata_build_progress=MagicMock(), + ) + + +def _install_prompt_server(monkeypatch, routes, instance=True): + server_module = ModuleType("server") + server_module.PromptServer = SimpleNamespace( + instance=SimpleNamespace(routes=routes) if instance else None + ) + monkeypatch.setitem(sys.modules, "server", server_module) + + +@pytest.fixture +def route_environment(monkeypatch): + routes = RecordingRoutes() + _install_prompt_server(monkeypatch, routes) + return _make_extension(), routes + + +def test_register_routes_registers_each_route_family(route_environment): + extension, routes = route_environment + + result = registry_module.register_routes(extension) + + assert result is True + assert extension.routes_setup is True + assert { + ("GET", "/model_resolver/base-models"), + ("POST", "/model_resolver/analyze"), + ("POST", "/model_resolver/local-model-hashes"), + ("POST", "/model_resolver/civitai-search"), + ("POST", "/model_resolver/search"), + ("POST", "/model_resolver/download"), + ("GET", "/model_resolver/directories"), + ("GET", "/model_resolver/settings"), + ("GET", "/model_resolver/version"), + }.issubset(routes.registered) + + +def test_register_routes_is_idempotent(route_environment): + extension, routes = route_environment + + assert registry_module.register_routes(extension) is True + registered_once = dict(routes.registered) + + assert registry_module.register_routes(extension) is None + + assert routes.registered == registered_once + extension.logger.info.assert_called_once_with( + "Model Resolver: API routes registered successfully" + ) + + +def test_register_routes_returns_false_when_prompt_server_is_not_ready( + monkeypatch, +): + routes = RecordingRoutes() + _install_prompt_server(monkeypatch, routes, instance=False) + extension = _make_extension() + + result = registry_module.register_routes(extension) + + assert result is False + assert extension.routes_setup is False + assert routes.registered == {} + extension.logger.debug.assert_called_once_with( + "Model Resolver: PromptServer not available yet" + ) + + +def test_register_routes_keeps_setup_flag_false_when_registration_fails( + monkeypatch, + route_environment, +): + extension, _ = route_environment + monkeypatch.setattr( + base_models_module, + "register_base_model_routes", + MagicMock(side_effect=RuntimeError("route registration failed")), + ) + + result = registry_module.register_routes(extension) + + assert result is False + assert extension.routes_setup is False + extension.logger.error.assert_called_once() + + +def test_register_routes_skips_optional_download_routes_when_unavailable( + monkeypatch, + route_environment, +): + extension, routes = route_environment + downloader_module_name = f"{PACKAGE_NAME}.core.downloader" + monkeypatch.setitem(sys.modules, downloader_module_name, None) + + result = registry_module.register_routes(extension) + + assert result is True + assert extension.routes_setup is True + assert ("POST", "/model_resolver/analyze") in routes.registered + assert ("POST", "/model_resolver/civitai-search") in routes.registered + assert ("GET", "/model_resolver/settings") in routes.registered + assert ("POST", "/model_resolver/search") not in routes.registered + assert ("POST", "/model_resolver/download") not in routes.registered + assert ( + "POST", + "/model_resolver/clear-search-cache", + ) not in routes.registered