# #region Test.RouterThinModules [C:2] [TYPE Module] [SEMANTICS test,router,fastapi,api] # @BRIEF Tests for thin router modules: dashboards/_router.py, git/_router.py, # translate/_router.py, maintenance/_router.py. # These modules define APIRouter instances used by route handlers. # @RELATION BINDS_TO -> [DashboardsRouter] # @RELATION BINDS_TO -> [GitRouter] # @RELATION BINDS_TO -> [TranslateRouterModule] # @RELATION BINDS_TO -> [MaintenanceRouter] # @TEST_CONTRACT: dashboards router -> prefix=/api/dashboards, tags=["Dashboards"] # @TEST_CONTRACT: git router -> no prefix, tags=["git"] # @TEST_CONTRACT: translate router -> prefix=/api/translate, tags=["translate"], feature-gated # @TEST_CONTRACT: maintenance router -> prefix=/api/maintenance, tags=["Maintenance"] # @TEST_EDGE: router_instances_are_APIRouter -> verify type # @TEST_EDGE: translate_router_dependencies -> require_feature dependency present import pytest from fastapi import APIRouter class TestDashboardsRouter: """Dashboards router — prefix and tags.""" def test_router_type(self): from src.api.routes.dashboards._router import router assert isinstance(router, APIRouter) def test_router_prefix(self): from src.api.routes.dashboards._router import router assert router.prefix == "/api/dashboards" def test_router_tags(self): from src.api.routes.dashboards._router import router assert "Dashboards" in router.tags def test_router_has_routes(self): from src.api.routes.dashboards._router import router # The routes are added by other modules importing this router assert hasattr(router, "routes") class TestGitRouter: """Git router — no prefix, git tag.""" def test_router_type(self): from src.api.routes.git._router import router assert isinstance(router, APIRouter) def test_router_no_prefix(self): from src.api.routes.git._router import router # Git router doesn't set prefix (routes set their own prefixes) assert router.prefix == "" def test_router_tags(self): from src.api.routes.git._router import router assert "git" in router.tags class TestTranslateRouter: """Translate router — prefix, tags, feature flag dependency.""" def test_router_type(self): from src.api.routes.translate._router import router assert isinstance(router, APIRouter) def test_router_prefix(self): from src.api.routes.translate._router import router assert router.prefix == "/api/translate" def test_router_tags(self): from src.api.routes.translate._router import router assert "translate" in router.tags def test_router_has_dependencies(self): from src.api.routes.translate._router import router assert len(router.dependencies) > 0 def test_router_dependency_is_require_feature(self): from src.api.routes.translate._router import router from fastapi import params deps = router.dependencies assert len(deps) >= 1 dep = deps[0] # The dependency is a Depends(require_feature("translate")) assert isinstance(dep, params.Depends) class TestMaintenanceRouter: """Maintenance router — prefix and tags.""" def test_router_type(self): from src.api.routes.maintenance._router import router assert isinstance(router, APIRouter) def test_router_prefix(self): from src.api.routes.maintenance._router import router assert router.prefix == "/api/maintenance" def test_router_tags(self): from src.api.routes.maintenance._router import router tags_lower = [t.lower() for t in router.tags] assert "maintenance" in tags_lower def test_routes_are_imported(self): """Verify that the _routes module is imported in _router.py.""" from src.api.routes.maintenance import _router # The import `from . import _routes` in _router.py registers routes # on the router. If the import is successful and routes exist, it works. assert hasattr(_router, "router") # Check that the router has non-trivial number of routes # (list_events, start, end, end-all, settings GET, settings PUT = 6) assert len(_router.router.routes) >= 1 # #endregion Test.RouterThinModules