11import datetime
2+ import re
23from unittest .mock import MagicMock , patch
34
45import pytest
6+ from django import VERSION as django_version
57from django .db import DataError , models
68from django .test import TestCase
79
@@ -112,11 +114,15 @@ def test_updated_instance_excluded(self):
112114 def test_doesnt_pollute_model (self ):
113115 instance = AnotherUniquenessModel .objects .create (code = '100' )
114116 serializer = AnotherUniquenessSerializer (instance )
115- assert AnotherUniquenessModel ._meta .get_field ('code' ).validators == []
117+ assert all (
118+ ["Unique" not in repr (v ) for v in AnotherUniquenessModel ._meta .get_field ('code' ).validators ]
119+ )
116120
117121 # Accessing data shouldn't effect validators on the model
118122 serializer .data
119- assert AnotherUniquenessModel ._meta .get_field ('code' ).validators == []
123+ assert all (
124+ ["Unique" not in repr (v ) for v in AnotherUniquenessModel ._meta .get_field ('code' ).validators ]
125+ )
120126
121127 def test_related_model_is_unique (self ):
122128 data = {'username' : 'Existing' , 'email' : 'new-email@example.com' }
@@ -193,15 +199,15 @@ def setUp(self):
193199
194200 def test_repr (self ):
195201 serializer = UniquenessTogetherSerializer ()
196- expected = dedent ("""
197- UniquenessTogetherSerializer( ):
198- id = IntegerField(label='ID', read_only=True)
199- race_name = CharField(max_length=100, required=True)
200- position = IntegerField( required=True)
202+ expected = dedent (r """
203+ UniquenessTogetherSerializer\(\ ):
204+ id = IntegerField\ (label='ID', read_only=True\ )
205+ race_name = CharField\ (max_length=100, required=True\ )
206+ position = IntegerField\(.* required=True\ )
201207 class Meta:
202- validators = [<UniqueTogetherValidator(queryset=UniquenessTogetherModel.objects.all( ), fields=('race_name', 'position'))> ]
208+ validators = \ [<UniqueTogetherValidator\ (queryset=UniquenessTogetherModel.objects.all\(\ ), fields=\ ('race_name', 'position'\)\)>\ ]
203209 """ )
204- assert repr (serializer ) == expected
210+ assert re . search ( expected , repr (serializer )) is not None
205211
206212 def test_is_not_unique_together (self ):
207213 """
@@ -282,13 +288,13 @@ class Meta:
282288 read_only_fields = ('race_name' ,)
283289
284290 serializer = ReadOnlyFieldSerializer ()
285- expected = dedent ("""
286- ReadOnlyFieldSerializer( ):
287- id = IntegerField(label='ID', read_only=True)
288- race_name = CharField(read_only=True)
289- position = IntegerField( required=True)
291+ expected = dedent (r """
292+ ReadOnlyFieldSerializer\(\ ):
293+ id = IntegerField\ (label='ID', read_only=True\ )
294+ race_name = CharField\ (read_only=True\ )
295+ position = IntegerField\(.* required=True\ )
290296 """ )
291- assert repr (serializer ) == expected
297+ assert re . search ( expected , repr (serializer )) is not None
292298
293299 def test_read_only_fields_with_default (self ):
294300 """
@@ -366,14 +372,14 @@ class Meta:
366372 fields = ['name' , 'position' ]
367373
368374 serializer = TestSerializer ()
369- expected = dedent ("""
370- TestSerializer( ):
371- name = CharField(source='race_name')
372- position = IntegerField( )
375+ expected = dedent (r """
376+ TestSerializer\(\ ):
377+ name = CharField\ (source='race_name'\ )
378+ position = IntegerField\(.*\ )
373379 class Meta:
374- validators = [<UniqueTogetherValidator(queryset=UniquenessTogetherModel.objects.all( ), fields=('name', 'position'))> ]
380+ validators = \ [<UniqueTogetherValidator\ (queryset=UniquenessTogetherModel.objects.all\(\ ), fields=\ ('name', 'position'\)\)>\ ]
375381 """ )
376- assert repr (serializer ) == expected
382+ assert re . search ( expected , repr (serializer )) is not None
377383
378384 def test_default_validator_with_multiple_fields_with_same_source (self ):
379385 class TestSerializer (serializers .ModelSerializer ):
@@ -411,13 +417,13 @@ class Meta:
411417 validators = []
412418
413419 serializer = NoValidatorsSerializer ()
414- expected = dedent ("""
415- NoValidatorsSerializer( ):
416- id = IntegerField(label='ID', read_only=True)
417- race_name = CharField(max_length=100)
418- position = IntegerField( )
420+ expected = dedent (r """
421+ NoValidatorsSerializer\(\ ):
422+ id = IntegerField\ (label='ID', read_only=True.*\ )
423+ race_name = CharField\ (max_length=100\ )
424+ position = IntegerField\(.*\ )
419425 """ )
420- assert repr (serializer ) == expected
426+ assert re . search ( expected , repr (serializer )) is not None
421427
422428 def test_ignore_validation_for_null_fields (self ):
423429 # None values that are on fields which are part of the uniqueness
@@ -540,16 +546,16 @@ def test_repr(self):
540546 # the order of validators isn't deterministic so delete
541547 # fancy_conditions field that has two of them
542548 del serializer .fields ['fancy_conditions' ]
543- expected = dedent ("""
544- UniqueConstraintSerializer( ):
545- id = IntegerField(label='ID', read_only=True)
546- race_name = CharField(max_length=100, required=True)
547- position = IntegerField( required=True)
548- global_id = IntegerField( validators=[<UniqueValidator(queryset=UniqueConstraintModel.objects.all())>] )
549+ expected = dedent (r """
550+ UniqueConstraintSerializer\(\ ):
551+ id = IntegerField\ (label='ID', read_only=True\ )
552+ race_name = CharField\ (max_length=100, required=True\ )
553+ position = IntegerField\(.* required=True\ )
554+ global_id = IntegerField\(.* validators=\ [<UniqueValidator\ (queryset=UniqueConstraintModel.objects.all\(\)\)>\]\ )
549555 class Meta:
550- validators = [<UniqueTogetherValidator(queryset=<QuerySet [<UniqueConstraintModel: UniqueConstraintModel object (1 )>, <UniqueConstraintModel: UniqueConstraintModel object (2)> ]>, fields=('race_name', 'position'))> ]
556+ validators = \ [<UniqueTogetherValidator\ (queryset=<QuerySet \ [<UniqueConstraintModel: UniqueConstraintModel object \(1\ )>, <UniqueConstraintModel: UniqueConstraintModel object \(2\)>\ ]>, fields=\ ('race_name', 'position'\)\)>\ ]
551557 """ )
552- assert repr (serializer ) == expected
558+ assert re . search ( expected , repr (serializer )) is not None
553559
554560 def test_unique_together_field (self ):
555561 """
@@ -569,15 +575,18 @@ def test_single_field_uniq_validators(self):
569575 UniqueConstraint with single field must be transformed into
570576 field's UniqueValidator
571577 """
578+ # Django 5 includes Max and Min values validators for IntergerField
579+ extra_validators_qty = 2 if django_version [0 ] >= 5 else 0
580+ #
572581 serializer = UniqueConstraintSerializer ()
573582 assert len (serializer .validators ) == 1
574583 validators = serializer .fields ['global_id' ].validators
575- assert len (validators ) == 1
584+ assert len (validators ) == 1 + extra_validators_qty
576585 assert validators [0 ].queryset == UniqueConstraintModel .objects
577586
578587 validators = serializer .fields ['fancy_conditions' ].validators
579- assert len (validators ) == 2
580- ids_in_qs = {frozenset (v .queryset .values_list (flat = True )) for v in validators }
588+ assert len (validators ) == 2 + extra_validators_qty
589+ ids_in_qs = {frozenset (v .queryset .values_list (flat = True )) for v in validators if hasattr ( v , "queryset" ) }
581590 assert ids_in_qs == {frozenset ([1 ]), frozenset ([3 ])}
582591
583592
0 commit comments