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)