6
6
from django .core import serializers
7
7
from django .core .exceptions import ValidationError
8
8
from django .core .management import call_command
9
- from django .db import transaction
9
+ from django .db import connection , transaction
10
10
from django .db .models import Q
11
11
from django .http import QueryDict
12
12
from django .test import Client , TestCase
@@ -80,6 +80,22 @@ class EnumTypeMixin:
80
80
type at the specific test in question.
81
81
"""
82
82
83
+ fields = [
84
+ 'small_pos_int' ,
85
+ 'small_int' ,
86
+ 'pos_int' ,
87
+ 'int' ,
88
+ 'big_pos_int' ,
89
+ 'big_int' ,
90
+ 'constant' ,
91
+ 'text' ,
92
+ 'dj_int_enum' ,
93
+ 'dj_text_enum' ,
94
+ 'non_strict_int' ,
95
+ 'non_strict_text' ,
96
+ 'no_coerce' ,
97
+ ]
98
+
83
99
@property
84
100
def SmallPosIntEnum (self ):
85
101
return self .MODEL_CLASS ._meta .get_field ('small_pos_int' ).enum
@@ -167,6 +183,53 @@ def test_basic_save(self):
167
183
self .assertEqual (self .MODEL_CLASS .objects .filter (** {param : value }).count (), 1 )
168
184
self .MODEL_CLASS .objects .all ().delete ()
169
185
186
+ def test_to_python_deferred_attribute (self ):
187
+ obj = self .MODEL_CLASS .objects .create (** self .create_params )
188
+ with self .assertNumQueries (1 ):
189
+ obj2 = self .MODEL_CLASS .objects .only ('id' ).get (pk = obj .pk )
190
+
191
+ for field in [
192
+ field .name for field in self .MODEL_CLASS ._meta .fields
193
+ if field .name != 'id'
194
+ ]:
195
+ # each of these should result in a db query
196
+ with self .assertNumQueries (1 ):
197
+ self .assertEqual (
198
+ getattr (obj , field ),
199
+ getattr (obj2 , field )
200
+ )
201
+
202
+ with self .assertNumQueries (2 ):
203
+ self .assertEqual (
204
+ getattr (
205
+ self .MODEL_CLASS .objects .defer (field ).get (pk = obj .pk ),
206
+ field
207
+ ),
208
+ getattr (obj , field ),
209
+ )
210
+
211
+ # test that all coerced fields are coerced to the Enum type on
212
+ # assignment - this also tests symmetric value assignment in the
213
+ # derived class
214
+ set_tester = self .MODEL_CLASS ()
215
+ for field , value in self .values_params .items ():
216
+ setattr (set_tester , field , getattr (value , 'value' , value ))
217
+ if self .MODEL_CLASS ._meta .get_field (field ).coerce :
218
+ try :
219
+ self .assertIsInstance (getattr (set_tester , field ), self .enum_type (field ))
220
+ except AssertionError :
221
+ self .assertFalse (self .MODEL_CLASS ._meta .get_field (field ).strict )
222
+ self .assertIsInstance (getattr (set_tester , field ), self .enum_primitive (field ))
223
+ else :
224
+ self .assertNotIsInstance (getattr (set_tester , field ), self .enum_type (field ))
225
+ self .assertIsInstance (getattr (set_tester , field ), self .enum_primitive (field ))
226
+
227
+ # extra verification - save and make sure values are expected
228
+ set_tester .save ()
229
+ set_tester .refresh_from_db ()
230
+ for field , value in self .values_params .items ():
231
+ self .assertEqual (getattr (set_tester , field ), value )
232
+
170
233
def test_integer_choices (self ):
171
234
self .do_test_integer_choices ()
172
235
@@ -731,7 +794,6 @@ def test_instance(self):
731
794
def test_data (self ):
732
795
form = self .FORM_CLASS (data = self .model_params )
733
796
form .full_clean ()
734
- print (form .errors )
735
797
self .assertTrue (form .is_valid ())
736
798
for field , value in self .model_params .items ():
737
799
self .verify_field (form , field , value )
@@ -3075,14 +3137,12 @@ def test_mapboxstyle(self):
3075
3137
3076
3138
# uri's are symmetric
3077
3139
map_obj .style = 'mapbox://styles/mapbox/light-v10'
3078
- map_obj .full_clean ()
3079
3140
self .assertTrue (map_obj .style == Map .MapBoxStyle .LIGHT )
3080
3141
self .assertTrue (map_obj .style == 3 )
3081
3142
self .assertTrue (map_obj .style == 'light' )
3082
3143
3083
3144
# so are labels (also case insensitive)
3084
3145
map_obj .style = 'satellite streets'
3085
- map_obj .full_clean ()
3086
3146
self .assertTrue (map_obj .style == Map .MapBoxStyle .SATELLITE_STREETS )
3087
3147
3088
3148
# when used in API calls (coerced to strings) - they "do the right
@@ -3110,7 +3170,6 @@ def test_color(self):
3110
3170
3111
3171
# save by any symmetric value
3112
3172
instance .color = 'FF0000'
3113
- instance .full_clean ()
3114
3173
3115
3174
# access any property right from the model field
3116
3175
self .assertTrue (instance .color .hex == 'ff0000' )
@@ -3162,8 +3221,7 @@ def test_strict(self):
3162
3221
3163
3222
# set to a valid EnumType value
3164
3223
obj .non_strict = '1'
3165
- obj .full_clean ()
3166
- # when accessed from the db or after clean, will be an EnumType instance
3224
+ # when accessed will be an EnumType instance
3167
3225
self .assertTrue (obj .non_strict is StrictExample .EnumType .ONE )
3168
3226
3169
3227
# we can also store any string less than or equal to length 10
@@ -3178,7 +3236,6 @@ def test_basic(self):
3178
3236
txt_enum = MyModel .TextEnum .VALUE1 ,
3179
3237
int_enum = 3 # by-value assignment also works
3180
3238
)
3181
- instance .refresh_from_db ()
3182
3239
3183
3240
self .assertTrue (instance .txt_enum == MyModel .TextEnum ('V1' ))
3184
3241
self .assertTrue (instance .txt_enum .label == 'Value 1' )
@@ -3193,7 +3250,7 @@ def test_basic(self):
3193
3250
int_enum = 3
3194
3251
)
3195
3252
3196
- instance .txt_enum = 'AA'
3253
+ instance .txt_enum = 'AA'
3197
3254
self .assertRaises (ValidationError , instance .full_clean )
3198
3255
3199
3256
def test_no_coerce (self ):
0 commit comments