Skip to content

Commit 4240931

Browse files
authored
Merge pull request #562 from akx/improve-testing
Use pytest for testing & modernize assertions
2 parents d6b507f + 63d291f commit 4240931

14 files changed

+425
-462
lines changed

docs/contributing.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ We require features to be backed by a unit test.
1313
This way, we can test *django-polymorphic* against new Django versions.
1414
To run the included test suite, execute::
1515

16-
./runtests.py
16+
py.test
1717

1818
To test support for multiple Python and Django versions, run tox from the repository root::
1919

manage.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# This helps pytest-django locate the project.
2+
import os
3+
import sys
4+
5+
if __name__ == "__main__":
6+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "polymorphic_test_settings")
7+
from django.core.management import execute_from_command_line
8+
9+
execute_from_command_line(sys.argv)

polymorphic/tests/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import django
2+
3+
if django.VERSION < (4, 2): # TODO: remove when dropping support for Django < 4.2
4+
from django.test.testcases import TransactionTestCase
5+
6+
TransactionTestCase.assertQuerySetEqual = TransactionTestCase.assertQuerysetEqual

polymorphic/tests/admintestcase.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def admin_get_add(self, model, qs=""):
9494
admin_instance = self.get_admin_instance(model)
9595
request = self.create_admin_request("get", self.get_add_url(model) + qs)
9696
response = admin_instance.add_view(request)
97-
self.assertEqual(response.status_code, 200)
97+
assert response.status_code == 200
9898
return response
9999

100100
def admin_post_add(self, model, formdata, qs=""):
@@ -114,7 +114,7 @@ def admin_get_changelist(self, model):
114114
admin_instance = self.get_admin_instance(model)
115115
request = self.create_admin_request("get", self.get_changelist_url(model))
116116
response = admin_instance.changelist_view(request)
117-
self.assertEqual(response.status_code, 200)
117+
assert response.status_code == 200
118118
return response
119119

120120
def admin_get_change(self, model, object_id, query=None, **extra):
@@ -126,7 +126,7 @@ def admin_get_change(self, model, object_id, query=None, **extra):
126126
"get", self.get_change_url(model, object_id), data=query, **extra
127127
)
128128
response = admin_instance.change_view(request, str(object_id))
129-
self.assertEqual(response.status_code, 200)
129+
assert response.status_code == 200
130130
return response
131131

132132
def admin_post_change(self, model, object_id, formdata, **extra):
@@ -150,7 +150,7 @@ def admin_get_history(self, model, object_id, query=None, **extra):
150150
"get", self.get_history_url(model, object_id), data=query, **extra
151151
)
152152
response = admin_instance.history_view(request, str(object_id))
153-
self.assertEqual(response.status_code, 200)
153+
assert response.status_code == 200
154154
return response
155155

156156
def admin_get_delete(self, model, object_id, query=None, **extra):
@@ -162,7 +162,7 @@ def admin_get_delete(self, model, object_id, query=None, **extra):
162162
"get", self.get_delete_url(model, object_id), data=query, **extra
163163
)
164164
response = admin_instance.delete_view(request, str(object_id))
165-
self.assertEqual(response.status_code, 200)
165+
assert response.status_code == 200
166166
return response
167167

168168
def admin_post_delete(self, model, object_id, **extra):
@@ -175,7 +175,7 @@ def admin_post_delete(self, model, object_id, **extra):
175175
admin_instance = self.get_admin_instance(model)
176176
request = self.create_admin_request("post", self.get_delete_url(model, object_id), **extra)
177177
response = admin_instance.delete_view(request, str(object_id))
178-
self.assertEqual(response.status_code, 302, f"Form errors in calling {request.path}")
178+
assert response.status_code == 302, f"Form errors in calling {request.path}"
179179
return response
180180

181181
def create_admin_request(self, method, url, data=None, **extra):
@@ -209,7 +209,7 @@ def assertFormSuccess(self, request_url, response):
209209
"""
210210
Assert that the response was a redirect, not a form error.
211211
"""
212-
self.assertIn(response.status_code, [200, 302])
212+
assert response.status_code in [200, 302]
213213
if response.status_code != 302:
214214
context_data = response.context_data
215215
if "errors" in context_data:
@@ -219,12 +219,9 @@ def assertFormSuccess(self, request_url, response):
219219
else:
220220
raise KeyError("Unknown field for errors in the TemplateResponse!")
221221

