from django.test import TestCase from django.urls import reverse from django.contrib.auth import get_user_model from common.models import UserConfig, Role, Thematic, UserThematics User = get_user_model() class MobileIndexViewTests(TestCase): def setUp(self): # Create user self.user = User.objects.create_user(username="testuser", password="password") self.client.login(username="testuser", password="password") # Create user config self.user_config = UserConfig.objects.create(user=self.user, is_intern=True) def test_mobile_index_context_for_admin(self): # Add admin role admin_role, _ = Role.objects.get_or_create(name="admin") self.user_config.roles.add(admin_role) response = self.client.get(reverse("mobile:mobile_index")) self.assertEqual(response.status_code, 200) self.assertTrue(response.context["can_add_intervention_mobile"]) self.assertFalse(response.context["is_inspector"]) self.assertFalse(response.context["can_add_structures_repair"]) def test_mobile_index_context_for_inspector(self): # Add inspector role inspector_role, _ = Role.objects.get_or_create(name="inspector") self.user_config.roles.add(inspector_role) response = self.client.get(reverse("mobile:mobile_index")) self.assertEqual(response.status_code, 200) self.assertTrue(response.context["is_inspector"]) def test_mobile_index_context_for_structures_technician(self): # Add technician role technician_role, _ = Role.objects.get_or_create(name="technician") self.user_config.roles.add(technician_role) # Create structures thematic structures_thematic = Thematic.objects.create(code="structures", name_fr="Ouvrages d'art", name_nl="Kunstwerken") self.user_config.default_thematic = structures_thematic self.user_config.save() # Create UserThematics with can_edit_interventions = True UserThematics.objects.create( user_config=self.user_config, thematic=structures_thematic, can_edit_interventions=True ) response = self.client.get(reverse("mobile:mobile_index")) # Note: if a user has only technician role, index redirects to /mobile/interventions/ # So it should be a 302 redirect. self.assertEqual(response.status_code, 302) self.assertEqual(response.url, "/mobile/interventions/") # If we add another role so they are not only technician, they stay on index admin_role, _ = Role.objects.get_or_create(name="admin") self.user_config.roles.add(admin_role) response = self.client.get(reverse("mobile:mobile_index")) self.assertEqual(response.status_code, 200) self.assertTrue(response.context["can_add_structures_repair"]) class MobileStockPermissionTests(TestCase): def setUp(self): from stock.models import Warehouse self.user = User.objects.create_user(username="stockuser", password="password") self.client.login(username="stockuser", password="password") self.user_config = UserConfig.objects.create(user=self.user, is_intern=True) self.warehouse = Warehouse.objects.create(code="WH_TEST", name="Test Warehouse", manager="test_manager") def test_unauthorized_user_cannot_access_stock(self): # Assign observer and inspector roles (non-stock roles) observer_role, _ = Role.objects.get_or_create(name="observer") inspector_role, _ = Role.objects.get_or_create(name="inspector") self.user_config.roles.add(observer_role, inspector_role) # Check mobile index page context response = self.client.get(reverse("mobile:mobile_index")) self.assertEqual(response.status_code, 200) self.assertFalse(response.context.get("can_access_stock", False)) # Check view-level access restriction stock_response = self.client.get(reverse("mobile:stock_index_mobile")) self.assertEqual(stock_response.status_code, 403) def test_authorized_user_can_access_stock(self): # Assign stock_manager role stock_manager_role, _ = Role.objects.get_or_create(name="stock_manager") self.user_config.roles.add(stock_manager_role) # Check mobile index page context response = self.client.get(reverse("mobile:mobile_index")) self.assertEqual(response.status_code, 200) self.assertTrue(response.context.get("can_access_stock", False)) # Check view-level access success stock_response = self.client.get(reverse("mobile:stock_index_mobile")) self.assertEqual(stock_response.status_code, 200)