1
1
from __future__ import annotations
2
2
3
- from typing import Any
4
3
from unittest .mock import patch
5
4
6
5
from django .contrib import messages
7
6
from django .contrib .admin .sites import AdminSite
7
+ from django .contrib .auth import get_user_model
8
8
from django .test import TestCase
9
9
from django .test .client import RequestFactory
10
+ from django_fsm_log .models import StateLog
10
11
11
12
from django_fsm import ConcurrentTransition
12
13
from django_fsm import FSMField
15
16
from tests .testapp .models import AdminBlogPostState
16
17
17
18
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
-
32
19
class ModelAdminTest (TestCase ):
33
20
@classmethod
34
21
def setUpTestData (cls ):
@@ -37,6 +24,9 @@ def setUpTestData(cls):
37
24
blog_post .save ()
38
25
cls .blog_post = blog_post
39
26
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
+
40
30
def setUp (self ):
41
31
self .model_admin = AdminBlogPostAdmin (AdminBlogPost , AdminSite ())
42
32
@@ -47,13 +37,13 @@ def test_get_fsm_field_instance(self):
47
37
assert isinstance (fsm_field , FSMField )
48
38
49
39
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" ,)
51
41
52
42
def test_get_fsm_block_label (self ):
53
43
assert self .model_admin .get_fsm_block_label (fsm_field_name = "MyField" ) == "Transition (MyField)"
54
44
55
45
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 )
57
47
58
48
assert len (fsm_object_transitions ) == 2 # noqa: PLR2004
59
49
state_transition , step_transition = fsm_object_transitions
@@ -70,7 +60,7 @@ def test_get_fsm_object_transitions(self):
70
60
assert sorted ([t .name for t in step_transition .available_transitions ]) == ["step_two" ]
71
61
72
62
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"
74
64
75
65
@patch ("django.contrib.admin.ModelAdmin.change_view" )
76
66
@patch ("django_fsm.admin.FSMAdminMixin.get_fsm_object_transitions" )
@@ -82,7 +72,7 @@ def test_change_view_context(
82
72
mock_get_fsm_object_transitions .return_value = "object transitions"
83
73
84
74
self .model_admin .change_view (
85
- request = request ,
75
+ request = self . request ,
86
76
form_url = "/test" ,
87
77
object_id = self .blog_post .pk ,
88
78
extra_context = {
@@ -91,12 +81,12 @@ def test_change_view_context(
91
81
)
92
82
93
83
mock_get_fsm_object_transitions .assert_called_once_with (
94
- request = request ,
84
+ request = self . request ,
95
85
obj = self .blog_post ,
96
86
)
97
87
98
88
mock_super_change_view .assert_called_once_with (
99
- request = request ,
89
+ request = self . request ,
100
90
object_id = self .blog_post .pk ,
101
91
form_url = "/test" ,
102
92
extra_context = {
@@ -111,7 +101,12 @@ class ResponseChangeTest(TestCase):
111
101
def setUp (self ):
112
102
self .model_admin = AdminBlogPostAdmin (AdminBlogPost , AdminSite ())
113
103
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
+
114
108
def test_unknown_transition (self , mock_message_user ):
109
+ assert StateLog .objects .count () == 0
115
110
request = RequestFactory ().post (
116
111
path = "/" ,
117
112
data = {"_fsm_transition_to" : "unknown_transition" },
@@ -133,12 +128,15 @@ def test_unknown_transition(self, mock_message_user):
133
128
134
129
updated_blog_post = AdminBlogPost .objects .get (pk = blog_post .pk )
135
130
assert updated_blog_post .state == AdminBlogPostState .CREATED
131
+ assert StateLog .objects .count () == 0
136
132
137
133
def test_transition_applied (self , mock_message_user ):
134
+ assert StateLog .objects .count () == 0
138
135
request = RequestFactory ().post (
139
136
path = "/" ,
140
137
data = {"_fsm_transition_to" : "moderate" },
141
138
)
139
+ request .user = self .user
142
140
143
141
blog_post = AdminBlogPost .objects .create (title = "Article name" )
144
142
assert blog_post .state == AdminBlogPostState .CREATED
@@ -156,12 +154,16 @@ def test_transition_applied(self, mock_message_user):
156
154
157
155
updated_blog_post = AdminBlogPost .objects .get (pk = blog_post .pk )
158
156
assert updated_blog_post .state == AdminBlogPostState .REVIEWED
157
+ assert StateLog .objects .count () == 1
158
+ assert StateLog .objects .get ().by == self .user
159
159
160
160
def test_transition_not_allowed_exception (self , mock_message_user ):
161
+ assert StateLog .objects .count () == 0
161
162
request = RequestFactory ().post (
162
163
path = "/" ,
163
164
data = {"_fsm_transition_to" : "publish" },
164
165
)
166
+ request .user = self .user
165
167
166
168
blog_post = AdminBlogPost .objects .create (title = "Article name" )
167
169
assert blog_post .state == AdminBlogPostState .CREATED
@@ -179,12 +181,15 @@ def test_transition_not_allowed_exception(self, mock_message_user):
179
181
180
182
updated_blog_post = AdminBlogPost .objects .get (pk = blog_post .pk )
181
183
assert updated_blog_post .state == AdminBlogPostState .CREATED
184
+ assert StateLog .objects .count () == 0
182
185
183
186
def test_concurrent_transition_exception (self , mock_message_user ):
187
+ assert StateLog .objects .count () == 0
184
188
request = RequestFactory ().post (
185
189
path = "/" ,
186
190
data = {"_fsm_transition_to" : "moderate" },
187
191
)
192
+ request .user = self .user
188
193
189
194
blog_post = AdminBlogPost .objects .create (title = "Article name" )
190
195
assert blog_post .state == AdminBlogPostState .CREATED
@@ -206,3 +211,4 @@ def test_concurrent_transition_exception(self, mock_message_user):
206
211
207
212
updated_blog_post = AdminBlogPost .objects .get (pk = blog_post .pk )
208
213
assert updated_blog_post .state == AdminBlogPostState .CREATED
214
+ assert StateLog .objects .count () == 0
0 commit comments