"""Tests for user admin configuration.""" from __future__ import annotations from apps.user.admin import ProfileAdmin, UserAdmin from apps.user.models import Profile, User from django.contrib.admin.sites import AdminSite from django.contrib.admin.utils import flatten_fieldsets from django.contrib.messages.storage.fallback import FallbackStorage from django.core.files.uploadedfile import SimpleUploadedFile from django.test import RequestFactory, TestCase from tests.utils.fixtures import fake def _password() -> str: return fake.password(length=12, special_chars=False) class UserAdminTest(TestCase): def setUp(self): self.site = AdminSite() self.admin = UserAdmin(User, self.site) self.factory = RequestFactory() def _request(self): request = self.factory.get("/") request.user = User.objects.create_superuser( email=fake.email(), username=fake.user_name(), password=_password(), ) request.session = {} request._messages = FallbackStorage(request) return request def test_badges(self): verified = User.objects.create_user( email=fake.email(), username=fake.user_name(), password=_password(), is_verified=True, ) unverified = User.objects.create_user( email=fake.email(), username=fake.user_name(), password=_password(), is_verified=False, ) self.assertIn("span", str(self.admin.is_verified_badge(verified))) self.assertIn("span", str(self.admin.is_verified_badge(unverified))) verified.is_active = True unverified.is_active = False self.assertIn("span", str(self.admin.is_active_badge(verified))) self.assertIn("span", str(self.admin.is_active_badge(unverified))) def test_actions(self): users = [ User.objects.create_user( email=fake.email(), username=fake.user_name(), password=_password() ) for _ in range(2) ] request = self._request() qs = User.objects.filter(id__in=[u.id for u in users]) self.admin.verify_users(request, qs) self.assertTrue(User.objects.filter(is_verified=True).count() >= 2) self.admin.unverify_users(request, qs) self.assertEqual(User.objects.filter(is_verified=True).count(), 0) self.admin.deactivate_users(request, qs) self.assertEqual(User.objects.filter(is_active=True).count(), 1) # admin user self.admin.activate_users(request, qs) self.assertTrue(User.objects.filter(is_active=True).count() >= 3) def test_add_form_includes_staff_and_superuser_flags(self): add_fields = flatten_fieldsets(self.admin.add_fieldsets) self.assertIn("is_staff", add_fields) self.assertIn("is_superuser", add_fields) def test_permissions_fieldset_is_visible_with_staff_and_superuser_flags(self): permissions_section = next( section for section in self.admin.fieldsets if "is_staff" in section[1]["fields"] and "is_superuser" in section[1]["fields"] ) self.assertIn("is_staff", permissions_section[1]["fields"]) self.assertIn("is_superuser", permissions_section[1]["fields"]) self.assertNotIn("classes", permissions_section[1]) class ProfileAdminTest(TestCase): def setUp(self): self.site = AdminSite() self.admin = ProfileAdmin(Profile, self.site) def test_has_avatar_badge(self): user = User.objects.create_user( email=fake.email(), username=fake.user_name(), password=_password() ) profile = user.profile self.assertIn("span", str(self.admin.has_avatar(profile))) avatar = SimpleUploadedFile("avatar.png", b"img", content_type="image/png") profile.avatar = avatar profile.save(update_fields=["avatar"]) self.assertIn("span", str(self.admin.has_avatar(profile)))