1
1
import datetime
2
+ import re
2
3
from unittest .mock import MagicMock , patch
3
4
4
5
import pytest
6
+ from django import VERSION as django_version
5
7
from django .db import DataError , models
6
8
from django .test import TestCase
7
9
@@ -112,11 +114,15 @@ def test_updated_instance_excluded(self):
112
114
def test_doesnt_pollute_model (self ):
113
115
instance = AnotherUniquenessModel .objects .create (code = '100' )
114
116
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
+ )
116
120
117
121
# Accessing data shouldn't effect validators on the model
118
122
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
+ )
120
126
121
127
def test_related_model_is_unique (self ):
122
128
data = {
'username' :
'Existing' ,
'email' :
'[email protected] ' }
@@ -193,15 +199,15 @@ def setUp(self):
193
199
194
200
def test_repr (self ):
195
201
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\ )
201
207
class Meta:
202
- validators = [<UniqueTogetherValidator(queryset=UniquenessTogetherModel.objects.all( ), fields=('race_name', 'position'))> ]
208
+ validators = \ [<UniqueTogetherValidator\ (queryset=UniquenessTogetherModel.objects.all\(\ ), fields=\ ('race_name', 'position'\)\)>\ ]
203
209
""" )
204
- assert repr (serializer ) == expected
210
+ assert re . search ( expected , repr (serializer )) is not None
205
211
206
212
def test_is_not_unique_together (self ):
207
213
"""
@@ -282,13 +288,13 @@ class Meta:
282
288
read_only_fields = ('race_name' ,)
283
289
284
290
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\ )
290
296
""" )
291
- assert repr (serializer ) == expected
297
+ assert re . search ( expected , repr (serializer )) is not None
292
298
293
299
def test_read_only_fields_with_default (self ):
294
300
"""
@@ -366,14 +372,14 @@ class Meta:
366
372
fields = ['name' , 'position' ]
367
373
368
374
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\(.*\ )
373
379
class Meta:
374
- validators = [<UniqueTogetherValidator(queryset=UniquenessTogetherModel.objects.all( ), fields=('name', 'position'))> ]
380
+ validators = \ [<UniqueTogetherValidator\ (queryset=UniquenessTogetherModel.objects.all\(\ ), fields=\ ('name', 'position'\)\)>\ ]
375
381
""" )
376
- assert repr (serializer ) == expected
382
+ assert re . search ( expected , repr (serializer )) is not None
377
383
378
384
def test_default_validator_with_multiple_fields_with_same_source (self ):
379
385
class TestSerializer (serializers .ModelSerializer ):
@@ -411,13 +417,13 @@ class Meta:
411
417
validators = []
412
418
413
419
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\(.*\ )
419
425
""" )
420
- assert repr (serializer ) == expected
426
+ assert re . search ( expected , repr (serializer )) is not None
421
427
422
428
def test_ignore_validation_for_null_fields (self ):
423
429
# None values that are on fields which are part of the uniqueness
@@ -540,16 +546,16 @@ def test_repr(self):
540
546
# the order of validators isn't deterministic so delete
541
547
# fancy_conditions field that has two of them
542
548
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\(\)\)>\]\ )
549
555
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'\)\)>\ ]
551
557
""" )
552
- assert repr (serializer ) == expected
558
+ assert re . search ( expected , repr (serializer )) is not None
553
559
554
560
def test_unique_together_field (self ):
555
561
"""
@@ -569,15 +575,18 @@ def test_single_field_uniq_validators(self):
569
575
UniqueConstraint with single field must be transformed into
570
576
field's UniqueValidator
571
577
"""
578
+ # Django 5 includes Max and Min values validators for IntergerField
579
+ extra_validators_qty = 2 if django_version [0 ] >= 5 else 0
580
+ #
572
581
serializer = UniqueConstraintSerializer ()
573
582
assert len (serializer .validators ) == 1
574
583
validators = serializer .fields ['global_id' ].validators
575
- assert len (validators ) == 1
584
+ assert len (validators ) == 1 + extra_validators_qty
576
585
assert validators [0 ].queryset == UniqueConstraintModel .objects
577
586
578
587
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" ) }
581
590
assert ids_in_qs == {frozenset ([1 ]), frozenset ([3 ])}
582
591
583
592
0 commit comments