1
1
import datetime
2
+ import re
2
3
from unittest .mock import MagicMock
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
+ self . assertTrue ( 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
+ self . assertTrue ( 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
+ self . assertTrue ( 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
+ self . assertTrue ( 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
@@ -524,16 +530,16 @@ def test_repr(self):
524
530
# the order of validators isn't deterministic so delete
525
531
# fancy_conditions field that has two of them
526
532
del serializer .fields ['fancy_conditions' ]
527
- expected = dedent ("""
528
- UniqueConstraintSerializer( ):
529
- id = IntegerField(label='ID', read_only=True)
530
- race_name = CharField(max_length=100, required=True)
531
- position = IntegerField( required=True)
532
- global_id = IntegerField( validators=[<UniqueValidator(queryset=UniqueConstraintModel.objects.all())>] )
533
+ expected = dedent (r """
534
+ UniqueConstraintSerializer\(\ ):
535
+ id = IntegerField\ (label='ID', read_only=True\ )
536
+ race_name = CharField\ (max_length=100, required=True\ )
537
+ position = IntegerField\(.* required=True\ )
538
+ global_id = IntegerField\(.* validators=\ [<UniqueValidator\ (queryset=UniqueConstraintModel.objects.all\(\)\)>\]\ )
533
539
class Meta:
534
- validators = [<UniqueTogetherValidator(queryset=<QuerySet [<UniqueConstraintModel: UniqueConstraintModel object (1 )>, <UniqueConstraintModel: UniqueConstraintModel object (2)> ]>, fields=('race_name', 'position'))> ]
540
+ validators = \ [<UniqueTogetherValidator\ (queryset=<QuerySet \ [<UniqueConstraintModel: UniqueConstraintModel object \(1\ )>, <UniqueConstraintModel: UniqueConstraintModel object \(2\)>\ ]>, fields=\ ('race_name', 'position'\)\)>\ ]
535
541
""" )
536
- assert repr (serializer ) == expected
542
+ self . assertTrue ( re . search ( expected , repr (serializer )) is not None )
537
543
538
544
def test_unique_together_field (self ):
539
545
"""
@@ -553,15 +559,18 @@ def test_single_field_uniq_validators(self):
553
559
UniqueConstraint with single field must be transformed into
554
560
field's UniqueValidator
555
561
"""
562
+ # Django 5 includes Max and Min values validators for IntergerField
563
+ extra_validators_qty = 2 if django_version [0 ] >= 5 else 0
564
+ #
556
565
serializer = UniqueConstraintSerializer ()
557
566
assert len (serializer .validators ) == 1
558
567
validators = serializer .fields ['global_id' ].validators
559
- assert len (validators ) == 1
568
+ assert len (validators ) == 1 + extra_validators_qty
560
569
assert validators [0 ].queryset == UniqueConstraintModel .objects
561
570
562
571
validators = serializer .fields ['fancy_conditions' ].validators
563
- assert len (validators ) == 2
564
- ids_in_qs = {frozenset (v .queryset .values_list (flat = True )) for v in validators }
572
+ assert len (validators ) == 2 + extra_validators_qty
573
+ ids_in_qs = {frozenset (v .queryset .values_list (flat = True )) for v in validators if hasattr ( v , "queryset" ) }
565
574
assert ids_in_qs == {frozenset ([1 ]), frozenset ([3 ])}
566
575
567
576
0 commit comments