Skip to content

Commit a2b6771

Browse files
committed
chore: add action tests
1 parent 70d77dc commit a2b6771

File tree

4 files changed

+186
-1
lines changed

4 files changed

+186
-1
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ repos:
1616
rev: aad66557af3b56ba6d4d69cd1b6cba87cef50cbb # frozen: v0.14.3
1717
hooks:
1818
- id: ruff
19+
args: [ --fix ]
1920
- id: ruff-format

tests/requirements/base.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
django-filer
22
easy-thumbnails
33
djangocms-text
4+
djangocms-link
45
coverage
56
django-app-helper
67
django-treebeard<4.5

tests/test_actions.py

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
from cms.api import add_plugin
44
from cms.test_utils.testcases import CMSTestCase
5+
from django.apps import apps
6+
from django.contrib.auth.models import AnonymousUser
57

68
from djangocms_form_builder.actions import get_registered_actions
9+
from djangocms_form_builder.entry_model import FormEntry
710

811
from .fixtures import TestFixture
912

@@ -18,6 +21,17 @@ def setUp(self):
1821
self.send_mail_action = [
1922
key for key, value in self.actions if value == "Send email"
2023
][0]
24+
self.success_action = [
25+
key for key, value in self.actions if value == "Success message"
26+
][0]
27+
self.redirect_action = next(
28+
(
29+
key
30+
for key, value in self.actions
31+
if value == "Redirect after submission"
32+
),
33+
None,
34+
)
2135

