11from __future__ import annotations
22
3- from typing import Any
43from unittest .mock import patch
54
65from django .contrib import messages
76from django .contrib .admin .sites import AdminSite
7+ from django .contrib .auth import get_user_model
88from django .test import TestCase
99from django .test .client import RequestFactory
10+ from django_fsm_log .models import StateLog
1011
1112from django_fsm import ConcurrentTransition
1213from django_fsm import FSMField
1516from tests .testapp .models import AdminBlogPostState
1617
1718
18- class MockRequest :
19- path = "/path"
20- user : Any
21-
22-
23- class MockSuperUser :
24- def has_perm (self , perm , obj = None ):
25- return True
26-
27-
28- request = MockRequest ()
29- request .user = MockSuperUser ()
30-
31-
3219class ModelAdminTest (TestCase ):
3320 @classmethod
3421 def setUpTestData (cls ):
@@ -37,6 +24,9 @@ def setUpTestData(cls):
3724 blog_post .save ()
3825 cls .blog_post = blog_post
3926
27+ cls .request = RequestFactory ().get (path = "/path" )
28+ cls .request .user = get_user_model ().objects .create_user (username = "jacob" , password = "password" , is_staff = True ) # noqa: S106
29+
4030 def setUp (self ):
4131 self .model_admin = AdminBlogPostAdmin (AdminBlogPost , AdminSite ())
4232
@@ -47,13 +37,13 @@ def test_get_fsm_field_instance(self):
4737 assert isinstance (fsm_field , FSMField )
4838
4939 def test_readonly_fields (self ):
50- assert self .model_admin .get_readonly_fields (request = request ) == ("state" ,)
40+ assert self .model_admin .get_readonly_fields (request = self . request ) == ("state" ,)
5141
5242 def test_get_fsm_block_label (self ):
5343 assert self .model_admin .get_fsm_block_label (fsm_field_name = "MyField" ) == "Transition (MyField)"
5444
5545 def test_get_fsm_object_transitions (self ):
56- fsm_object_transitions = self .model_admin .get_fsm_object_transitions (request = request , obj = self .blog_post )
46+ fsm_object_transitions = self .model_admin .get_fsm_object_transitions (request = self . request , obj = self .blog_post )
5747
5848 assert len (fsm_object_transitions ) == 2 # noqa: PLR2004
5949 state_transition , step_transition = fsm_object_transitions
@@ -70,7 +60,7 @@ def test_get_fsm_object_transitions(self):
7060 assert sorted ([t .name for t in step_transition .available_transitions ]) == ["step_two" ]
7161
7262 def test_get_fsm_redirect_url (self ):
73- assert self .model_admin .get_fsm_redirect_url (request = request , obj = None ) == "/path"
63+ assert self .model_admin .get_fsm_redirect_url (request = self . request , obj = None ) == "/path"
7464
7565 @patch ("django.contrib.admin.ModelAdmin.change_view" )
7666 @patch ("django_fsm.admin.FSMAdminMixin.get_fsm_object_transitions" )
@@ -82,7 +72,7 @@ def test_change_view_context(
8272 mock_get_fsm_object_transitions .return_value = "object transitions"
8373
8474 self .model_admin .change_view (
85- request = request ,
75+ request = self . request ,
8676 form_url = "/test" ,
8777 object_id = self .blog_post .pk ,
8878 extra_context = {
@@ -91,12 +81,12 @@ def test_change_view_context(
9181 )
9282
9383 mock_get_fsm_object_transitions .assert_called_once_with (
94- request = request ,
84+ request = self . request ,
9585 obj = self .blog_post ,
9686 )
9787
9888 mock_super_change_view .assert_called_once_with (
99- request = request ,
89+ request = self . request ,
10090 object_id = self .blog_post .pk ,
10191 form_url = "/test" ,
10292 extra_context = {
@@ -111,7 +101,12 @@ class ResponseChangeTest(TestCase):
111101 def setUp (self ):
112102 self .model_admin = AdminBlogPostAdmin (AdminBlogPost , AdminSite ())
113103
104+ @classmethod
105+ def setUpTestData (cls ):
106+ cls .user = get_user_model ().objects .create_user (username = "jacob" , password = "password" , is_staff = True ) # noqa: S106
107+
114108 def test_unknown_transition (self , mock_message_user ):
109+ assert StateLog .objects .count () == 0
115110 request = RequestFactory ().post (
116111 path = "/" ,
117112 data = {"_fsm_transition_to" : "unknown_transition" },
@@ -133,12 +128,15 @@ def test_unknown_transition(self, mock_message_user):
133128
134129 updated_blog_post = AdminBlogPost .objects .get (pk = blog_post .pk )
135130 assert updated_blog_post .state == AdminBlogPostState .CREATED
131+ assert StateLog .objects .count () == 0
136132
137133 def test_transition_applied (self , mock_message_user ):
134+ assert StateLog .objects .count () == 0
138135 request = RequestFactory ().post (
139136 path = "/" ,
140137 data = {"_fsm_transition_to" : "moderate" },
141138 )
139+ request .user = self .user
142140
143141 blog_post = AdminBlogPost .objects .create (title = "Article name" )
144142 assert blog_post .state == AdminBlogPostState .CREATED
@@ -156,12 +154,16 @@ def test_transition_applied(self, mock_message_user):
156154
157155 updated_blog_post = AdminBlogPost .objects .get (pk = blog_post .pk )
158156 assert updated_blog_post .state == AdminBlogPostState .REVIEWED
157+ assert StateLog .objects .count () == 1
158+ assert StateLog .objects .get ().by == self .user
159159
160160 def test_transition_not_allowed_exception (self , mock_message_user ):
161+ assert StateLog .objects .count () == 0
161162 request = RequestFactory ().post (
162163 path = "/" ,
163164 data = {"_fsm_transition_to" : "publish" },
164165 )
166+ request .user = self .user
165167
166168 blog_post = AdminBlogPost .objects .create (title = "Article name" )
167169 assert blog_post .state == AdminBlogPostState .CREATED
@@ -179,12 +181,15 @@ def test_transition_not_allowed_exception(self, mock_message_user):
179181
180182 updated_blog_post = AdminBlogPost .objects .get (pk = blog_post .pk )
181183 assert updated_blog_post .state == AdminBlogPostState .CREATED
184+ assert StateLog .objects .count () == 0
182185
183186 def test_concurrent_transition_exception (self , mock_message_user ):
187+ assert StateLog .objects .count () == 0
184188 request = RequestFactory ().post (
185189 path = "/" ,
186190 data = {"_fsm_transition_to" : "moderate" },
187191 )
192+ request .user = self .user
188193
189194 blog_post = AdminBlogPost .objects .create (title = "Article name" )
190195 assert blog_post .state == AdminBlogPostState .CREATED
@@ -206,3 +211,4 @@ def test_concurrent_transition_exception(self, mock_message_user):
206211
207212 updated_blog_post = AdminBlogPost .objects .get (pk = blog_post .pk )
208213 assert updated_blog_post .state == AdminBlogPostState .CREATED
214+ assert StateLog .objects .count () == 0
0 commit comments