22
33from cms .api import add_plugin
44from cms .test_utils .testcases import CMSTestCase
5+ from django .apps import apps
6+ from django .contrib .auth .models import AnonymousUser
57
68from djangocms_form_builder .actions import get_registered_actions
9+ from djangocms_form_builder .entry_model import FormEntry
710
811from .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" ))
0 commit comments