222-
self.assertEqual(
223-
response.status_code,
224-
302,
225-
"Form errors in calling {}:\n{}".format(request_url, errors.as_text()),
222+
assert response.status_code == 302, "Form errors in calling {}:\n{}".format(
223+
request_url, errors.as_text()
226224
)
227-
self.assertTrue(
228-
"/login/?next=" not in response["Location"],
229-
f"Received login response for {request_url}",
230-
)
225+
assert (
226+
"/login/?next=" not in response["Location"]
227+
), f"Received login response for {request_url}"

polymorphic/tests/test_admin.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pytest
12
from django.contrib import admin
23
from django.contrib.contenttypes.models import ContentType
34
from django.utils.html import escape
@@ -53,9 +54,9 @@ class Model2ChildAdmin(PolymorphicChildModelAdmin):
5354
)
5455

5556
d_obj = Model2A.objects.all()[0]
56-
self.assertEqual(d_obj.__class__, Model2D)
57-
self.assertEqual(d_obj.field1, "A")
58-
self.assertEqual(d_obj.field2, "B")
57+
assert d_obj.__class__ == Model2D
58+
assert d_obj.field1 == "A"
59+
assert d_obj.field2 == "B"
5960

6061
# -- list page
6162
self.admin_get_changelist(Model2A) # asserts 200
@@ -70,18 +71,18 @@ class Model2ChildAdmin(PolymorphicChildModelAdmin):
7071
)
7172

7273
d_obj.refresh_from_db()
73-
self.assertEqual(d_obj.field1, "A2")
74-
self.assertEqual(d_obj.field2, "B2")
75-
self.assertEqual(d_obj.field3, "C2")
76-
self.assertEqual(d_obj.field4, "D2")
74+
assert d_obj.field1 == "A2"
75+
assert d_obj.field2 == "B2"
76+
assert d_obj.field3 == "C2"
77+
assert d_obj.field4 == "D2"
7778

7879
# -- history
7980
self.admin_get_history(Model2A, d_obj.pk)
8081

8182
# -- delete
8283
self.admin_get_delete(Model2A, d_obj.pk)
8384
self.admin_post_delete(Model2A, d_obj.pk)
84-
self.assertRaises(Model2A.DoesNotExist, lambda: d_obj.refresh_from_db())
85+
pytest.raises(Model2A.DoesNotExist, (lambda: d_obj.refresh_from_db()))
8586

