Newer
Older
pydwiki / accounts / tests / tests_serializer.py
from django.test import TestCase

from accounts.models import CustomUser, EmailAddress
from accounts.serializers import CustomUserSerializer, EmailAddressSerializer


class SerializerTestCase(TestCase):

    def setUp(self):
        """テスト用のユーザー、メールアドレスを設定します。
        次のユーザー、とユーザーに紐づくメールアドレスを設定します。

        User:
            login_id: testuser
            username: Test User
            is_staff: True
            is_active: True
            is_superuser: False
            password_changed: False
            mail: [
                test1@example.com, is_primary: True
                test2@example.com, is_primary: False
            ]
        """
        self.user = CustomUser.objects.create(
            login_id="testuser",
            username="Test User",
            is_staff=True,
            is_active=True,
            is_superuser=False,
            password_changed=False,
        )
        self.email1 = EmailAddress.objects.create(
            user=self.user,
            email="test1@example.com",
            is_primary=True,
        )
        self.email2 = EmailAddress.objects.create(
            user=self.user,
            email="test2@example.com",
            is_primary=False,
        )

    def test_email_address_serializer(self):
        """EmailAddressSerializer のシリアライズ動作を確認する。"""
        serializer = EmailAddressSerializer(instance=self.email1)
        expected_data = {
            "id": self.email1.id,  # type: ignore
            "user": self.user.id,  # type: ignore
            "email": "test1@example.com",
            "is_primary": True,
        }
        self.assertEqual(serializer.data, expected_data)

    def test_custom_user_serializer(self):
        """CustomUserSerializer のシリアライズ動作を確認する。"""
        serializer = CustomUserSerializer(instance=self.user)
        expected_data = {
            "id": self.user.id,  # type: ignore
            "login_id": "testuser",
            "username": "Test User",
            "is_staff": True,
            "is_active": True,
            "is_superuser": False,
            "password_changed": False,
            "password_changed_date": None,
            "is_mfa_enabled": False,
            "emails": [
                {
                    "id": self.email1.id,  # type: ignore
                    "user": self.user.id,  # type: ignore
                    "email": "test1@example.com",
                    "is_primary": True,
                },
                {
                    "id": self.email2.id,  # type: ignore
                    "user": self.user.id,  # type: ignore
                    "email": "test2@example.com",
                    "is_primary": False,
                },
            ],
        }
        self.assertEqual(serializer.data, expected_data)

    def test_custom_user_serializer_create(self):
        """CustomUserSerializer を使用してユーザーの生成を確認する。"""
        data = {
            "login_id": "newuser",
            "username": "New User",
            "is_staff": False,
            "is_active": True,
            "is_superuser": False,
            "password_changed": False,
            "is_mfa_enabled": False,
        }
        serializer = CustomUserSerializer(data=data)
        self.assertTrue(serializer.is_valid(), serializer.errors)
        user = serializer.save()
        self.assertEqual(user.login_id, "newuser")

    def test_custom_user_serializer_create_password(self):
        """CustomUserSerializer を使用してユーザーを作成、パスワードを設定を確認する。"""
        data = {
            "login_id": "newuser2",
            "username": "New User2",
            "is_staff": False,
            "is_active": True,
            "is_superuser": False,
            "password_changed": False,
            "is_mfa_enabled": False,
            "password": "samplepass",
        }
        serializer = CustomUserSerializer(data=data)
        self.assertTrue(serializer.is_valid(), serializer.errors)
        user = serializer.save()
        self.assertEqual(user.login_id, "newuser2")
        self.assertEqual(user.password_changed, False)
        self.assertTrue(user.check_password("samplepass"))

    def test_custom_user_serializer_update(self):
        """CustomUserSerializer を使用してユーザー情報更新を確認する。"""
        data = {
            "username": "Updated User",
            "is_staff": False,
        }
        serializer = CustomUserSerializer(instance=self.user, data=data, partial=True)
        self.assertTrue(serializer.is_valid(), serializer.errors)
        user = serializer.save()
        self.assertEqual(user.username, "Updated User")
        self.assertEqual(user.is_staff, False)

    def test_custom_user_serializer_update_password(self):
        """ユーザーのパスワードを更新を確認する。"""
        data = {"username": "Updated User2", "password": "updatepass"}
        serializer = CustomUserSerializer(instance=self.user, data=data, partial=True)
        self.assertTrue(serializer.is_valid(), serializer.errors)
        user = serializer.save()
        self.assertEqual(user.username, "Updated User2")
        self.assertTrue(user.check_password("updatepass"))

    def test_email_address_serializer_update(self):
        """メールアドレスを更新を確認する。"""
        data = {
            "email": "test2@example2.com",
        }
        serializer = EmailAddressSerializer(instance=self.email2, data=data, partial=True)
        self.assertTrue(serializer.is_valid(), serializer.errors)
        email = serializer.save()
        self.assertEqual(email.id, self.email2.id)  # type: ignore
        self.assertEqual(email.user.id, self.user.id)  # type: ignore
        self.assertEqual(email.email, "test2@example2.com")

    def test_email_address_serializer_update_err_same_address(self):
        """既に存在するメールアドレスで更新できないことを確認する。"""
        data = {
            "email": "test2@example.com",
        }
        serializer = EmailAddressSerializer(instance=self.email1, data=data, partial=True)
        self.assertFalse(serializer.is_valid(), serializer.errors)