Enforce tenant module availability in Views

This commit is contained in:
2026-08-04 08:21:50 +02:00
parent 4da8282234
commit f271ca2b55
4 changed files with 123 additions and 20 deletions
+53
View File
@@ -1,12 +1,17 @@
from __future__ import annotations
import unittest
from types import SimpleNamespace
from unittest.mock import patch
from fastapi import HTTPException
from govoplan_core.auth import ApiPrincipal
from govoplan_core.core.access import PrincipalRef
from govoplan_core.core.modules import ModuleManifest
from govoplan_core.core.views import ViewSurface
from govoplan_views.backend.router import (
_catalogue,
_require_definition_read,
_require_definition_write,
)
@@ -59,6 +64,54 @@ class ViewDefinitionAuthorizationTests(unittest.TestCase):
_require_definition_write(actor, "group", "group-2")
_require_definition_write(actor, "user", "account-2")
def test_catalogue_excludes_surfaces_of_tenant_unavailable_modules(self) -> None:
actor = principal(scopes=("views:definition:read",))
registry = SimpleNamespace(
manifests=lambda: (
ModuleManifest(id="access", name="Access", version="1"),
ModuleManifest(id="views", name="Views", version="1"),
ModuleManifest(id="files", name="Files", version="1"),
),
view_surfaces=lambda: (
ViewSurface(
id="views.module",
module_id="views",
kind="module",
label="Views",
),
ViewSurface(
id="files.module",
module_id="files",
kind="module",
label="Files",
),
),
)
tenant = SimpleNamespace(
settings={
"module_entitlements": {
"schema_version": 1,
"revision": 1,
"system_policy": {
"available_modules": ["access", "views"],
"forced_modules": ["access"],
},
"tenant_selection": {
"enabled_modules": ["views"],
},
}
}
)
session = SimpleNamespace(get=lambda model, tenant_id: tenant)
with patch(
"govoplan_views.backend.router.get_registry",
return_value=registry,
):
catalogue = _catalogue(session, actor)
self.assertEqual(["views.module"], [surface.id for surface in catalogue])
if __name__ == "__main__":
unittest.main()