Skip to content

Commit 134afe9

Browse files
committed
Refactored+reformatted some tests in test_admin.py
It should now be easier to see the differences between the assertions the tests make, and less code is now duplicated. Diff notes: * Merged `test_history_view___view_only_permissions_and_revert_enabled()` and `test_history_view__view_change_permissions_and_revert_enabled()` and renamed the resulting method to `test_history_view_response_text__revert_enabled()` * Renamed `test_history_view_with_view_only_permissions_and_norevert()` to `test_history_view_response_text__revert_disabled()` and added the same logic as in the previous `test_history_view__view_change_permissions_and_revert_enabled()` by calling the new `_test_history_view_response_text_with_revert_disabled()`
1 parent 4682679 commit 134afe9

File tree

2 files changed

+86
-138
lines changed

2 files changed

+86
-138
lines changed

simple_history/tests/tests/test_admin.py

Lines changed: 77 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from django.contrib.auth import get_user_model
77
from django.contrib.auth.models import Permission
88
from django.contrib.messages.storage.fallback import FallbackStorage
9-
from django.shortcuts import get_object_or_404
109
from django.test import TestCase
1110
from django.test.client import RequestFactory
1211
from django.test.utils import override_settings
@@ -16,7 +15,10 @@
1615
from simple_history.admin import SimpleHistoryAdmin
1716
from simple_history.models import HistoricalRecords
1817
from simple_history.tests.external.models import ExternalModelWithCustomUserIdField
19-
from simple_history.tests.tests.utils import middleware_override_settings
18+
from simple_history.tests.tests.utils import (
19+
PermissionAction,
20+
middleware_override_settings,
21+
)
2022

2123
from ..models import (
2224
Book,
@@ -737,28 +739,44 @@ def test_history_form_view_accepts_additional_context(self):
737739
request, admin.object_history_form_template, context
738740
)
739741

740-
def test_history_view__title_suggests_revert_by_default(self):
741-
self.login()
742+
def assert_history_view_response_contains(
743+
self, user=None, *, title_prefix: PermissionAction, choose_date: bool
744+
):
745+
user = user or self.user
746+
user = User.objects.get(pk=user.pk) # refresh perms cache
747+
self.login(user)
742748
planet = Planet.objects.create(star="Sun")
743749
response = self.client.get(get_history_url(planet))
744-
self.assertContains(response, "Change history: Sun")
750+
self.assertEqual(response.status_code, 200)
751+
# `count=None` means at least once
752+
self.assertContains(
753+
response,
754+
"Change history: Sun",
755+
count=None if title_prefix == PermissionAction.CHANGE else 0,
756+
)
757+
self.assertContains(
758+
response,
759+
"View history: Sun",
760+
count=None if title_prefix == PermissionAction.VIEW else 0,
761+
)
762+
self.assertContains(response, "Choose a date", count=None if choose_date else 0)
763+
764+
def test_history_view__title_suggests_revert_by_default(self):
765+
self.assert_history_view_response_contains(
766+
title_prefix=PermissionAction.CHANGE, choose_date=True
767+
)
745768

746769
@override_settings(SIMPLE_HISTORY_REVERT_DISABLED=False)
747770
def test_history_view__title_suggests_revert(self):
748-
self.login()
749-
planet = Planet.objects.create(star="Sun")
750-
response = self.client.get(get_history_url(planet))
751-
self.assertContains(response, "Change history: Sun")
752-
self.assertContains(response, "Choose a date")
771+
self.assert_history_view_response_contains(
772+
title_prefix=PermissionAction.CHANGE, choose_date=True
773+
)
753774

754775
@override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True)
755776
def test_history_view__title_suggests_view_only(self):
756-
self.login()
757-
planet = Planet.objects.create(star="Sun")
758-
response = self.client.get(get_history_url(planet))
759-
self.assertNotContains(response, "Change history: Sun")
760-
self.assertNotContains(response, "Choose a date")
761-
self.assertContains(response, "View history: Sun")
777+
self.assert_history_view_response_contains(
778+
title_prefix=PermissionAction.VIEW, choose_date=False
779+
)
762780

