22
33import django
44from django .db .models import Case , Count , Q , When
5- from django .test import TestCase
5+ from django .test import TestCase , TransactionTestCase
66from django .utils import six
77
88from polymorphic .models import PolymorphicTypeUndefined
99from polymorphic .tests import * # all models
1010
1111
12- class PolymorphicTests (TestCase ):
12+ class PolymorphicTests (TransactionTestCase ):
1313 """
1414 The test suite
1515 """
@@ -129,19 +129,23 @@ def create_model2abcd(self):
129129 Create the chain of objects of Model2,
130130 this is reused in various tests.
131131 """
132- Model2A .objects .create (field1 = 'A1' )
133- Model2B .objects .create (field1 = 'B1' , field2 = 'B2' )
134- Model2C .objects .create (field1 = 'C1' , field2 = 'C2' , field3 = 'C3' )
135- Model2D .objects .create (field1 = 'D1' , field2 = 'D2' , field3 = 'D3' , field4 = 'D4' )
132+ a = Model2A .objects .create (field1 = 'A1' )
133+ b = Model2B .objects .create (field1 = 'B1' , field2 = 'B2' )
134+ c = Model2C .objects .create (field1 = 'C1' , field2 = 'C2' , field3 = 'C3' )
135+ d = Model2D .objects .create (field1 = 'D1' , field2 = 'D2' , field3 = 'D3' , field4 = 'D4' )
136+
137+ return a , b , c , d
136138
137139 def test_simple_inheritance (self ):
138140 self .create_model2abcd ()
139141
140- objects = list (Model2A .objects .all ())
141- self .assertEqual (repr (objects [0 ]), '<Model2A: id 1, field1 (CharField)>' )
142- self .assertEqual (repr (objects [1 ]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>' )
143- self .assertEqual (repr (objects [2 ]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
144- self .assertEqual (repr (objects [3 ]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>' )
142+ objects = Model2A .objects .all ()
143+ self .assertQuerysetEqual (
144+ objects ,
145+ [Model2A , Model2B , Model2C , Model2D ],
146+ transform = lambda o : o .__class__ ,
147+ ordered = False ,
148+ )
145149
146150 def test_defer_fields (self ):
147151 self .create_model2abcd ()
@@ -184,69 +188,68 @@ def test_defer_related_fields(self):
184188 objects_deferred_field4 = Model2A .objects .defer ('Model2D___field4' )
185189 self .assertNotIn ('field4' , objects_deferred_field4 [3 ].__dict__ ,
186190 'field4 was not deferred (using defer(), traversing inheritance)' )
187- self .assertEqual (repr (objects_deferred_field4 [0 ]),
188- '<Model2A: id 1, field1 (CharField)>' )
189- self .assertEqual (repr (objects_deferred_field4 [1 ]),
190- '<Model2B: id 2, field1 (CharField), field2 (CharField)>' )
191- self .assertEqual (repr (objects_deferred_field4 [2 ]),
192- '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
193- self .assertEqual (repr (objects_deferred_field4 [3 ]),
194- '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField), deferred[field4]>' )
191+ self .assertEqual (objects_deferred_field4 [0 ].__class__ , Model2A )
192+ self .assertEqual (objects_deferred_field4 [1 ].__class__ , Model2B )
193+ self .assertEqual (objects_deferred_field4 [2 ].__class__ , Model2C )
194+ self .assertEqual (objects_deferred_field4 [3 ].__class__ , Model2D )
195195
196196 objects_only_field4 = Model2A .objects .only (
197197 'polymorphic_ctype' , 'field1' ,
198198 'Model2B___id' , 'Model2B___field2' , 'Model2B___model2a_ptr' ,
199199 'Model2C___id' , 'Model2C___field3' , 'Model2C___model2b_ptr' ,
200200 'Model2D___id' , 'Model2D___model2c_ptr' )
201- self .assertEqual (repr (objects_only_field4 [0 ]),
202- '<Model2A: id 1, field1 (CharField)>' )
203- self .assertEqual (repr (objects_only_field4 [1 ]),
204- '<Model2B: id 2, field1 (CharField), field2 (CharField)>' )
205- self .assertEqual (repr (objects_only_field4 [2 ]),
206- '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
207- self .assertEqual (repr (objects_only_field4 [3 ]),
208- '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField), deferred[field4]>' )
201+ self .assertEqual (objects_only_field4 [0 ].__class__ , Model2A )
202+ self .assertEqual (objects_only_field4 [1 ].__class__ , Model2B )
203+ self .assertEqual (objects_only_field4 [2 ].__class__ , Model2C )
204+ self .assertEqual (objects_only_field4 [3 ].__class__ , Model2D )
209205
210206 def test_manual_get_real_instance (self ):
211207 self .create_model2abcd ()
212208
213209 o = Model2A .objects .non_polymorphic ().get (field1 = 'C1' )
214- self .assertEqual (repr ( o .get_real_instance ()), '< Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
210+ self .assertEqual (o .get_real_instance (). __class__ , Model2C )
215211
216212 def test_non_polymorphic (self ):
217213 self .create_model2abcd ()
218214
219215 objects = list (Model2A .objects .all ().non_polymorphic ())
220- self .assertEqual (repr (objects [0 ]), '<Model2A: id 1, field1 (CharField)>' )
221- self .assertEqual (repr (objects [1 ]), '<Model2A: id 2, field1 (CharField)>' )
222- self .assertEqual (repr (objects [2 ]), '<Model2A: id 3, field1 (CharField)>' )
223- self .assertEqual (repr (objects [3 ]), '<Model2A: id 4, field1 (CharField)>' )
216+ self .assertQuerysetEqual (
217+ objects ,
218+ [Model2A , Model2A , Model2A , Model2A ],
219+ transform = lambda o : o .__class__ ,
220+ )
224221
225222 def test_get_real_instances (self ):
226223 self .create_model2abcd ()
227224 qs = Model2A .objects .all ().non_polymorphic ()
228225
229226 # from queryset
230227 objects = qs .get_real_instances ()
231- self .assertEqual (repr (objects [0 ]), '<Model2A: id 1, field1 (CharField)>' )
232- self .assertEqual (repr (objects [1 ]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>' )
233- self .assertEqual (repr (objects [2 ]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
234- self .assertEqual (repr (objects [3 ]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>' )
228+ self .assertQuerysetEqual (
229+ objects ,
230+ [Model2A , Model2B , Model2C , Model2D ],
231+ transform = lambda o : o .__class__ ,
232+ )
235233
236234 # from a manual list
237235 objects = Model2A .objects .get_real_instances (list (qs ))
238- self .assertEqual (repr (objects [0 ]), '<Model2A: id 1, field1 (CharField)>' )
239- self .assertEqual (repr (objects [1 ]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>' )
240- self .assertEqual (repr (objects [2 ]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
241- self .assertEqual (repr (objects [3 ]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>' )
236+ self .assertQuerysetEqual (
237+ objects ,
238+ [Model2A , Model2B , Model2C , Model2D ],
239+ transform = lambda o : o .__class__ ,
240+ )
242241
243242 def test_translate_polymorphic_q_object (self ):
244243 self .create_model2abcd ()
245244
246245 q = Model2A .translate_polymorphic_Q_object (Q (instance_of = Model2C ))
247246 objects = Model2A .objects .filter (q )
248- self .assertEqual (repr (objects [0 ]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
249- self .assertEqual (repr (objects [1 ]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>' )
247+ self .assertQuerysetEqual (
248+ objects ,
249+ [Model2C , Model2D ],
250+ transform = lambda o : o .__class__ ,
251+ ordered = False ,
252+ )
250253
251254 def test_base_manager (self ):
252255 def show_base_manager (model ):
@@ -293,10 +296,10 @@ def test_foreignkey_field(self):
293296 self .create_model2abcd ()
294297
295298 object2a = Model2A .base_objects .get (field1 = 'C1' )
296- self .assertEqual (repr ( object2a .model2b ), '< Model2B: id 3, field1 (CharField), field2 (CharField)>' )
299+ self .assertEqual (object2a .model2b . __class__ , Model2B )
297300
298301 object2b = Model2B .base_objects .get (field1 = 'C1' )
299- self .assertEqual (repr ( object2b .model2c ), '< Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
302+ self .assertEqual (object2b .model2c . __class__ , Model2C )
300303
301304 def test_onetoone_field (self ):
302305 self .create_model2abcd ()
@@ -305,11 +308,15 @@ def test_onetoone_field(self):
305308 b = One2OneRelatingModelDerived .objects .create (one2one = a , field1 = 'f1' , field2 = 'f2' )
306309
307310 # this result is basically wrong, probably due to Django cacheing (we used base_objects), but should not be a problem
308- self .assertEqual (repr (b .one2one ), '<Model2A: id 3, field1 (CharField)>' )
311+ self .assertEqual (b .one2one .__class__ , Model2A )
312+ self .assertEqual (b .one2one_id , b .one2one .id )
309313
310314 c = One2OneRelatingModelDerived .objects .get (field1 = 'f1' )
311- self .assertEqual (repr (c .one2one ), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
312- self .assertEqual (repr (a .one2onerelatingmodel ), '<One2OneRelatingModelDerived: One2OneRelatingModelDerived object>' )
315+ self .assertEqual (c .one2one .__class__ , Model2C )
316+ self .assertEqual (
317+ a .one2onerelatingmodel .__class__ ,
318+ One2OneRelatingModelDerived ,
319+ )
313320
314321 def test_manytomany_field (self ):
315322 # Model 1
@@ -336,19 +343,32 @@ def test_manytomany_field(self):
336343 # no pretty printing
337344 ModelShow1_plain .objects .create (field1 = 'abc' )
338345 ModelShow2_plain .objects .create (field1 = 'abc' , field2 = 'def' )
339- self .assertEqual (qrepr (ModelShow1_plain .objects .all ()), '<PolymorphicQuerySet [<ModelShow1_plain: ModelShow1_plain object>, <ModelShow2_plain: ModelShow2_plain object>]>' )
346+ self .assertQuerysetEqual (
347+ ModelShow1_plain .objects .all (),
348+ [ModelShow1_plain , ModelShow2_plain ],
349+ transform = lambda o : o .__class__ ,
350+ ordered = False ,
351+ )
340352
341353 def test_extra_method (self ):
342- self .create_model2abcd ()
354+ a , b , c , d = self .create_model2abcd ()
343355
344- objects = list (Model2A .objects .extra (where = ['id IN (2, 3)' ]))
345- self .assertEqual (repr (objects [0 ]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>' )
346- self .assertEqual (repr (objects [1 ]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
356+ objects = Model2A .objects .extra (
357+ where = ['id IN ({}, {})' .format (b .id , c .id )]
358+ )
359+ self .assertQuerysetEqual (
360+ objects ,
361+ [Model2B , Model2C ],
362+ transform = lambda o : o .__class__ ,
363+ ordered = False ,
364+ )
347365
348366 objects = Model2A .objects .extra (select = {"select_test" : "field1 = 'A1'" }, where = ["field1 = 'A1' OR field1 = 'B1'" ], order_by = ['-id' ])
349- self .assertEqual (repr (objects [0 ]), '<Model2B: id 2, field1 (CharField), field2 (CharField) - Extra: select_test (int)>' )
350- self .assertEqual (repr (objects [1 ]), '<Model2A: id 1, field1 (CharField) - Extra: select_test (int)>' )
351- self .assertEqual (len (objects ), 2 ) # Placed after the other tests, only verifying whether there are no more additional objects.
367+ self .assertQuerysetEqual (
368+ objects ,
369+ [Model2B , Model2A ],
370+ transform = lambda o : o .__class__ ,
371+ )
352372
353373 ModelExtraA .objects .create (field1 = 'A1' )
354374 ModelExtraB .objects .create (field1 = 'B1' , field2 = 'B2' )
@@ -371,34 +391,47 @@ def test_instance_of_filter(self):
371391 self .create_model2abcd ()
372392
373393 objects = Model2A .objects .instance_of (Model2B )
374- self .assertEqual (repr (objects [0 ]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>' )
375- self .assertEqual (repr (objects [1 ]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
376- self .assertEqual (repr (objects [2 ]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>' )
377- self .assertEqual (len (objects ), 3 )
394+ self .assertQuerysetEqual (
395+ objects ,
396+ [Model2B , Model2C , Model2D ],
397+ transform = lambda o : o .__class__ ,
398+ ordered = False ,
399+ )
378400
379401 objects = Model2A .objects .filter (instance_of = Model2B )
380- self .assertEqual (repr (objects [0 ]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>' )
381- self .assertEqual (repr (objects [1 ]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
382- self .assertEqual (repr (objects [2 ]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>' )
383- self .assertEqual (len (objects ), 3 )
402+ self .assertQuerysetEqual (
403+ objects ,
404+ [Model2B , Model2C , Model2D ],
405+ transform = lambda o : o .__class__ ,
406+ ordered = False ,
407+ )
384408
385409 objects = Model2A .objects .filter (Q (instance_of = Model2B ))
386- self .assertEqual (repr (objects [0 ]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>' )
387- self .assertEqual (repr (objects [1 ]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
388- self .assertEqual (repr (objects [2 ]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>' )
389- self .assertEqual (len (objects ), 3 )
410+ self .assertQuerysetEqual (
411+ objects ,
412+ [Model2B , Model2C , Model2D ],
413+ transform = lambda o : o .__class__ ,
414+ ordered = False ,
415+ )
390416
391417 objects = Model2A .objects .not_instance_of (Model2B )
392- self .assertEqual (repr (objects [0 ]), '<Model2A: id 1, field1 (CharField)>' )
393- self .assertEqual (len (objects ), 1 )
418+ self .assertQuerysetEqual (
419+ objects ,
420+ [Model2A ],
421+ transform = lambda o : o .__class__ ,
422+ ordered = False ,
423+ )
394424
395425 def test_polymorphic___filter (self ):
396426 self .create_model2abcd ()
397427
398428 objects = Model2A .objects .filter (Q (Model2B___field2 = 'B2' ) | Q (Model2C___field3 = 'C3' ))
399- self .assertEqual (len (objects ), 2 )
400- self .assertEqual (repr (objects [0 ]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>' )
401- self .assertEqual (repr (objects [1 ]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
429+ self .assertQuerysetEqual (
430+ objects ,
431+ [Model2B , Model2C ],
432+ transform = lambda o : o .__class__ ,
433+ ordered = False ,
434+ )
402435
403436 def test_query_filter_exclude_is_immutable (self ):
404437 # given
@@ -434,18 +467,20 @@ def test_polymorphic___filter_reverse_field(self):
434467 self .assertEqual (len (objects ), 1 )
435468
436469 def test_delete (self ):
437- self .create_model2abcd ()
470+ a , b , c , d = self .create_model2abcd ()
438471
439- oa = Model2A .objects .get (id = 2 )
440- self .assertEqual (repr ( oa ), '< Model2B: id 2, field1 (CharField), field2 (CharField)>' )
472+ oa = Model2A .objects .get (id = b . id )
473+ self .assertEqual (oa . __class__ , Model2B )
441474 self .assertEqual (Model2A .objects .count (), 4 )
442475
443476 oa .delete ()
444477 objects = Model2A .objects .all ()
445- self .assertEqual (repr (objects [0 ]), '<Model2A: id 1, field1 (CharField)>' )
446- self .assertEqual (repr (objects [1 ]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>' )
447- self .assertEqual (repr (objects [2 ]), '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField)>' )
448- self .assertEqual (len (objects ), 3 )
478+ self .assertQuerysetEqual (
479+ objects ,
480+ [Model2A , Model2C , Model2D ],
481+ transform = lambda o : o .__class__ ,
482+ ordered = False ,
483+ )
449484
450485 def test_combine_querysets (self ):
451486 ModelX .objects .create (field_x = 'x' )
@@ -506,9 +541,14 @@ def test_user_defined_manager(self):
506541 ModelWithMyManager .objects .create (field1 = 'D1b' , field4 = 'D4b' )
507542
508543 objects = ModelWithMyManager .objects .all () # MyManager should reverse the sorting of field1
509- self .assertEqual (repr (objects [0 ]), '<ModelWithMyManager: id 6, field1 (CharField) "D1b", field4 (CharField) "D4b">' )
510- self .assertEqual (repr (objects [1 ]), '<ModelWithMyManager: id 5, field1 (CharField) "D1a", field4 (CharField) "D4a">' )
511- self .assertEqual (len (objects ), 2 )
544+ self .assertQuerysetEqual (
545+ objects ,
546+ [
547+ (ModelWithMyManager , 'D1b' , 'D4b' ),
548+ (ModelWithMyManager , 'D1a' , 'D4a' ),
549+ ],
550+ transform = lambda o : (o .__class__ , o .field1 , o .field4 ),
551+ )
512552
513553 self .assertIs (type (ModelWithMyManager .objects ), MyManager )
514554 self .assertIs (type (ModelWithMyManager ._default_manager ), MyManager )
@@ -520,9 +560,14 @@ def test_user_defined_manager_as_secondary(self):
520560 ModelWithMyManagerNoDefault .objects .create (field1 = 'D1b' , field4 = 'D4b' )
521561
522562 objects = ModelWithMyManagerNoDefault .my_objects .all () # MyManager should reverse the sorting of field1
523- self .assertEqual (repr (objects [0 ]), '<ModelWithMyManagerNoDefault: id 6, field1 (CharField) "D1b", field4 (CharField) "D4b">' )
524- self .assertEqual (repr (objects [1 ]), '<ModelWithMyManagerNoDefault: id 5, field1 (CharField) "D1a", field4 (CharField) "D4a">' )
525- self .assertEqual (len (objects ), 2 )
563+ self .assertQuerysetEqual (
564+ objects ,
565+ [
566+ (ModelWithMyManagerNoDefault , 'D1b' , 'D4b' ),
567+ (ModelWithMyManagerNoDefault , 'D1a' , 'D4a' ),
568+ ],
569+ transform = lambda o : (o .__class__ , o .field1 , o .field4 ),
570+ )
526571
527572 self .assertIs (type (ModelWithMyManagerNoDefault .my_objects ), MyManager )
528573 self .assertIs (type (ModelWithMyManagerNoDefault .objects ), PolymorphicManager )
@@ -545,9 +590,15 @@ def test_user_defined_queryset_as_manager(self):
545590 ModelWithMyManager2 .objects .create (field1 = 'D1b' , field4 = 'D4b' )
546591
547592 objects = ModelWithMyManager2 .objects .all ()
548- self .assertEqual (repr (objects [0 ]), '<ModelWithMyManager2: id 5, field1 (CharField) "D1a", field4 (CharField) "D4a">' )
549- self .assertEqual (repr (objects [1 ]), '<ModelWithMyManager2: id 6, field1 (CharField) "D1b", field4 (CharField) "D4b">' )
550- self .assertEqual (len (objects ), 2 )
593+ self .assertQuerysetEqual (
594+ objects ,
595+ [
596+ (ModelWithMyManager2 , 'D1a' , 'D4a' ),
597+ (ModelWithMyManager2 , 'D1b' , 'D4b' ),
598+ ],
599+ transform = lambda o : (o .__class__ , o .field1 , o .field4 ),
600+ ordered = False ,
601+ )
551602
552603 self .assertEqual (type (ModelWithMyManager2 .objects ).__name__ , 'PolymorphicManagerFromMyManagerQuerySet' )
553604 self .assertEqual (type (ModelWithMyManager2 ._default_manager ).__name__ , 'PolymorphicManagerFromMyManagerQuerySet' )
0 commit comments