from __future__ import annotations import unittest from govoplan_core.core.navigation import ( NavigationPreferences, navigation_preferences_from_settings, resolve_navigation_preferences, update_navigation_preferences, ) class NavigationPreferenceTests(unittest.TestCase): def test_user_order_overrides_tenant_and_system_order(self) -> None: resolved = resolve_navigation_preferences( ("dashboard", "files", "mail", "campaign"), system=NavigationPreferences(order=("mail", "files")), tenant=NavigationPreferences(order=("campaign", "mail")), user=NavigationPreferences(order=("files", "campaign")), ) self.assertEqual( ["files", "campaign", "mail", "dashboard"], [item.id for item in sorted(resolved.values(), key=lambda item: item.order)], ) self.assertEqual("user", resolved["files"].order_source) self.assertEqual("user", resolved["campaign"].order_source) def test_lower_scope_cannot_hide_locked_item(self) -> None: resolved = resolve_navigation_preferences( ("dashboard", "files", "mail"), system=NavigationPreferences(locked=("dashboard",)), tenant=NavigationPreferences(hidden=("dashboard", "files"), locked=("mail",)), user=NavigationPreferences(hidden=("dashboard", "mail")), ) self.assertTrue(resolved["dashboard"].visible) self.assertTrue(resolved["dashboard"].locked) self.assertEqual("system", resolved["dashboard"].lock_source) self.assertTrue(resolved["mail"].visible) self.assertEqual("tenant", resolved["mail"].lock_source) self.assertTrue(resolved["files"].visible) self.assertEqual("user", resolved["files"].visibility_source) def test_higher_scope_visibility_replaces_inherited_preference(self) -> None: resolved = resolve_navigation_preferences( ("files", "mail"), system=NavigationPreferences(hidden=("mail",)), tenant=NavigationPreferences(hidden=("files",)), ) self.assertTrue(resolved["mail"].visible) self.assertFalse(resolved["files"].visible) self.assertEqual("tenant", resolved["mail"].visibility_source) def test_settings_round_trip_is_bounded_and_normalized(self) -> None: settings = update_navigation_preferences( {"unrelated": {"preserved": True}}, NavigationPreferences(order=(" files ", "files", "mail"), hidden=("mail",)), ) parsed = navigation_preferences_from_settings(settings) self.assertEqual(("files", "mail"), parsed.order if parsed else ()) self.assertEqual(("mail",), parsed.hidden if parsed else ()) self.assertEqual({"preserved": True}, settings["unrelated"]) if __name__ == "__main__": unittest.main()