Newer
Older
pydwiki / accounts / tests / tests_admin.py
from typing import cast

from django.forms.models import ModelForm, inlineformset_factory
from django.http import HttpRequest
from django.test import TestCase
from django.utils.translation import gettext_lazy as _

from accounts.admin import CustomUserAdmin, EmailAddressInlineFormSet
from accounts.models import CustomUser, CustomUserManager, EmailAddress


# CustomUserForm を定義
class CustomUserForm(ModelForm):
    class Meta:
        model = CustomUser
        fields = [
            "login_id",
            "username",
            "password",
            "is_mfa_enabled",
            "is_staff",
            "is_active",
            "is_superuser",
            "_email",
        ]


class EmailAddressInlineFormSetTestCase(TestCase):

    def setUp(self):
        self.user_manager = cast(CustomUserManager, CustomUser.objects)
        self.user = self.user_manager.create_user(
            login_id="testuser",
            _email="testuser@example.com",
            username="Test User",
            password="password",
        )
        EmailAddress.objects.create(user=self.user, email="testuser@dummy.jp", is_primary=False)

        self.EmailAddressInlineFormSet = inlineformset_factory(
            CustomUser,
            EmailAddress,
            formset=EmailAddressInlineFormSet,
            fields=["user", "is_primary", "email"],
            extra=1,
        )

    def test_clean(self):
        formset = self.EmailAddressInlineFormSet(
            instance=self.user,
            data={
                "emails-TOTAL_FORMS": 2,
                "emails-INITIAL_FORMS": 0,
                "emails-MIN_NUM_FORMS": 0,
                "emails-MAX_NUM_FORMS": 1000,
                "emails-0-user": self.user.pk,
                "emails-0-is_primary": True,
                "emails-0-email": "testuser1@example.com",
                "emails-1-user": self.user.pk,
                "emails-1-is_primary": False,
                "emails-1-email": "testuser2@example.com",
            },
        )

        # データが正しいため True
        self.assertTrue(formset.is_valid())

    def test_clean_two_primary(self):
        formset = self.EmailAddressInlineFormSet(
            instance=self.user,
            data={
                "csrfmiddlewaretoken": "tCicwCxx4nMwxeScssSSic9csLIah4pbqDoHTAbsRHZfMfgVfrKIL4CyAR6CvAoG",
                "emails-TOTAL_FORMS": 2,
                "emails-INITIAL_FORMS": 0,
                "emails-MIN_NUM_FORMS": 0,
                "emails-MAX_NUM_FORMS": 1000,
                "emails-0-user": self.user.pk,
                "emails-0-is_primary": True,
                "emails-0-email": "testuser1@example.com",
                "emails-1-user": self.user.pk,
                "emails-1-is_primary": True,
                "emails-1-email": "testuser2@example.com",
            },
        )

        # Primary が 2 つあるため False
        self.assertFalse(formset.is_valid())

    def test_get_primary_email(self):
        admin = CustomUserAdmin(CustomUser, None)
        email = admin.get_primary_email(self.user)
        self.assertEqual(email, self.user.emails.filter(is_primary=True).first().email)

        self.user.emails.filter(is_primary=True).update(is_primary=False)
        email = admin.get_primary_email(self.user)
        self.assertEqual(email, _("None"))

    def test_get_save_model(self):
        admin = CustomUserAdmin(CustomUser, None)

        request = HttpRequest()
        request.method = "POST"
        request.path = "/admin/accounts/customuser/add/"
        request.POST.setlist("login_id", ["testuser"])
        request.POST.setlist("username", ["Test User"])
        request.POST.setlist("password", ["password"])
        request.POST.setlist("is_mfa_enabled", ["off"])
        request.POST.setlist("emails-TOTAL_FORMS", ["2"])
        request.POST.setlist("emails-INITIAL_FORMS", ["0"])
        request.POST.setlist("emails-MIN_NUM_FORMS", ["0"])
        request.POST.setlist("emails-MAX_NUM_FORMS", ["1000"])
        request.POST.setlist("emails-0-user", [str(self.user.pk)])
        request.POST.setlist("emails-0-is_primary", ["on"])
        request.POST.setlist("emails-0-email", ["testuser1@example.com"])
        request.POST.setlist("emails-1-user", [self.user.pk])
        request.POST.setlist("emails-1-is_primary", ["off"])
        request.POST.setlist("emails-1-email", ["testuser2@example.com"])

        form = CustomUserForm(request.POST)
        form.is_valid()
        admin.save_model(request, self.user, form, True)

    def test_get_save_model_exists_email(self):
        admin = CustomUserAdmin(CustomUser, None)

        request = HttpRequest()
        request.method = "POST"
        request.path = "/admin/accounts/customuser/add/"
        request.POST.setlist("login_id", ["testuser"])
        request.POST.setlist("username", ["Test User"])
        request.POST.setlist("password", ["password"])
        request.POST.setlist("is_mfa_enabled", ["off"])
        request.POST.setlist("_email", ["testuser@sample.com"])
        request.POST.setlist("emails-TOTAL_FORMS", ["2"])
        request.POST.setlist("emails-INITIAL_FORMS", ["0"])
        request.POST.setlist("emails-MIN_NUM_FORMS", ["0"])
        request.POST.setlist("emails-MAX_NUM_FORMS", ["1000"])
        request.POST.setlist("emails-0-user", [str(self.user.pk)])
        request.POST.setlist("emails-0-is_primary", ["on"])
        request.POST.setlist("emails-0-email", ["testuser1@example.com"])
        request.POST.setlist("emails-1-user", [self.user.pk])
        request.POST.setlist("emails-1-is_primary", ["off"])
        request.POST.setlist("emails-1-email", ["testuser2@example.com"])

        form = CustomUserForm(request.POST)
        form.is_valid()
        admin.save_model(request, self.user, form, True)