-
Notifications
You must be signed in to change notification settings - Fork 50
/
Copy pathtest_admin.py
276 lines (239 loc) · 11.6 KB
/
test_admin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
from importlib import reload
from unittest import skipIf
from cms import __version__ as cms_version
from cms.test_utils.testcases import CMSTestCase
from cms.utils import get_current_site
from django.contrib import admin
from django.contrib.sites.models import Site
from django.shortcuts import reverse
from django.test import RequestFactory, override_settings
try:
from djangocms_versioning.models import Version
except ImportError:
from tests.utils.models import Version
from djangocms_snippet import admin as snippet_admin
from djangocms_snippet.forms import SnippetForm
from djangocms_snippet.models import Snippet, SnippetGrouper
class SnippetAdminTestCase(CMSTestCase):
def setUp(self):
self.superuser = self.get_superuser()
self.snippet = Snippet.objects.create(
name="Test Snippet",
slug="test-snippet",
html="<h1>This is a test</h1>",
snippet_grouper=SnippetGrouper.objects.create(),
)
self.snippet_version = Version.objects.create(
content=self.snippet, created_by=self.superuser, state="published"
)
self.snippet_admin = snippet_admin.SnippetAdmin(Snippet, admin)
self.snippet_admin_request = RequestFactory().get("/admin/djangocms_snippet")
self.edit_url = reverse(
"admin:djangocms_snippet_snippet_change",
args=(self.snippet.id,),
)
self.delete_url = reverse(
"admin:djangocms_snippet_snippet_delete",
args=(self.snippet.id,),
)
def test_get_queryset(self):
current_site = get_current_site()
another_site = Site.objects.create(domain="http://www.django-cms.org", name="Django CMS", pk=3)
current_site_snippet = Snippet.objects.create(
name="Test Snippet 1",
slug="test-snippet-one",
html="<h1>This is a test snippet one</h1>",
snippet_grouper=SnippetGrouper.objects.create(),
site=current_site,
)
another_site_snippet = Snippet.objects.create(
name="Test Snippet 2",
slug="test-snippet-two",
html="<h1>This is a test snippet two</h1>",
snippet_grouper=SnippetGrouper.objects.create(),
site=another_site,
)
# Create versions of snippets
Version.objects.create(content=current_site_snippet, created_by=self.superuser, state="published")
Version.objects.create(content=another_site_snippet, created_by=self.superuser, state="published")
queryset = self.snippet_admin.get_queryset(self.snippet_admin_request)
# Test for snippet of current site
self.assertIn(current_site_snippet, queryset)
# Test for snippet with no site
self.assertIn(self.snippet, queryset)
# Test for snippet with another site
self.assertNotIn(another_site_snippet, queryset)
@override_settings(DJANGOCMS_SNIPPET_VERSIONING_ENABLED=False)
def test_admin_list_display_without_versioning(self):
"""
Without versioning enabled, list_display should not be extended with version related items
"""
admin.site.unregister(Snippet)
reload(snippet_admin)
# This has to be declared again, since it will now be constructed without the versioning extension
self.snippet_admin = snippet_admin.SnippetAdmin(Snippet, admin)
list_display = self.snippet_admin.get_list_display(self.snippet_admin_request)
self.assertEqual(self.snippet_admin.__class__.__bases__, (admin.ModelAdmin,))
self.assertEqual(list_display, ("slug", "name"))
@skipIf(not cms_version.startswith("4.0."), "Django CMS 4 required")
@override_settings(DJANGOCMS_SNIPPET_VERSIONING_ENABLED=True)
def test_admin_list_display_with_versioning(self):
"""
With versioning enabled, list_display should be populated with both versioning related items, and the
list actions items
"""
from djangocms_versioning.admin import ExtendedVersionAdminMixin
list_display = self.snippet_admin.get_list_display(self.snippet_admin_request)
# Mixins should always come first in the class bases
self.assertEqual(self.snippet_admin.__class__.__bases__, (ExtendedVersionAdminMixin, admin.ModelAdmin))
self.assertEqual(list_display[:-1], ("name", "get_author", "get_modified_date", "get_versioning_state"))
self.assertEqual(list_display[-1].short_description.lower(), "actions")
def test_admin_uses_form(self):
"""
The SnippetForm provides functionality to make SnippetGroupers irrelevant to the user,
ensure the admin uses this.
"""
self.assertEqual(self.snippet_admin.form, SnippetForm)
@skipIf(cms_version < "4", "Django CMS 4 required")
@override_settings(DJANGOCMS_SNIPPET_VERSIONING_ENABLED=True)
def test_admin_delete_button_disabled_versioning_enabled(self):
"""
If versioning is enabled, the delete button should not be rendered on the change form
"""
admin.site.unregister(Snippet)
reload(snippet_admin)
with self.login_user_context(self.superuser):
response = self.client.get(self.edit_url)
self.assertNotContains(
response, '<a href="/en/admin/djangocms_snippet/snippet/1/delete/" class="deletelink">Delete</a>'
)
@override_settings(DJANGOCMS_SNIPPET_VERSIONING_ENABLED=False)
def test_admin_delete_button_available_versioning_disabled(self):
"""
If versioning is disabled, the delete button should be rendered on the change form
"""
admin.site.unregister(Snippet)
reload(snippet_admin)
with self.login_user_context(self.superuser):
response = self.client.get(self.edit_url)
self.assertContains(
response, '<a href="/en/admin/djangocms_snippet/snippet/1/delete/" class="deletelink">Delete</a>'
)
@skipIf(cms_version < "4", "Django CMS 4 required")
@override_settings(DJANGOCMS_SNIPPET_VERSIONING_ENABLED=True)
def test_admin_delete_endpoint_inaccessible_versioning_enabled(self):
"""
If versioning is enabled, the delete endpoint should not be accessible.
"""
admin.site.unregister(Snippet)
reload(snippet_admin)
with self.login_user_context(self.superuser):
response = self.client.post(self.delete_url)
# The delete endpoint should return a 403 forbidden if we try to access it with versioning enabled
self.assertEqual(response.status_code, 403)
@override_settings(DJANGOCMS_SNIPPET_VERSIONING_ENABLED=False)
def test_admin_delete_endpoint_accessible_versioning_disabled(self):
"""
If versioning is disabled, the delete endpoint should be accessible.
"""
admin.site.unregister(Snippet)
reload(snippet_admin)
with self.login_user_context(self.superuser):
response = self.client.post(self.delete_url)
# The delete endpoint should return a 200 success if we try to access it with versioning disabled
self.assertEqual(response.status_code, 200)
class SnippetAdminFormTestCase(CMSTestCase):
def setUp(self):
self.add_url = reverse("admin:djangocms_snippet_snippet_add")
self.changelist_url = reverse("admin:djangocms_snippet_snippet_changelist")
self.superuser = self.get_superuser()
self.snippet_grouper = SnippetGrouper.objects.create()
self.snippet = Snippet.objects.create(
name="Test Snippet",
slug="test-snippet",
html="<h1>This is a test</h1>",
snippet_grouper=self.snippet_grouper,
)
self.snippet_version = Version.objects.create(content=self.snippet, created_by=self.superuser)
@skipIf(cms_version < "4", "Django CMS 4 required")
@override_settings(DJANGOCMS_SNIPPET_VERSIONING_ENABLED=True)
def test_admin_form_save_method(self):
with self.login_user_context(self.superuser):
response = self.client.post(
self.add_url,
{
"name": "Test Snippet 2",
"html": "<p>Test Save Snippet</p>",
"slug": "test-snippet-2",
},
)
self.assertRedirects(response, self.changelist_url)
# We should have 2 groupers and snippets, due to the creation of the others in setUp
self.assertEqual(Snippet._base_manager.count(), 2)
self.assertEqual(SnippetGrouper._base_manager.count(), 2)
@skipIf(cms_version < "4", "Django CMS 4 required")
@override_settings(DJANGOCMS_SNIPPET_VERSIONING_ENABLED=True)
def test_admin_form_edit_when_locked(self):
"""
When a form is initialised in read-only mode, it should not require self.fields to be populated, and
should return a read-only form.
"""
self.snippet_version.publish(user=self.superuser)
with self.login_user_context(self.superuser):
edit_url = reverse(
"admin:djangocms_snippet_snippet_change",
args=(self.snippet.id,),
)
response = self.client.get(edit_url)
# Check that we are loading in readonly mode
self.assertContains(response, '<div class="readonly">Test Snippet</div>')
# We should have the same number of snippets as before
self.assertEqual(Snippet.objects.count(), 1)
@override_settings(DJANGOCMS_SNIPPET_VERSIONING_ENABLED=False)
def test_slug_colomn_should_hyperlinked_with_versioning_disabled(self):
"""
Slug column should be visible and hyperlinked when versioning is disabled
"""
admin.site.unregister(Snippet)
reload(snippet_admin)
with self.login_user_context(self.get_superuser()):
response = self.client.get(self.changelist_url)
self.assertContains(
response,
'<th class="field-slug"><a href="/en/admin/djangocms_snippet/snippet/1/change/">test-snippet</a></th>',
)
@skipIf(cms_version < "4", "Django CMS 4 required")
@override_settings(DJANGOCMS_SNIPPET_VERSIONING_ENABLED=True)
def test_name_colomn_should_not_be_hyperlinked_with_versioning_enabled(self):
"""
Name column should be visible and not hyperlinked when versioning is enabled.
Slug column should not be visible when versioning is enabled.
"""
admin.site.unregister(Snippet)
reload(snippet_admin)
with self.login_user_context(self.get_superuser()):
response = self.client.get(self.changelist_url)
self.assertContains(response, '<td class="field-name">Test Snippet</td>')
self.assertNotContains(
response,
'<th class="field-slug"><a href="/en/admin/djangocms_snippet/snippet/1/change/">test-snippet</a></th>',
)
def test_preview_renders_read_only_fields(self):
"""
Check that the preview endpoint is rendered in read only mode
"""
self.snippet_version.publish(user=self.superuser)
with self.login_user_context(self.superuser):
edit_url = reverse(
"admin:djangocms_snippet_snippet_preview",
args=(self.snippet.id,),
)
response = self.client.get(edit_url)
# Snippet name
self.assertContains(response, '<div class="readonly">Test Snippet</div>')
# Snippet slug
self.assertContains(response, '<div class="readonly">test-snippet</div>')
# Snippet HTML
self.assertContains(response, '<div class="readonly"><h1>This is a test</h1></div>')
# Snippet template
self.assertContains(response, '<div class="readonly"></div>')