2236
def test_send_mail_action(self):
2337
plugin_instance = add_plugin(
@@ -77,3 +91,171 @@ def test_send_mail_action(self):
7791
args, kwargs = mock_mail_admins.call_args
7892
self.assertEqual(args[0], "Test form form submission")
7993
self.assertIn("Form submission", args[1])
94+
95+
def test_save_to_db_action_creates_entry_with_headers(self):
96+
plugin_instance = add_plugin(
97+
placeholder=self.placeholder,
98+
plugin_type="FormPlugin",
99+
language=self.language,
100+
form_name="save_form",
101+
)
102+
plugin_instance.form_actions = f'["{self.save_action}"]'
103+
plugin_instance.save()
104+
105+
plugin = plugin_instance.get_plugin_class_instance()
106+
plugin.instance = plugin_instance
107+
108+
# Prepare request with headers and anonymous user
109+
request = self.get_request("/")
110+
request.META["HTTP_USER_AGENT"] = "pytest-agent"
111+
request.META["HTTP_REFERER"] = "/from"
112+
request.user = AnonymousUser()
113+
114+
# ensure at least one field exists to build the form
115+
child_plugin = add_plugin(
116+
placeholder=self.placeholder,
117+
plugin_type="CharFieldPlugin",
118+
language=self.language,
119+
target=plugin_instance,
120+
config={"field_name": "field1"},
121+
)
122+
child_plugin.save()
123+
124+
initial = FormEntry.objects.count()
125+
form = plugin.get_form_class()({}, request=request)
126+
form.cleaned_data = {"field1": "value1"}
127+
form.save()
128+
129+
self.assertEqual(FormEntry.objects.count(), initial + 1)
130+
entry = FormEntry.objects.latest("entry_created_at")
131+
self.assertEqual(entry.form_name, "save_form")
132+
self.assertEqual(entry.form_user, None)
133+
self.assertEqual(entry.entry_data.get("field1"), "value1")
134+
self.assertEqual(entry.html_headers.get("user_agent"), "pytest-agent")
135+
self.assertEqual(entry.html_headers.get("referer"), "/from")
136+
137+
def test_save_to_db_action_unique_updates_single_entry(self):
138+
plugin_instance = add_plugin(
139+
placeholder=self.placeholder,
140+
plugin_type="FormPlugin",
141+
language=self.language,
142+
form_name="unique_form",
143+
form_login_required=True,
144+
form_unique=True,
145+
)
146+
plugin_instance.form_actions = f'["{self.save_action}"]'
147+
plugin_instance.save()
148+
149+
plugin = plugin_instance.get_plugin_class_instance()
150+
plugin.instance = plugin_instance
151+
152+
request = self.get_request("/")
153+
request.META["HTTP_USER_AGENT"] = "pytest-agent"
154+
request.META["HTTP_REFERER"] = "/from"
155+
request.user = self.superuser
156+
# provide a simple field
157+
child_plugin = add_plugin(
158+
placeholder=self.placeholder,
159+
plugin_type="CharFieldPlugin",
160+
language=self.language,
161+
target=plugin_instance,
162+
config={"field_name": "x"},
163+
)
164+
child_plugin.save()
165+
166+
form = plugin.get_form_class()({}, request=request)
167+
form.cleaned_data = {"x": 1}
168+
form.save()
169+
170+
# Second save should update, not create new
171+
form = plugin.get_form_class()({}, request=request)
172+
form.cleaned_data = {"x": 2}
173+
form.save()
174+
175+
entries = FormEntry.objects.filter(
176+
form_name="unique_form", form_user=self.superuser
177+
)
178+
self.assertEqual(entries.count(), 1)
179+
self.assertEqual(entries.first().entry_data.get("x"), 2)
180+
181+
def test_success_message_action_sets_render_success_and_redirect(self):
182+
plugin_instance = add_plugin(
183+
placeholder=self.placeholder,
184+
plugin_type="FormPlugin",
185+
language=self.language,
186+
form_name="success_form",
187+
)
188+
plugin_instance.form_actions = f'["{self.success_action}"]'
189+
plugin_instance.action_parameters = {
190+
"submitmessage_message": "<p>Thanks!</p>",
191+
}
192+
plugin_instance.save()
193+
194+
plugin = plugin_instance.get_plugin_class_instance()
195+
plugin.instance = plugin_instance
196+
197+
request = self.get_request("/")
198+
# ensure headers exist though not required here
199+
request.META["HTTP_USER_AGENT"] = "pytest-agent"
200+
request.META["HTTP_REFERER"] = "/from"
201+
202+
# add a trivial field
203+
child_plugin = add_plugin(
204+
placeholder=self.placeholder,
205+
plugin_type="CharFieldPlugin",
206+
language=self.language,
207+
target=plugin_instance,
208+
config={"field_name": "unused"},
209+
)
210+
child_plugin.save()
211+
212+
form = plugin.get_form_class()({}, request=request)
213+
form.cleaned_data = {}
214+
# Before action, default redirect is SAME_PAGE_REDIRECT and no render_success
215+
self.assertIsNone(form.Meta.options.get("render_success"))
216+
self.assertEqual(form.Meta.options.get("redirect"), "result")
217+
218+
form.save()
219+
220+
# After SuccessMessageAction, render_success should be set and redirect cleared
221+
self.assertEqual(
222+
form.Meta.options.get("render_success"),
223+
"djangocms_form_builder/actions/submit_message.html",
224+
)
225+
self.assertIsNone(form.Meta.options.get("redirect"))
226+
227+
def test_redirect_action_sets_redirect_url(self):
228+
if not apps.is_installed("djangocms_link") or self.redirect_action is None:
229+
self.skipTest("djangocms_link not installed; redirect action not available")
230+
231+
from djangocms_link.helpers import LinkDict
232+
233+
plugin_instance = add_plugin(
234+
placeholder=self.placeholder,
235+
plugin_type="FormPlugin",
236+
language=self.language,
237+
form_name="redirect_form",
238+
)
239+
plugin_instance.form_actions = f'["{self.redirect_action}"]'
240+
plugin_instance.action_parameters = {"redirect_link": LinkDict(self.home)}
241+
plugin_instance.save()
242+
243+
plugin = plugin_instance.get_plugin_class_instance()
244+
plugin.instance = plugin_instance
245+
246+
request = self.get_request("/")
247+
# add a trivial field
248+
child_plugin = add_plugin(
249+
placeholder=self.placeholder,
250+
plugin_type="CharFieldPlugin",
251+
language=self.language,
252+
target=plugin_instance,
253+
config={"field_name": "unused"},
254+
)
255+
child_plugin.save()
256+
257+
form = plugin.get_form_class()({}, request=request)
258+
form.cleaned_data = {}
259+
form.save()
260+
261+
self.assertTrue(form.Meta.options.get("redirect"))

tests/test_settings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ def __getitem__(self, item):
2323
"cms",
2424
"menus",
2525
"treebeard",
26-
"djangocms_text_ckeditor",
26+
"djangocms_text",
27+
"djangocms_link",
2728
"djangocms_form_builder",
2829
"sekizai",
2930
"tests.test_app",

0 commit comments

Comments
 (0)