from django.contrib.auth.models import User from django.contrib.messages import get_messages from django.test import TestCase from django.urls import reverse from django.conf import settings from django.utils.translation import gettext as _ import json from common.models import UserConfig class SwitchAccountViewTests(TestCase): def setUp(self): self.user_1 = User.objects.create_user(username="alpha", password="password123") self.user_2 = User.objects.create_user(username="beta", password="password123") self.user_3 = User.objects.create_user(username="gamma", password="password123") self.user_4 = User.objects.create_user(username="delta", password="password123") self.config_1 = UserConfig.objects.create(user=self.user_1) self.config_2 = UserConfig.objects.create(user=self.user_2) self.config_3 = UserConfig.objects.create(user=self.user_3) self.config_4 = UserConfig.objects.create(user=self.user_4) # Link the first two users together self.config_1.linked_configs.add(self.config_2) def test_switch_to_linked_account(self): self.client.force_login(self.user_1) response = self.client.post( reverse("common:switch_account"), {"target_user_id": self.user_2.pk, "origin_next": "/interventions/"}, ) self.assertRedirects(response, "/interventions/", target_status_code=302) self.assertEqual(int(self.client.session["_auth_user_id"]), self.user_2.pk) def test_switch_to_unlinked_account_is_prevented(self): self.client.force_login(self.user_1) response = self.client.post( reverse("common:switch_account"), {"target_user_id": self.user_3.pk}, ) messages = list(get_messages(response.wsgi_request)) self.assertTrue(any(_("Vous ne pouvez pas accéder à ce compte.") in message.message for message in messages)) self.assertRedirects(response, reverse("home:index")) self.assertEqual(int(self.client.session["_auth_user_id"]), self.user_1.pk) def test_chained_switch_uses_origin_permissions(self): self.config_1.linked_configs.add(self.config_3) self.config_4.linked_configs.add(self.config_2) self.client.force_login(self.user_1) response = self.client.post( reverse("common:switch_account"), {"target_user_id": self.user_2.pk}, ) self.assertRedirects(response, reverse("home:index")) self.assertEqual(int(self.client.session["_auth_user_id"]), self.user_2.pk) response = self.client.post( reverse("common:switch_account"), {"target_user_id": self.user_3.pk}, ) self.assertRedirects(response, reverse("home:index")) self.assertEqual(int(self.client.session["_auth_user_id"]), self.user_3.pk) response = self.client.post( reverse("common:switch_account"), {"target_user_id": self.user_4.pk}, ) messages = list(get_messages(response.wsgi_request)) self.assertTrue(any(_("Vous ne pouvez pas accéder à ce compte.") in message.message for message in messages)) self.assertRedirects(response, reverse("home:index")) self.assertEqual(int(self.client.session["_auth_user_id"]), self.user_3.pk) class LanguageSwitchingTests(TestCase): """Tests for language switching functionality in mobile/user settings.""" def setUp(self): self.user = User.objects.create_user(username="testuser", password="password123") UserConfig.objects.create(user=self.user) def test_account_info_page_loads(self): """Test that the account info page loads successfully.""" self.client.force_login(self.user) response = self.client.get(reverse("common:account_info")) self.assertEqual(response.status_code, 200) def test_account_info_contains_language_selector(self): """Test that the account info page contains language selection elements.""" self.client.force_login(self.user) response = self.client.get(reverse("common:account_info")) # Check for language modal and buttons self.assertContains(response, "languageModal") self.assertContains(response, "Français") self.assertContains(response, "Nederlands") self.assertContains(response, "English") def test_set_language_to_french(self): """Test switching to French language.""" self.client.force_login(self.user) response = self.client.post( reverse("set_language"), {"language": "fr", "next": reverse("common:account_info")}, follow=True ) self.assertEqual(response.status_code, 200) # Check that the language cookie is set self.assertIn(settings.LANGUAGE_COOKIE_NAME, self.client.cookies) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, "fr") def test_set_language_to_dutch(self): """Test switching to Dutch language.""" self.client.force_login(self.user) response = self.client.post( reverse("set_language"), {"language": "nl", "next": reverse("common:account_info")}, follow=True ) self.assertEqual(response.status_code, 200) self.assertIn(settings.LANGUAGE_COOKIE_NAME, self.client.cookies) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, "nl") def test_set_language_to_english(self): """Test switching to English language.""" self.client.force_login(self.user) response = self.client.post( reverse("set_language"), {"language": "en", "next": reverse("common:account_info")}, follow=True ) self.assertEqual(response.status_code, 200) self.assertIn(settings.LANGUAGE_COOKIE_NAME, self.client.cookies) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, "en") def test_invalid_language_code(self): """Test that invalid language codes are handled gracefully.""" self.client.force_login(self.user) response = self.client.post( reverse("set_language"), {"language": "invalid", "next": reverse("common:account_info")}, follow=True ) # Django's set_language view should handle invalid languages gracefully self.assertEqual(response.status_code, 200) class HelpPanelTests(TestCase): def setUp(self): from common.models import Role self.user = User.objects.create_user(username="helpuser", password="password123") self.user_config = UserConfig.objects.create(user=self.user) # Superuser self.superuser = User.objects.create_superuser(username="helpsuper", password="password123") self.superuser_config = UserConfig.objects.create(user=self.superuser) def test_can_approve_any_intervention_property(self): from common.models import Role # By default, regular user cannot approve self.assertFalse(self.user_config.can_approve_any_intervention) # Superuser can approve self.assertTrue(self.superuser_config.can_approve_any_intervention) # Admin role can approve admin_role = Role.objects.get_or_create(name='admin')[0] self.user_config.roles.add(admin_role) self.assertTrue(self.user_config.can_approve_any_intervention) # Remove admin role self.user_config.roles.remove(admin_role) self.assertFalse(self.user_config.can_approve_any_intervention) def test_get_help_document_prise_en_main(self): self.client.force_login(self.user) response = self.client.get(reverse("common:get_help_document", args=["prise_en_main"])) self.assertEqual(response.status_code, 200) data = response.json() self.assertIn("html", data) # Check that it rendered markdown headers into HTML self.assertIn("