763781
def test_history_form_view__shows_revert_button_by_default(self):
764782
self.login()
@@ -786,71 +804,51 @@ def test_history_form_view__does_not_show_revert_button(self):
786804
self.assertContains(response, "View Planet")
787805
self.assertContains(response, "View Sun")
788806

789-
@override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True)
790-
def test_history_view_with_view_only_permissions_and_norevert(self):
791-
user = User.objects.create(username="astronomer", is_staff=True, is_active=True)
792-
user.user_permissions.add(Permission.objects.get(codename="view_planet"))
793-
user.user_permissions.add(
794-
Permission.objects.get(codename="view_historicalplanet")
795-
)
796-
user = get_object_or_404(User, pk=user.id)
797-
self.client.force_login(user)
798-
planet = Planet.objects.create(star="Sun")
799-
response = self.client.get(get_history_url(planet))
800-
self.assertEqual(200, response.status_code)
801-
self.assertNotContains(response, "Change history: Sun")
802-
self.assertNotContains(response, "Choose a date")
803-
self.assertContains(response, "View history: Sun")
804-
805-
def test_history_view___view_only_permissions_and_revert_enabled(self):
807+
def _test_history_view_response_text_with_revert_disabled(self, *, disabled):
806808
user = User.objects.create(username="astronomer", is_staff=True, is_active=True)
807809
user.user_permissions.add(
808810
Permission.objects.get(codename="view_planet"),
809811
Permission.objects.get(codename="view_historicalplanet"),
810812
)
811-
user = get_object_or_404(User, pk=user.id)
812-
self.client.force_login(user)
813-
planet = Planet.objects.create(star="Sun")
814-
response = self.client.get(get_history_url(planet))
815-
self.assertEqual(200, response.status_code)
816-
self.assertNotContains(response, "Change history: Sun")
817-
self.assertNotContains(response, "Choose a date")
818-
self.assertContains(response, "View history: Sun")
813+
self.assert_history_view_response_contains(
814+
user, title_prefix=PermissionAction.VIEW, choose_date=False
815+
)
819816

820-
def test_history_view__view_change_permissions_and_revert_enabled(self):
821-
user = User.objects.create(username="astronomer", is_staff=True, is_active=True)
817+
user.user_permissions.clear()
822818
user.user_permissions.add(
823819
Permission.objects.get(codename="view_planet"),
824820
Permission.objects.get(codename="change_planet"),
825821
)
826-
user = get_object_or_404(User, pk=user.id)
827-
self.client.force_login(user)
828-
planet = Planet.objects.create(star="Sun")
829-
response = self.client.get(get_history_url(planet))
830-
self.assertEqual(200, response.status_code)
831-
self.assertContains(response, "Change history: Sun")
832-
self.assertContains(response, "Choose a date")
833-
self.assertNotContains(response, "View history: Sun")
822+
self.assert_history_view_response_contains(
823+
user,
824+
title_prefix=PermissionAction.VIEW if disabled else PermissionAction.CHANGE,
825+
choose_date=not disabled,
826+
)
827+
828+
@override_settings(SIMPLE_HISTORY_REVERT_DISABLED=True)
829+
def test_history_view_response_text__revert_disabled(self):
830+
self._test_history_view_response_text_with_revert_disabled(disabled=True)
831+
832+
def test_history_view_response_text__revert_enabled(self):
833+
self._test_history_view_response_text_with_revert_disabled(disabled=False)
834834

835835
@override_settings(SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS=True)
836836
def test_history_form_view__no_perms_enforce_history_permissions(self):
837837
user = User.objects.create(username="astronomer", is_staff=True, is_active=True)
838-
user = get_object_or_404(User, pk=user.id)
838+
user = User.objects.get(pk=user.pk) # refresh perms cache
839839
self.client.force_login(user)
840840
planet = Planet.objects.create(star="Sun")
841841
response = self.client.get(get_history_url(planet, 0))
842-
self.assertEqual(403, response.status_code)
842+
self.assertEqual(response.status_code, 403)
843843

