loko/streetup/mobile/tests.py
2026-07-22 14:48:40 +02:00

105 lines
4.7 KiB
Python

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)