-
Notifications
You must be signed in to change notification settings - Fork 172
Expand file tree
/
Copy pathtest_rbac_registry.py
More file actions
61 lines (49 loc) · 2.39 KB
/
test_rbac_registry.py
File metadata and controls
61 lines (49 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""Tests for RBAC action registry completeness."""
import importlib
import inspect
import pkgutil
import ai.backend.manager.actions.action as action_pkg
from ai.backend.manager.actions.action.rbac import BaseRBACAction
from ai.backend.manager.actions.action.rbac_registry import RBAC_ACTION_REGISTRY
def _import_all_rbac_modules() -> None:
"""Import all rbac_* modules to ensure __subclasses__() discovers everything."""
package_path = action_pkg.__path__
for module_info in pkgutil.iter_modules(package_path):
if module_info.name.startswith("rbac_"):
importlib.import_module(f"{action_pkg.__name__}.{module_info.name}")
def _collect_concrete_subclasses(base: type) -> set[type[BaseRBACAction]]:
"""Recursively collect all concrete (non-abstract) subclasses."""
result: set[type[BaseRBACAction]] = set()
for sub in base.__subclasses__():
if not inspect.isabstract(sub):
result.add(sub)
result.update(_collect_concrete_subclasses(sub))
return result
# Ensure all rbac_* modules are imported before any test runs.
_import_all_rbac_modules()
class TestRBACRegistryCompleteness:
def test_all_concrete_subclasses_are_registered(self) -> None:
concrete_subclasses = _collect_concrete_subclasses(BaseRBACAction)
registry_set = set(RBAC_ACTION_REGISTRY)
missing = concrete_subclasses - registry_set
assert not missing, (
f"The following BaseRBACAction subclasses are not in RBAC_ACTION_REGISTRY: "
f"{', '.join(cls.__name__ for cls in sorted(missing, key=lambda c: c.__name__))}"
)
def test_registry_has_no_duplicates(self) -> None:
seen: set[type[BaseRBACAction]] = set()
duplicates: list[str] = []
for cls in RBAC_ACTION_REGISTRY:
if cls in seen:
duplicates.append(cls.__name__)
seen.add(cls)
assert not duplicates, f"Duplicate entries in RBAC_ACTION_REGISTRY: {', '.join(duplicates)}"
def test_registry_contains_only_base_rbac_action_subclasses(self) -> None:
non_subclasses: list[str] = []
for entry in RBAC_ACTION_REGISTRY:
cls: type = entry
if not issubclass(cls, BaseRBACAction):
non_subclasses.append(cls.__name__)
assert not non_subclasses, (
f"Non-BaseRBACAction entries in RBAC_ACTION_REGISTRY: {', '.join(non_subclasses)}"
)