|
5 | 5 | from rest_framework import serializers
|
6 | 6 | from rest_framework.exceptions import ErrorDetail
|
7 | 7 | from tests.models import (
|
8 |
| - CustomManagerModel, NullableOneToOneSource, OneToOneTarget |
| 8 | + CustomManagerModel, EmailPKModel, ListModelForTest, NullableOneToOneSource, |
| 9 | + OneToOneTarget |
9 | 10 | )
|
10 | 11 |
|
11 | 12 |
|
@@ -775,3 +776,67 @@ def test(self):
|
775 | 776 | queryset = NullableOneToOneSource.objects.all()
|
776 | 777 | serializer = self.serializer(queryset, many=True)
|
777 | 778 | assert serializer.data
|
| 779 | + |
| 780 | + |
| 781 | +@pytest.mark.django_db |
| 782 | +class TestManyTrueValidationCheck: |
| 783 | + """ |
| 784 | + Tests ListSerializer validation with many=True across different primary key types |
| 785 | + (integer and email). |
| 786 | + """ |
| 787 | + |
| 788 | + def setup_method(self): |
| 789 | + self.obj1 = ListModelForTest.objects.create(name="valid", status="new") |
| 790 | + self.obj2 = ListModelForTest.objects.create(name="invalid", status="") |
| 791 | + self. email_obj1 = EmailPKModel. objects. create( email="[email protected]", name="A") |
| 792 | + self. email_obj2 = EmailPKModel. objects. create( email="[email protected]", name="B") |
| 793 | + |
| 794 | + self.serializer, self.email_serializer = self.get_serializers() |
| 795 | + |
| 796 | + def get_serializers(self): |
| 797 | + class ListModelForTestSerializer(serializers.ModelSerializer): |
| 798 | + class Meta: |
| 799 | + model = ListModelForTest |
| 800 | + fields = ("id", "name", "status") |
| 801 | + |
| 802 | + def validate_status(self, value): |
| 803 | + if value and not self.instance.is_valid: |
| 804 | + return False |
| 805 | + return value |
| 806 | + |
| 807 | + class EmailPKSerializer(serializers.ModelSerializer): |
| 808 | + class Meta: |
| 809 | + model = EmailPKModel |
| 810 | + fields = ("email", "name") |
| 811 | + read_only_fields = ('email',) |
| 812 | + |
| 813 | + def validate_name(self, value): |
| 814 | + if value and not self.instance.is_valid: |
| 815 | + return False |
| 816 | + return value |
| 817 | + |
| 818 | + return ListModelForTestSerializer, EmailPKSerializer |
| 819 | + |
| 820 | + def test_run_child_validation_with_many_true(self): |
| 821 | + input_data = [ |
| 822 | + {"id": self.obj1.pk, "name": "other", "status": "new"}, |
| 823 | + {"id": self.obj2.pk, "name": "valid", "status": "progress"}, |
| 824 | + ] |
| 825 | + |
| 826 | + serializer = self.serializer([self.obj1, self.obj2], data=input_data, many=True) |
| 827 | + assert serializer.is_valid(), serializer.errors |
| 828 | + |
| 829 | + serializer = self.serializer(ListModelForTest.objects.all(), data=input_data, many=True) |
| 830 | + assert serializer.is_valid(), serializer.errors |
| 831 | + |
| 832 | + def test_validation_error_for_invalid_data(self): |
| 833 | + input_data = [{"id": self.obj1.pk, "name": "", "status": "mystatus"}] |
| 834 | + |
| 835 | + serializer = self.serializer([self.obj1], data=input_data, many=True) |
| 836 | + assert not serializer.is_valid() |
| 837 | + assert "name" in serializer.errors[0] |
| 838 | + |
| 839 | + def test_email_pk_instance_validation(self): |
| 840 | + input_data = [{ "email": "[email protected]", "name": "bar"}] |
| 841 | + serializer = self.email_serializer(instance=EmailPKModel.objects.all(), data=input_data, many=True) |
| 842 | + assert serializer.is_valid(), serializer.errors |
0 commit comments