# -*- 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 from wuttaweb.testing import WebTestCase class TestEmailSettingViews(WebTestCase): def make_view(self): return mod.EmailSettingView(self.request) def test_includeme(self): self.pyramid_config.include('wuttaweb.views.email') def test_get_grid_data(self): self.config.setdefault('wutta.email.default.sender', 'test@example.com') view = self.make_view() data = view.get_grid_data() self.assertIsInstance(data, list) self.assertTrue(data) # 1+ items setting = data[0] self.assertIn('key', setting) self.assertIn('subject', setting) self.assertIn('sender', setting) self.assertIn('to', setting) self.assertIn('cc', setting) self.assertIn('notes', setting) def test_configure_grid(self): self.config.setdefault('wutta.email.default.sender', 'test@example.com') view = self.make_view() grid = view.make_model_grid() self.assertIn('key', grid.searchable_columns) self.assertIn('subject', grid.searchable_columns) def test_render_to_short(self): view = self.make_view() setting = EmailSetting(self.config) # more than 2 recips 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, ...') # just 2 recips result = view.render_to_short(setting, 'to', [ 'alice@example.com', 'bob@example.com', ]) self.assertEqual(result, 'alice@example.com, bob@example.com') # just 1 recip result = view.render_to_short(setting, 'to', ['alice@example.com']) self.assertEqual(result, 'alice@example.com') # no recips result = view.render_to_short(setting, 'to', []) self.assertIsNone(result) def test_get_instance(self): self.config.setdefault('wutta.email.default.sender', 'test@example.com') view = self.make_view() # normal with patch.object(self.request, 'matchdict', new={'key': 'feedback'}): setting = view.get_instance() self.assertIsInstance(setting, dict) 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) # not found with patch.object(self.request, 'matchdict', new={'key': 'this-should_notEXIST'}): self.assertRaises(HTTPNotFound, view.get_instance) def test_get_instance_title(self): view = self.make_view() result = view.get_instance_title({'subject': 'whatever'}) self.assertEqual(result, 'whatever') def test_configure_form(self): self.config.setdefault('wutta.email.default.sender', 'test@example.com') view = self.make_view() with patch.object(self.request, 'matchdict', new={'key': 'feedback'}): setting = view.get_instance() form = view.make_model_form(setting) self.assertIn('description', form.readonly_fields) self.assertFalse(form.required_fields['replyto']) def test_persist(self): model = self.app.model self.config.setdefault('wutta.email.default.sender', 'test@example.com') view = self.make_view() # start w/ no settings in db self.assertEqual(self.session.query(model.Setting).count(), 0) # "edit" settings for feedback email with patch.object(self.request, 'matchdict', new={'key': 'feedback'}): setting = view.get_instance() 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 # persist email settings with patch.object(view, 'Session', return_value=self.session): view.persist(setting) self.session.commit() # check settings in db self.assertEqual(self.session.query(model.Setting).count(), 8) 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') # "edit" settings for feedback email with patch.object(self.request, 'matchdict', new={'key': 'feedback'}): setting = view.get_instance() setting['subject'] = None setting['sender'] = None setting['replyto'] = None setting['to'] = None setting['cc'] = None setting['bcc'] = None setting['notes'] = None setting['enabled'] = False # persist email settings with patch.object(view, 'Session', return_value=self.session): view.persist(setting) self.session.commit() # check settings in db self.assertEqual(self.session.query(model.Setting).count(), 1) 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') def test_render_to_response(self): 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') view = self.make_view() # nb. this gives coverage, but tests nothing.. with patch.object(self.request, 'matchdict', new={'key': 'feedback'}): setting = view.get_instance() with patch.object(view, 'viewing', new=True): context = {'instance': setting} response = view.render_to_response('view', context) self.assertIsInstance(response, Response) def test_preview(self): self.config.setdefault('wutta.email.default.sender', 'test@example.com') view = self.make_view() # nb. this gives coverage, but tests nothing.. with patch.object(self.request, 'matchdict', new={'key': 'feedback'}): # html with patch.object(self.request, 'params', new={'mode': 'html'}): response = view.preview() self.assertEqual(response.content_type, 'text/html') # txt with patch.object(self.request, 'params', new={'mode': 'txt'}): response = view.preview() self.assertEqual(response.content_type, 'text/plain')