Skip to content

Commit 80b4f2b

Browse files
Hugo Osvaldo Barrerajleclanche
authored andcommitted
Fix failing tests with django/master
Several tests were failing with django master. This is because, apparently, IDs don't match those expected in tests, and other test-related details. Replace all test comparisons with assertQuerysetEqual, which is safer and cleaner for the sort of comparison we're doing.
1 parent 3af5db0 commit 80b4f2b

File tree

2 files changed

+152
-101
lines changed

2 files changed

+152
-101
lines changed

polymorphic/tests/test_orm.py

Lines changed: 139 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
import django
44
from django.db.models import Case, Count, Q, When
5-
from django.test import TestCase
5+
from django.test import TestCase, TransactionTestCase
66
from django.utils import six
77

88
from polymorphic.models import PolymorphicTypeUndefined
99
from 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

Comments
 (0)