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")
|