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)