8687
def test_admin_inlines(self):
8788
"""
@@ -103,7 +104,7 @@ class InlineParentAdmin(PolymorphicInlineSupportMixin, admin.ModelAdmin):
103104
inlines = (Inline,)
104105

105106
parent = InlineParent.objects.create(title="FOO")
106-
self.assertEqual(parent.inline_children.count(), 0)
107+
assert parent.inline_children.count() == 0
107108

108109
# -- get edit page
109110
response = self.admin_get_change(InlineParent, parent.pk)
@@ -133,9 +134,9 @@ class InlineParentAdmin(PolymorphicInlineSupportMixin, admin.ModelAdmin):
133134
)
134135

135136
parent.refresh_from_db()
136-
self.assertEqual(parent.title, "FOO2")
137-
self.assertEqual(parent.inline_children.count(), 1)
137+
assert parent.title == "FOO2"
138+
assert parent.inline_children.count() == 1
138139
child = parent.inline_children.all()[0]
139-
self.assertEqual(child.__class__, InlineModelB)
140-
self.assertEqual(child.field1, "A2")
141-
self.assertEqual(child.field2, "B2")
140+
assert child.__class__ == InlineModelB
141+
assert child.field1 == "A2"
142+
assert child.field2 == "B2"

polymorphic/tests/test_contrib.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from unittest import TestCase
1+
from django.test import TestCase
22

33
from polymorphic.contrib.guardian import get_polymorphic_base_content_type
44
from polymorphic.tests.models import Model2D, PlainC
@@ -13,15 +13,15 @@ def test_contrib_guardian(self):
1313
# Regular Django inheritance should return the child model content type.
1414
obj = PlainC()
1515
ctype = get_polymorphic_base_content_type(obj)
16-
self.assertEqual(ctype.name, "plain c")
16+
assert ctype.name == "plain c"
1717

1818
ctype = get_polymorphic_base_content_type(PlainC)
19-
self.assertEqual(ctype.name, "plain c")
19+
assert ctype.name == "plain c"
2020

2121
# Polymorphic inheritance should return the parent model content type.
2222
obj = Model2D()
2323
ctype = get_polymorphic_base_content_type(obj)
24-
self.assertEqual(ctype.name, "model2a")
24+
assert ctype.name == "model2a"
2525

2626
ctype = get_polymorphic_base_content_type(Model2D)
27-
self.assertEqual(ctype.name, "model2a")
27+
assert ctype.name == "model2a"

polymorphic/tests/test_multidb.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ def test_save_to_non_default_database(self):
2626
Model2B.objects.create(field1="B1", field2="B2")
2727
Model2D(field1="D1", field2="D2", field3="D3", field4="D4").save()
2828

29-
self.assertQuerysetEqual(
29+
self.assertQuerySetEqual(
3030
Model2A.objects.order_by("id"),
3131
[Model2B, Model2D],
3232
transform=lambda o: o.__class__,
3333
)
3434

35-
self.assertQuerysetEqual(
35+
self.assertQuerySetEqual(
3636
Model2A.objects.db_manager("secondary").order_by("id"),
3737
[Model2A, Model2C],
3838
transform=lambda o: o.__class__,
@@ -44,26 +44,26 @@ def test_instance_of_filter_on_non_default_database(self):
4444
ModelY.objects.db_manager("secondary").create(field_b="Y", field_y="Y")
4545

4646
objects = Base.objects.db_manager("secondary").filter(instance_of=Base)
47-
self.assertQuerysetEqual(
47+
self.assertQuerySetEqual(
4848
objects,
4949
[Base, ModelX, ModelY],
5050
transform=lambda o: o.__class__,
5151
ordered=False,
5252
)
5353

54-
self.assertQuerysetEqual(
54+
self.assertQuerySetEqual(
5555
Base.objects.db_manager("secondary").filter(instance_of=ModelX),
5656
[ModelX],
5757
transform=lambda o: o.__class__,
5858
)
5959

60-
self.assertQuerysetEqual(
60+
self.assertQuerySetEqual(
6161
Base.objects.db_manager("secondary").filter(instance_of=ModelY),
6262
[ModelY],
6363
transform=lambda o: o.__class__,
6464
)
6565

66-
self.assertQuerysetEqual(
66+
self.assertQuerySetEqual(
6767
Base.objects.db_manager("secondary").filter(
6868
Q(instance_of=ModelX) | Q(instance_of=ModelY)
6969
),
@@ -78,7 +78,7 @@ def func():
7878
entry = BlogEntry.objects.db_manager("secondary").create(blog=blog, text="Text")
7979
ContentType.objects.clear_cache()
8080
entry = BlogEntry.objects.db_manager("secondary").get(pk=entry.id)
81-
self.assertEqual(blog, entry.blog)
81+
assert blog == entry.blog
8282

8383
# Ensure no queries are made using the default database.
8484
self.assertNumQueries(0, func)
@@ -89,7 +89,7 @@ def func():
8989
entry = BlogEntry.objects.db_manager("secondary").create(blog=blog, text="Text")
9090
ContentType.objects.clear_cache()
9191
blog = BlogA.objects.db_manager("secondary").get(pk=blog.id)
92-
self.assertEqual(entry, blog.blogentry_set.using("secondary").get())
92+
assert entry == blog.blogentry_set.using("secondary").get()
9393

9494
# Ensure no queries are made using the default database.
9595
self.assertNumQueries(0, func)
@@ -102,7 +102,7 @@ def func():
102102
)
103103
ContentType.objects.clear_cache()
104104
m2a = Model2A.objects.db_manager("secondary").get(pk=m2a.id)
105-
self.assertEqual(one2one, m2a.one2onerelatingmodel)
105+
assert one2one == m2a.one2onerelatingmodel
106106

107107
# Ensure no queries are made using the default database.
108108
self.assertNumQueries(0, func)
@@ -114,7 +114,7 @@ def func():
114114
rm.many2many.add(m2a)
115115
ContentType.objects.clear_cache()
116116
m2a = Model2A.objects.db_manager("secondary").get(pk=m2a.id)
117-
self.assertEqual(rm, m2a.relatingmodel_set.using("secondary").get())
117+
assert rm == m2a.relatingmodel_set.using("secondary").get()
118118

119119
# Ensure no queries are made using the default database.
120120
self.assertNumQueries(0, func)

0 commit comments

Comments
 (0)