Files
mostovik-backend/tests/apps/user/test_admin.py

115 lines
4.0 KiB
Python

"""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)))