844-
@override_settings(
845-
SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS=True,
846-
)
844+
@override_settings(SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS=True)
847845
def test_history_view__no_perms_enforce_history_permissions(self):
848846
user = User.objects.create(username="astronomer", is_staff=True, is_active=True)
849-
user = get_object_or_404(User, pk=user.id)
847+
user = User.objects.get(pk=user.pk) # refresh perms cache
850848
self.client.force_login(user)
851849
planet = Planet.objects.create(star="Sun")
852850
resp = self.client.get(get_history_url(planet))
853-
self.assertEqual(403, resp.status_code)
851+
self.assertEqual(resp.status_code, 403)
854852

855853
@override_settings(
856854
SIMPLE_HISTORY_REVERT_DISABLED=False,
@@ -861,21 +859,15 @@ def test_history_view__enforce_history_permissions_and_revert_enabled(self):
861859
user.user_permissions.add(
862860
Permission.objects.get(codename="view_historicalplanet"),
863861
)
864-
user = get_object_or_404(User, pk=user.id)
865-
self.client.force_login(user)
866-
planet = Planet.objects.create(star="Sun")
867-
resp = self.client.get(get_history_url(planet))
868-
self.assertEqual(200, resp.status_code)
869-
self.assertNotContains(resp, "Change history: Sun")
870-
self.assertNotContains(resp, "Choose a date")
871-
self.assertContains(resp, "View history: Sun")
862+
self.assert_history_view_response_contains(
863+
user, title_prefix=PermissionAction.VIEW, choose_date=False
864+
)
872865

873-
@override_settings(SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS=True)
874-
def test_permission_combos__enforce_history_permissions(self):
866+
def _test_permission_combos_with_enforce_history_permissions(self, *, enforced):
875867
user = User.objects.create(username="astronomer", is_staff=True, is_active=True)
876868

877869
def get_request(usr):
878-
usr = get_object_or_404(User, pk=usr.id) # refresh perms cache
870+
usr = User.objects.get(pk=usr.pk) # refresh perms cache
879871
req = RequestFactory().post("/")
880872
req.session = "session"
881873
req._messages = FallbackStorage(req)
@@ -884,18 +876,19 @@ def get_request(usr):
884876

885877
admin_site = AdminSite()
886878
admin = SimpleHistoryAdmin(Planet, admin_site)
879+
887880
# no perms
888-
self.assertFalse(admin.has_view_history_permission(get_request(user)))
881+
request = get_request(user)
882+
self.assertFalse(admin.has_view_history_permission(request))
889883

890884
# has concrete view/change only -> view_historical is false
891885
user.user_permissions.clear()
892886
user.user_permissions.add(
893887
Permission.objects.get(codename="view_planet"),
894888
Permission.objects.get(codename="change_planet"),
895889
)
896-
admin_site = AdminSite()
897-
admin = SimpleHistoryAdmin(Planet, admin_site)
898-
self.assertFalse(admin.has_view_history_permission(get_request(user)))
890+
request = get_request(user)
891+
self.assertEqual(admin.has_view_history_permission(request), not enforced)
899892

900893
# has concrete view/change and historical change -> view_history is false
901894
user.user_permissions.clear()
@@ -904,9 +897,8 @@ def get_request(usr):
904897
Permission.objects.get(codename="change_planet"),
905898
Permission.objects.get(codename="change_historicalplanet"),
906899
)
907-
admin_site = AdminSite()
908-
admin = SimpleHistoryAdmin(Planet, admin_site)
909-
self.assertFalse(admin.has_view_history_permission(get_request(user)))
900+
request = get_request(user)
901+
self.assertEqual(admin.has_view_history_permission(request), not enforced)
910902

911903
# has concrete view/change and historical view/change -> view_history is true
912904
user.user_permissions.clear()
@@ -916,73 +908,20 @@ def get_request(usr):
916908
Permission.objects.get(codename="view_historicalplanet"),
917909
Permission.objects.get(codename="change_historicalplanet"),
918910
)
919-
admin_site = AdminSite()
920-
admin = SimpleHistoryAdmin(Planet, admin_site)
921-
self.assertTrue(admin.has_view_history_permission(get_request(user)))
911+
request = get_request(user)
912+
self.assertTrue(admin.has_view_history_permission(request))
922913

