from __future__ import annotations from django.test import RequestFactory, TestCase from django.urls import resolve, reverse from core.context_processors import settings_hierarchy_nav from core.security.capabilities import all_scope_keys from core.models import CommandProfile, TaskProject, User class SettingsIntegrityTests(TestCase): def setUp(self): self.user = User.objects.create_user( username="settings-user", email="settings@example.com", password="x", ) self.client.force_login(self.user) self.factory = RequestFactory() def test_permissions_page_shows_gateway_capabilities(self): response = self.client.get(reverse("permission_settings")) self.assertEqual(200, response.status_code) self.assertContains(response, "Gateway contacts command") self.assertContains(response, "Gateway help command") self.assertContains(response, "Gateway whoami command") for scope_key in all_scope_keys(configurable_only=True): self.assertContains(response, scope_key) def test_capability_registry_excludes_removed_totp_scope(self): self.assertNotIn("gateway.totp", all_scope_keys()) def test_codex_settings_receives_modules_settings_nav(self): response = self.client.get(reverse("codex_settings")) self.assertEqual(200, response.status_code) settings_nav = response.context.get("settings_nav") self.assertIsNotNone(settings_nav) self.assertEqual("Modules", settings_nav["title"]) labels = [str(item["label"]) for item in settings_nav["tabs"]] self.assertIn("Commands", labels) self.assertIn("Task Automation", labels) def test_business_plan_inbox_receives_modules_settings_nav(self): response = self.client.get(reverse("business_plan_inbox")) self.assertEqual(200, response.status_code) settings_nav = response.context.get("settings_nav") self.assertIsNotNone(settings_nav) self.assertEqual("Modules", settings_nav["title"]) def test_tasks_settings_cross_links_commands_and_permissions(self): TaskProject.objects.create(user=self.user, name="Integrity Project") response = self.client.get(reverse("tasks_settings")) self.assertEqual(200, response.status_code) self.assertContains(response, "Task Automation") self.assertContains(response, reverse("command_routing")) self.assertContains(response, reverse("permission_settings")) def test_command_routing_cross_links_tasks_and_permissions(self): CommandProfile.objects.create( user=self.user, slug="bp", name="Business Plan", enabled=True, trigger_token=".bp", reply_required=False, exact_match_only=False, ) response = self.client.get(reverse("command_routing")) self.assertEqual(200, response.status_code) self.assertContains(response, reverse("tasks_settings")) self.assertContains(response, reverse("permission_settings")) def test_settings_nav_includes_codex_approval_route(self): request = self.factory.post(reverse("codex_approval")) request.user = self.user request.resolver_match = resolve(reverse("codex_approval")) settings_nav = settings_hierarchy_nav(request)["settings_nav"] self.assertEqual("Modules", settings_nav["title"]) def test_settings_nav_includes_translation_preview_route(self): request = self.factory.post(reverse("translation_preview")) request.user = self.user request.resolver_match = resolve(reverse("translation_preview")) settings_nav = settings_hierarchy_nav(request)["settings_nav"] self.assertEqual("Modules", settings_nav["title"])