| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | # -*- coding: utf-8; -*- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from unittest.mock import patch | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from wuttjamaican.email import EmailSetting | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import colander | 
					
						
							|  |  |  | from pyramid.httpexceptions import HTTPNotFound | 
					
						
							|  |  |  | from pyramid.response import Response | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from wuttaweb.views import email as mod | 
					
						
							| 
									
										
										
										
											2025-01-06 16:47:48 -06:00
										 |  |  | from wuttaweb.testing import WebTestCase | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestEmailSettingViews(WebTestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def make_view(self): | 
					
						
							|  |  |  |         return mod.EmailSettingView(self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_includeme(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.pyramid_config.include("wuttaweb.views.email") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_get_grid_data(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config.setdefault("wutta.email.default.sender", "test@example.com") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |         view = self.make_view() | 
					
						
							|  |  |  |         data = view.get_grid_data() | 
					
						
							|  |  |  |         self.assertIsInstance(data, list) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertTrue(data)  # 1+ items | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |         setting = data[0] | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertIn("key", setting) | 
					
						
							|  |  |  |         self.assertIn("subject", setting) | 
					
						
							|  |  |  |         self.assertIn("sender", setting) | 
					
						
							|  |  |  |         self.assertIn("to", setting) | 
					
						
							|  |  |  |         self.assertIn("cc", setting) | 
					
						
							|  |  |  |         self.assertIn("notes", setting) | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_configure_grid(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config.setdefault("wutta.email.default.sender", "test@example.com") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |         view = self.make_view() | 
					
						
							|  |  |  |         grid = view.make_model_grid() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertIn("key", grid.searchable_columns) | 
					
						
							|  |  |  |         self.assertIn("subject", grid.searchable_columns) | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_render_to_short(self): | 
					
						
							|  |  |  |         view = self.make_view() | 
					
						
							|  |  |  |         setting = EmailSetting(self.config) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # more than 2 recips | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         result = view.render_to_short( | 
					
						
							|  |  |  |             setting, | 
					
						
							|  |  |  |             "to", | 
					
						
							|  |  |  |             [ | 
					
						
							|  |  |  |                 "alice@example.com", | 
					
						
							|  |  |  |                 "bob@example.com", | 
					
						
							|  |  |  |                 "charlie@example.com", | 
					
						
							|  |  |  |                 "diana@example.com", | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual(result, "alice@example.com, bob@example.com, ...") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # just 2 recips | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         result = view.render_to_short( | 
					
						
							|  |  |  |             setting, | 
					
						
							|  |  |  |             "to", | 
					
						
							|  |  |  |             [ | 
					
						
							|  |  |  |                 "alice@example.com", | 
					
						
							|  |  |  |                 "bob@example.com", | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual(result, "alice@example.com, bob@example.com") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # just 1 recip | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         result = view.render_to_short(setting, "to", ["alice@example.com"]) | 
					
						
							|  |  |  |         self.assertEqual(result, "alice@example.com") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # no recips | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         result = view.render_to_short(setting, "to", []) | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |         self.assertIsNone(result) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_get_instance(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config.setdefault("wutta.email.default.sender", "test@example.com") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |         view = self.make_view() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # normal | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object(self.request, "matchdict", new={"key": "feedback"}): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |             setting = view.get_instance() | 
					
						
							|  |  |  |             self.assertIsInstance(setting, dict) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             self.assertIn("key", setting) | 
					
						
							|  |  |  |             self.assertIn("sender", setting) | 
					
						
							|  |  |  |             self.assertIn("subject", setting) | 
					
						
							|  |  |  |             self.assertIn("to", setting) | 
					
						
							|  |  |  |             self.assertIn("cc", setting) | 
					
						
							|  |  |  |             self.assertIn("notes", setting) | 
					
						
							|  |  |  |             self.assertIn("enabled", setting) | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # not found | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             self.request, "matchdict", new={"key": "this-should_notEXIST"} | 
					
						
							|  |  |  |         ): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |             self.assertRaises(HTTPNotFound, view.get_instance) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_get_instance_title(self): | 
					
						
							|  |  |  |         view = self.make_view() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         result = view.get_instance_title({"subject": "whatever"}) | 
					
						
							|  |  |  |         self.assertEqual(result, "whatever") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_configure_form(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config.setdefault("wutta.email.default.sender", "test@example.com") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |         view = self.make_view() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object(self.request, "matchdict", new={"key": "feedback"}): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |             setting = view.get_instance() | 
					
						
							|  |  |  |             form = view.make_model_form(setting) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             self.assertIn("description", form.readonly_fields) | 
					
						
							|  |  |  |             self.assertFalse(form.required_fields["replyto"]) | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_persist(self): | 
					
						
							|  |  |  |         model = self.app.model | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config.setdefault("wutta.email.default.sender", "test@example.com") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |         view = self.make_view() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # start w/ no settings in db | 
					
						
							|  |  |  |         self.assertEqual(self.session.query(model.Setting).count(), 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # "edit" settings for feedback email | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object(self.request, "matchdict", new={"key": "feedback"}): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |             setting = view.get_instance() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             setting["subject"] = "Testing Feedback" | 
					
						
							|  |  |  |             setting["sender"] = "feedback@example.com" | 
					
						
							|  |  |  |             setting["replyto"] = "feedback4@example.com" | 
					
						
							|  |  |  |             setting["to"] = "feedback@example.com" | 
					
						
							|  |  |  |             setting["cc"] = "feedback2@example.com" | 
					
						
							|  |  |  |             setting["bcc"] = "feedback3@example.com" | 
					
						
							|  |  |  |             setting["notes"] = "did this work?" | 
					
						
							|  |  |  |             setting["enabled"] = True | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # persist email settings | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.object(view, "Session", return_value=self.session): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |                 view.persist(setting) | 
					
						
							|  |  |  |                 self.session.commit() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # check settings in db | 
					
						
							|  |  |  |         self.assertEqual(self.session.query(model.Setting).count(), 8) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.subject"), | 
					
						
							|  |  |  |             "Testing Feedback", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.sender"), | 
					
						
							|  |  |  |             "feedback@example.com", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.replyto"), | 
					
						
							|  |  |  |             "feedback4@example.com", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.to"), | 
					
						
							|  |  |  |             "feedback@example.com", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.cc"), | 
					
						
							|  |  |  |             "feedback2@example.com", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.bcc"), | 
					
						
							|  |  |  |             "feedback3@example.com", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.notes"), | 
					
						
							|  |  |  |             "did this work?", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.enabled"), "true" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # "edit" settings for feedback email | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object(self.request, "matchdict", new={"key": "feedback"}): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |             setting = view.get_instance() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             setting["subject"] = None | 
					
						
							|  |  |  |             setting["sender"] = None | 
					
						
							|  |  |  |             setting["replyto"] = None | 
					
						
							|  |  |  |             setting["to"] = None | 
					
						
							|  |  |  |             setting["cc"] = None | 
					
						
							|  |  |  |             setting["bcc"] = None | 
					
						
							|  |  |  |             setting["notes"] = None | 
					
						
							|  |  |  |             setting["enabled"] = False | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # persist email settings | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.object(view, "Session", return_value=self.session): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |                 view.persist(setting) | 
					
						
							|  |  |  |                 self.session.commit() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # check settings in db | 
					
						
							|  |  |  |         self.assertEqual(self.session.query(model.Setting).count(), 1) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.assertIsNone( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.subject") | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertIsNone( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.sender") | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertIsNone( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.replyto") | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertIsNone(self.app.get_setting(self.session, "wutta.email.feedback.to")) | 
					
						
							|  |  |  |         self.assertIsNone(self.app.get_setting(self.session, "wutta.email.feedback.cc")) | 
					
						
							|  |  |  |         self.assertIsNone( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.bcc") | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertIsNone( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.notes") | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.app.get_setting(self.session, "wutta.email.feedback.enabled"), "false" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_render_to_response(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config.setdefault("wutta.email.default.sender", "test@example.com") | 
					
						
							|  |  |  |         self.pyramid_config.add_route("home", "/") | 
					
						
							|  |  |  |         self.pyramid_config.add_route("login", "/auth/login") | 
					
						
							|  |  |  |         self.pyramid_config.add_route("email_settings", "/email/settings") | 
					
						
							|  |  |  |         self.pyramid_config.add_route( | 
					
						
							|  |  |  |             "email_settings.preview", "/email/settings/{key}/preview" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |         view = self.make_view() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # nb. this gives coverage, but tests nothing.. | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object(self.request, "matchdict", new={"key": "feedback"}): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |             setting = view.get_instance() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.object(view, "viewing", new=True): | 
					
						
							|  |  |  |                 context = {"instance": setting} | 
					
						
							|  |  |  |                 response = view.render_to_response("view", context) | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |                 self.assertIsInstance(response, Response) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_preview(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.config.setdefault("wutta.email.default.sender", "test@example.com") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |         view = self.make_view() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # nb. this gives coverage, but tests nothing.. | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object(self.request, "matchdict", new={"key": "feedback"}): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # html | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.object(self.request, "params", new={"mode": "html"}): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |                 response = view.preview() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 self.assertEqual(response.content_type, "text/html") | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # txt | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.object(self.request, "params", new={"mode": "txt"}): | 
					
						
							| 
									
										
										
										
											2024-12-23 19:24:17 -06:00
										 |  |  |                 response = view.preview() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 self.assertEqual(response.content_type, "text/plain") |