923914
# has historical view only -> view_history is true
924915
user.user_permissions.clear()
925916
user.user_permissions.add(
926917
Permission.objects.get(codename="view_historicalplanet"),
927918
)
928-
admin_site = AdminSite()
929-
admin = SimpleHistoryAdmin(Planet, admin_site)
930-
self.assertTrue(admin.has_view_history_permission(get_request(user)))
931-
932-
def test_permission_combos__default(self):
933-
user = User.objects.create(username="astronomer", is_staff=True, is_active=True)
934-
935-
def get_request(usr):
936-
usr = get_object_or_404(User, pk=usr.id) # refresh perms cache
937-
req = RequestFactory().post("/")
938-
req.session = "session"
939-
req._messages = FallbackStorage(req)
940-
req.user = usr
941-
return req
942-
943-
admin_site = AdminSite()
944-
admin = SimpleHistoryAdmin(Planet, admin_site)
945-
# no perms
946-
self.assertFalse(admin.has_view_history_permission(get_request(user)))
947-
948-
# has concrete view/change only -> view_historical is false
949-
user.user_permissions.clear()
950-
user.user_permissions.add(
951-
Permission.objects.get(codename="view_planet"),
952-
Permission.objects.get(codename="change_planet"),
953-
)
954-
admin_site = AdminSite()
955-
admin = SimpleHistoryAdmin(Planet, admin_site)
956-
self.assertTrue(admin.has_view_history_permission(get_request(user)))
957-
958-
# has concrete view/change and historical change -> view_history is false
959-
user.user_permissions.clear()
960-
user.user_permissions.add(
961-
Permission.objects.get(codename="view_planet"),
962-
Permission.objects.get(codename="change_planet"),
963-
Permission.objects.get(codename="change_historicalplanet"),
964-
)
965-
admin_site = AdminSite()
966-
admin = SimpleHistoryAdmin(Planet, admin_site)
967-
self.assertTrue(admin.has_view_history_permission(get_request(user)))
919+
request = get_request(user)
920+
self.assertEqual(admin.has_view_history_permission(request), enforced)
968921

969-
# has concrete view/change and historical view/change -> view_history is true
970-
user.user_permissions.clear()
971-
user.user_permissions.add(
972-
Permission.objects.get(codename="view_planet"),
973-
Permission.objects.get(codename="change_planet"),
974-
Permission.objects.get(codename="view_historicalplanet"),
975-
Permission.objects.get(codename="change_historicalplanet"),
976-
)
977-
admin_site = AdminSite()
978-
admin = SimpleHistoryAdmin(Planet, admin_site)
979-
self.assertTrue(admin.has_view_history_permission(get_request(user)))
922+
@override_settings(SIMPLE_HISTORY_ENFORCE_HISTORY_MODEL_PERMISSIONS=True)
923+
def test_permission_combos__enforce_history_permissions(self):
924+
self._test_permission_combos_with_enforce_history_permissions(enforced=True)
980925

981-
# has historical view only -> view_history is true
982-
user.user_permissions.clear()
983-
user.user_permissions.add(
984-
Permission.objects.get(codename="view_historicalplanet"),
985-
)
986-
admin_site = AdminSite()
987-
admin = SimpleHistoryAdmin(Planet, admin_site)
988-
self.assertFalse(admin.has_view_history_permission(get_request(user)))
926+
def test_permission_combos__default(self):
927+
self._test_permission_combos_with_enforce_history_permissions(enforced=False)

simple_history/tests/tests/utils.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from enum import Enum
2+
13
import django
24
from django.conf import settings
35

@@ -71,3 +73,10 @@ def allow_migrate(self, db, app_label, model_name=None, **hints):
7173
"simple_history.tests.tests.utils.TestModelWithHistoryInDifferentDbRouter"
7274
]
7375
}
76+
77+
78+
class PermissionAction(Enum):
79+
ADD = 'add'
80+
CHANGE = 'change'
81+
DELETE = 'delete'
82+
VIEW = 'view'

0 commit comments

Comments
 (0)