feat: consolidate shared UI and harden browser authority for release
This commit is contained in:
@@ -5271,6 +5271,36 @@ class ApiSmokeTests(unittest.TestCase):
|
||||
visible_key = next(item for item in visible_revoked_delta.json()["api_keys"] if item["id"] == key_id)
|
||||
self.assertIsNotNone(visible_key["revoked_at"])
|
||||
|
||||
def test_navigation_separator_layout_survives_system_tenant_and_personal_saves(self) -> None:
|
||||
headers, _ = self._login()
|
||||
system = self.client.get("/api/v1/admin/system/settings", headers=headers).json()
|
||||
layout = {"contract_version": "1", "order": ["files.navigation.files", "separator:mail", "mail.navigation.mail"], "hidden": [], "locked": ["mail.navigation.mail"], "separators": [{"id": "separator:mail", "label": "Nachrichten"}]}
|
||||
saved = self.client.patch("/api/v1/admin/system/settings", headers=headers, json={
|
||||
**{key: system[key] for key in ("default_locale", "allow_tenant_custom_groups", "allow_tenant_custom_roles", "allow_tenant_api_keys")}, "navigation": layout,
|
||||
})
|
||||
self.assertEqual(200, saved.status_code, saved.text)
|
||||
self.assertEqual(layout, saved.json()["navigation"])
|
||||
tenant = self.client.get("/api/v1/admin/tenant/settings", headers=headers).json()
|
||||
tenant_layout = {**layout, "locked": []}
|
||||
saved = self.client.patch("/api/v1/admin/tenant/settings", headers=headers, json={"default_locale": tenant["default_locale"], "navigation": tenant_layout})
|
||||
self.assertEqual(200, saved.status_code, saved.text)
|
||||
self.assertEqual(tenant_layout, saved.json()["navigation"])
|
||||
personal_layout = {**tenant_layout, "order": ["mail.navigation.mail", "separator:personal", "files.navigation.files"], "hidden": ["mail.navigation.mail"], "separators": [{"id": "separator:personal", "label": "Meine Arbeit"}]}
|
||||
saved = self.client.patch("/api/v1/auth/profile", headers=headers, json={"ui_preferences": {"navigation": personal_layout}})
|
||||
self.assertEqual(200, saved.status_code, saved.text)
|
||||
self.assertEqual(personal_layout, saved.json()["user"]["ui_preferences"]["navigation"])
|
||||
loaded = self.client.get("/api/v1/auth/profile", headers=headers)
|
||||
self.assertEqual(personal_layout, loaded.json()["user"]["ui_preferences"]["navigation"])
|
||||
from govoplan_core.core.navigation import navigation_preferences_from_mapping, resolve_navigation_preferences
|
||||
# HTTP persistence is checked above; scope projection stays independently deterministic.
|
||||
resolved = resolve_navigation_preferences(("files.navigation.files", "mail.navigation.mail"), system=navigation_preferences_from_mapping(layout), tenant=navigation_preferences_from_mapping(tenant_layout), user=navigation_preferences_from_mapping(personal_layout))
|
||||
self.assertTrue(resolved["mail.navigation.mail"].visible)
|
||||
self.assertTrue(resolved["mail.navigation.mail"].locked)
|
||||
self.assertEqual("Meine Arbeit", resolved["files.navigation.files"].section.label)
|
||||
reset = self.client.patch("/api/v1/auth/profile", headers=headers, json={"ui_preferences": {"navigation": None}})
|
||||
self.assertEqual(200, reset.status_code, reset.text)
|
||||
self.assertIsNone(reset.json()["user"]["ui_preferences"]["navigation"])
|
||||
|
||||
def test_settings_deltas_track_sections_and_system_language_dependency(self) -> None:
|
||||
headers, _ = self._login()
|
||||
|
||||
@@ -6860,6 +6890,7 @@ class ApiSmokeTests(unittest.TestCase):
|
||||
"order": ["files.navigation.files", "mail.navigation.mail"],
|
||||
"hidden": ["mail.navigation.mail"],
|
||||
"locked": [],
|
||||
"separators": None,
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user