3
0
Fork 0

fix: format all code with black

and from now on should not deviate from that...
This commit is contained in:
Lance Edgar 2025-08-30 21:25:44 -05:00
parent 49f9a0228b
commit a6bb538ce9
59 changed files with 2762 additions and 2131 deletions

View file

@ -18,7 +18,7 @@ class TestEmailSetting(ConfigTestCase):
setting = mod.EmailSetting(self.config)
self.assertIs(setting.config, self.config)
self.assertIs(setting.app, self.app)
self.assertEqual(setting.key, 'EmailSetting')
self.assertEqual(setting.key, "EmailSetting")
def test_sample_data(self):
setting = mod.EmailSetting(self.config)
@ -34,23 +34,23 @@ class TestMessage(FileTestCase):
msg = self.make_message()
# set as list
recips = msg.get_recips(['sally@example.com'])
self.assertEqual(recips, ['sally@example.com'])
recips = msg.get_recips(["sally@example.com"])
self.assertEqual(recips, ["sally@example.com"])
# set as tuple
recips = msg.get_recips(('barney@example.com',))
self.assertEqual(recips, ['barney@example.com'])
recips = msg.get_recips(("barney@example.com",))
self.assertEqual(recips, ["barney@example.com"])
# set as string
recips = msg.get_recips('wilma@example.com')
self.assertEqual(recips, ['wilma@example.com'])
recips = msg.get_recips("wilma@example.com")
self.assertEqual(recips, ["wilma@example.com"])
# set as null
recips = msg.get_recips(None)
self.assertEqual(recips, [])
# otherwise error
self.assertRaises(ValueError, msg.get_recips, {'foo': 'foo@example.com'})
self.assertRaises(ValueError, msg.get_recips, {"foo": "foo@example.com"})
def test_as_string(self):
@ -59,38 +59,44 @@ class TestMessage(FileTestCase):
self.assertRaises(ValueError, msg.as_string)
# txt body
msg = self.make_message(sender='bob@example.com',
txt_body="hello world")
msg = self.make_message(sender="bob@example.com", txt_body="hello world")
complete = msg.as_string()
self.assertIn('From: bob@example.com', complete)
self.assertIn("From: bob@example.com", complete)
# html body
msg = self.make_message(sender='bob@example.com',
html_body="<p>hello world</p>")
msg = self.make_message(
sender="bob@example.com", html_body="<p>hello world</p>"
)
complete = msg.as_string()
self.assertIn('From: bob@example.com', complete)
self.assertIn("From: bob@example.com", complete)
# txt + html body
msg = self.make_message(sender='bob@example.com',
txt_body="hello world",
html_body="<p>hello world</p>")
msg = self.make_message(
sender="bob@example.com",
txt_body="hello world",
html_body="<p>hello world</p>",
)
complete = msg.as_string()
self.assertIn('From: bob@example.com', complete)
self.assertIn("From: bob@example.com", complete)
# html + attachment
csv_part = MIMEText("foo,bar\n1,2", 'csv', 'utf_8')
msg = self.make_message(sender='bob@example.com',
html_body="<p>hello world</p>",
attachments=[csv_part])
csv_part = MIMEText("foo,bar\n1,2", "csv", "utf_8")
msg = self.make_message(
sender="bob@example.com",
html_body="<p>hello world</p>",
attachments=[csv_part],
)
complete = msg.as_string()
self.assertIn('Content-Type: multipart/mixed; boundary=', complete)
self.assertIn("Content-Type: multipart/mixed; boundary=", complete)
self.assertIn('Content-Type: text/csv; charset="utf_8"', complete)
# error if improper attachment
csv_path = self.write_file('data.csv', "foo,bar\n1,2")
msg = self.make_message(sender='bob@example.com',
html_body="<p>hello world</p>",
attachments=[csv_path])
csv_path = self.write_file("data.csv", "foo,bar\n1,2")
msg = self.make_message(
sender="bob@example.com",
html_body="<p>hello world</p>",
attachments=[csv_path],
)
self.assertRaises(ValueError, msg.as_string)
try:
msg.as_string()
@ -98,27 +104,30 @@ class TestMessage(FileTestCase):
self.assertIn("must specify valid MIME attachments", str(err))
# everything
msg = self.make_message(sender='bob@example.com',
subject='meeting follow-up',
to='sally@example.com',
cc='marketing@example.com',
bcc='bob@example.com',
replyto='sales@example.com',
txt_body="hello world",
html_body="<p>hello world</p>")
msg = self.make_message(
sender="bob@example.com",
subject="meeting follow-up",
to="sally@example.com",
cc="marketing@example.com",
bcc="bob@example.com",
replyto="sales@example.com",
txt_body="hello world",
html_body="<p>hello world</p>",
)
complete = msg.as_string()
self.assertIn('From: bob@example.com', complete)
self.assertIn('Subject: meeting follow-up', complete)
self.assertIn('To: sally@example.com', complete)
self.assertIn('Cc: marketing@example.com', complete)
self.assertIn('Bcc: bob@example.com', complete)
self.assertIn('Reply-To: sales@example.com', complete)
self.assertIn("From: bob@example.com", complete)
self.assertIn("Subject: meeting follow-up", complete)
self.assertIn("To: sally@example.com", complete)
self.assertIn("Cc: marketing@example.com", complete)
self.assertIn("Bcc: bob@example.com", complete)
self.assertIn("Reply-To: sales@example.com", complete)
class mock_foo(mod.EmailSetting):
default_subject = "MOCK FOO!"
def sample_data(self):
return {'foo': 'mock'}
return {"foo": "mock"}
class TestEmailHandler(ConfigTestCase):
@ -129,43 +138,43 @@ class TestEmailHandler(ConfigTestCase):
def test_constructor_lookups(self):
# empty lookup paths by default, if no providers
with patch.object(self.app, 'providers', new={}):
with patch.object(self.app, "providers", new={}):
handler = self.make_handler()
self.assertEqual(handler.txt_templates.directories, [])
self.assertEqual(handler.html_templates.directories, [])
# provider may specify paths as list
providers = {
'wuttatest': MagicMock(email_templates=['wuttjamaican:email-templates']),
"wuttatest": MagicMock(email_templates=["wuttjamaican:email-templates"]),
}
with patch.object(self.app, 'providers', new=providers):
with patch.object(self.app, "providers", new=providers):
handler = self.make_handler()
path = resource_path('wuttjamaican:email-templates')
path = resource_path("wuttjamaican:email-templates")
self.assertEqual(handler.txt_templates.directories, [path])
self.assertEqual(handler.html_templates.directories, [path])
# provider may specify paths as string
providers = {
'wuttatest': MagicMock(email_templates='wuttjamaican:email-templates'),
"wuttatest": MagicMock(email_templates="wuttjamaican:email-templates"),
}
with patch.object(self.app, 'providers', new=providers):
with patch.object(self.app, "providers", new=providers):
handler = self.make_handler()
path = resource_path('wuttjamaican:email-templates')
path = resource_path("wuttjamaican:email-templates")
self.assertEqual(handler.txt_templates.directories, [path])
self.assertEqual(handler.html_templates.directories, [path])
def test_get_email_modules(self):
# no providers, no email modules
with patch.object(self.app, 'providers', new={}):
with patch.object(self.app, "providers", new={}):
handler = self.make_handler()
self.assertEqual(handler.get_email_modules(), [])
# provider may specify modules as list
providers = {
'wuttatest': MagicMock(email_modules=['wuttjamaican.email']),
"wuttatest": MagicMock(email_modules=["wuttjamaican.email"]),
}
with patch.object(self.app, 'providers', new=providers):
with patch.object(self.app, "providers", new=providers):
handler = self.make_handler()
modules = handler.get_email_modules()
self.assertEqual(len(modules), 1)
@ -173,9 +182,9 @@ class TestEmailHandler(ConfigTestCase):
# provider may specify modules as string
providers = {
'wuttatest': MagicMock(email_modules='wuttjamaican.email'),
"wuttatest": MagicMock(email_modules="wuttjamaican.email"),
}
with patch.object(self.app, 'providers', new=providers):
with patch.object(self.app, "providers", new=providers):
handler = self.make_handler()
modules = handler.get_email_modules()
self.assertEqual(len(modules), 1)
@ -184,36 +193,36 @@ class TestEmailHandler(ConfigTestCase):
def test_get_email_settings(self):
# no providers, no email settings
with patch.object(self.app, 'providers', new={}):
with patch.object(self.app, "providers", new={}):
handler = self.make_handler()
self.assertEqual(handler.get_email_settings(), {})
# provider may define email settings (via modules)
providers = {
'wuttatest': MagicMock(email_modules=['tests.test_email']),
"wuttatest": MagicMock(email_modules=["tests.test_email"]),
}
with patch.object(self.app, 'providers', new=providers):
with patch.object(self.app, "providers", new=providers):
handler = self.make_handler()
settings = handler.get_email_settings()
self.assertEqual(len(settings), 1)
self.assertIn('mock_foo', settings)
self.assertIn("mock_foo", settings)
def test_get_email_setting(self):
providers = {
'wuttatest': MagicMock(email_modules=['tests.test_email']),
"wuttatest": MagicMock(email_modules=["tests.test_email"]),
}
with patch.object(self.app, 'providers', new=providers):
with patch.object(self.app, "providers", new=providers):
handler = self.make_handler()
# as instance
setting = handler.get_email_setting('mock_foo')
setting = handler.get_email_setting("mock_foo")
self.assertIsInstance(setting, mod.EmailSetting)
self.assertIsInstance(setting, mock_foo)
# as class
setting = handler.get_email_setting('mock_foo', instance=False)
setting = handler.get_email_setting("mock_foo", instance=False)
self.assertTrue(issubclass(setting, mod.EmailSetting))
self.assertIs(setting, mock_foo)
@ -229,10 +238,10 @@ class TestEmailHandler(ConfigTestCase):
# self.assertRaises(ConfigurationError, handler.make_auto_message, 'foo')
# message is empty by default
msg = handler.make_auto_message('foo')
msg = handler.make_auto_message("foo")
self.assertIsInstance(msg, mod.Message)
self.assertEqual(msg.key, 'foo')
self.assertEqual(msg.sender, 'root@localhost')
self.assertEqual(msg.key, "foo")
self.assertEqual(msg.sender, "root@localhost")
self.assertEqual(msg.subject, "Automated message")
self.assertEqual(msg.to, [])
self.assertEqual(msg.cc, [])
@ -242,14 +251,14 @@ class TestEmailHandler(ConfigTestCase):
self.assertIsNone(msg.html_body)
# override defaults
self.config.setdefault('wutta.email.default.sender', 'bob@example.com')
self.config.setdefault('wutta.email.default.subject', 'Attention required')
self.config.setdefault("wutta.email.default.sender", "bob@example.com")
self.config.setdefault("wutta.email.default.subject", "Attention required")
# message is empty by default
msg = handler.make_auto_message('foo')
msg = handler.make_auto_message("foo")
self.assertIsInstance(msg, mod.Message)
self.assertEqual(msg.key, 'foo')
self.assertEqual(msg.sender, 'bob@example.com')
self.assertEqual(msg.key, "foo")
self.assertEqual(msg.sender, "bob@example.com")
self.assertEqual(msg.subject, "Attention required")
self.assertEqual(msg.to, [])
self.assertEqual(msg.cc, [])
@ -260,15 +269,15 @@ class TestEmailHandler(ConfigTestCase):
# but if there is a proper email profile configured for key,
# then we should get back a more complete message
self.config.setdefault('wutta.email.test_foo.subject', "hello foo")
self.config.setdefault('wutta.email.test_foo.to', 'sally@example.com')
self.config.setdefault('wutta.email.templates', 'tests:email-templates')
self.config.setdefault("wutta.email.test_foo.subject", "hello foo")
self.config.setdefault("wutta.email.test_foo.to", "sally@example.com")
self.config.setdefault("wutta.email.templates", "tests:email-templates")
handler = self.make_handler()
msg = handler.make_auto_message('test_foo')
self.assertEqual(msg.key, 'test_foo')
self.assertEqual(msg.sender, 'bob@example.com')
msg = handler.make_auto_message("test_foo")
self.assertEqual(msg.key, "test_foo")
self.assertEqual(msg.sender, "bob@example.com")
self.assertEqual(msg.subject, "hello foo")
self.assertEqual(msg.to, ['sally@example.com'])
self.assertEqual(msg.to, ["sally@example.com"])
self.assertEqual(msg.cc, [])
self.assertEqual(msg.bcc, [])
self.assertIsNone(msg.replyto)
@ -279,160 +288,162 @@ class TestEmailHandler(ConfigTestCase):
# kwarg at all; others get skipped if kwarg is empty
# sender
with patch.object(handler, 'get_auto_sender') as get_auto_sender:
msg = handler.make_auto_message('foo', sender=None)
with patch.object(handler, "get_auto_sender") as get_auto_sender:
msg = handler.make_auto_message("foo", sender=None)
get_auto_sender.assert_not_called()
msg = handler.make_auto_message('foo')
get_auto_sender.assert_called_once_with('foo')
msg = handler.make_auto_message("foo")
get_auto_sender.assert_called_once_with("foo")
# subject
with patch.object(handler, 'get_auto_subject') as get_auto_subject:
msg = handler.make_auto_message('foo', subject=None)
with patch.object(handler, "get_auto_subject") as get_auto_subject:
msg = handler.make_auto_message("foo", subject=None)
get_auto_subject.assert_not_called()
msg = handler.make_auto_message('foo')
get_auto_subject.assert_called_once_with('foo', {}, default=None)
msg = handler.make_auto_message("foo")
get_auto_subject.assert_called_once_with("foo", {}, default=None)
# to
with patch.object(handler, 'get_auto_to') as get_auto_to:
msg = handler.make_auto_message('foo', to=None)
with patch.object(handler, "get_auto_to") as get_auto_to:
msg = handler.make_auto_message("foo", to=None)
get_auto_to.assert_not_called()
get_auto_to.return_value = None
msg = handler.make_auto_message('foo')
get_auto_to.assert_called_once_with('foo')
msg = handler.make_auto_message("foo")
get_auto_to.assert_called_once_with("foo")
# cc
with patch.object(handler, 'get_auto_cc') as get_auto_cc:
msg = handler.make_auto_message('foo', cc=None)
with patch.object(handler, "get_auto_cc") as get_auto_cc:
msg = handler.make_auto_message("foo", cc=None)
get_auto_cc.assert_not_called()
get_auto_cc.return_value = None
msg = handler.make_auto_message('foo')
get_auto_cc.assert_called_once_with('foo')
msg = handler.make_auto_message("foo")
get_auto_cc.assert_called_once_with("foo")
# bcc
with patch.object(handler, 'get_auto_bcc') as get_auto_bcc:
msg = handler.make_auto_message('foo', bcc=None)
with patch.object(handler, "get_auto_bcc") as get_auto_bcc:
msg = handler.make_auto_message("foo", bcc=None)
get_auto_bcc.assert_not_called()
get_auto_bcc.return_value = None
msg = handler.make_auto_message('foo')
get_auto_bcc.assert_called_once_with('foo')
msg = handler.make_auto_message("foo")
get_auto_bcc.assert_called_once_with("foo")
# txt_body
with patch.object(handler, 'get_auto_txt_body') as get_auto_txt_body:
msg = handler.make_auto_message('foo', txt_body=None)
with patch.object(handler, "get_auto_txt_body") as get_auto_txt_body:
msg = handler.make_auto_message("foo", txt_body=None)
get_auto_txt_body.assert_not_called()
msg = handler.make_auto_message('foo')
get_auto_txt_body.assert_called_once_with('foo', {})
msg = handler.make_auto_message("foo")
get_auto_txt_body.assert_called_once_with("foo", {})
# html_body
with patch.object(handler, 'get_auto_html_body') as get_auto_html_body:
msg = handler.make_auto_message('foo', html_body=None)
with patch.object(handler, "get_auto_html_body") as get_auto_html_body:
msg = handler.make_auto_message("foo", html_body=None)
get_auto_html_body.assert_not_called()
msg = handler.make_auto_message('foo')
get_auto_html_body.assert_called_once_with('foo', {})
msg = handler.make_auto_message("foo")
get_auto_html_body.assert_called_once_with("foo", {})
def test_get_auto_sender(self):
handler = self.make_handler()
# basic global default
self.assertEqual(handler.get_auto_sender('foo'), 'root@localhost')
self.assertEqual(handler.get_auto_sender("foo"), "root@localhost")
# can set global default
self.config.setdefault('wutta.email.default.sender', 'bob@example.com')
self.assertEqual(handler.get_auto_sender('foo'), 'bob@example.com')
self.config.setdefault("wutta.email.default.sender", "bob@example.com")
self.assertEqual(handler.get_auto_sender("foo"), "bob@example.com")
# can set for key
self.config.setdefault('wutta.email.foo.sender', 'sally@example.com')
self.assertEqual(handler.get_auto_sender('foo'), 'sally@example.com')
self.config.setdefault("wutta.email.foo.sender", "sally@example.com")
self.assertEqual(handler.get_auto_sender("foo"), "sally@example.com")
def test_get_auto_replyto(self):
handler = self.make_handler()
# null by default
self.assertIsNone(handler.get_auto_replyto('foo'))
self.assertIsNone(handler.get_auto_replyto("foo"))
# can set global default
self.config.setdefault('wutta.email.default.replyto', 'george@example.com')
self.assertEqual(handler.get_auto_replyto('foo'), 'george@example.com')
self.config.setdefault("wutta.email.default.replyto", "george@example.com")
self.assertEqual(handler.get_auto_replyto("foo"), "george@example.com")
# can set for key
self.config.setdefault('wutta.email.foo.replyto', 'kathy@example.com')
self.assertEqual(handler.get_auto_replyto('foo'), 'kathy@example.com')
self.config.setdefault("wutta.email.foo.replyto", "kathy@example.com")
self.assertEqual(handler.get_auto_replyto("foo"), "kathy@example.com")
def test_get_auto_subject_template(self):
handler = self.make_handler()
# global default
template = handler.get_auto_subject_template('foo')
template = handler.get_auto_subject_template("foo")
self.assertEqual(template, "Automated message")
# can configure alternate global default
self.config.setdefault('wutta.email.default.subject', "Wutta Message")
template = handler.get_auto_subject_template('foo')
self.config.setdefault("wutta.email.default.subject", "Wutta Message")
template = handler.get_auto_subject_template("foo")
self.assertEqual(template, "Wutta Message")
# can configure just for key
self.config.setdefault('wutta.email.foo.subject', "Foo Message")
template = handler.get_auto_subject_template('foo')
self.config.setdefault("wutta.email.foo.subject", "Foo Message")
template = handler.get_auto_subject_template("foo")
self.assertEqual(template, "Foo Message")
# EmailSetting can provide default subject
providers = {
'wuttatest': MagicMock(email_modules=['tests.test_email']),
"wuttatest": MagicMock(email_modules=["tests.test_email"]),
}
with patch.object(self.app, 'providers', new=providers):
with patch.object(self.app, "providers", new=providers):
handler = self.make_handler()
template = handler.get_auto_subject_template('mock_foo')
template = handler.get_auto_subject_template("mock_foo")
self.assertEqual(template, "MOCK FOO!")
# caller can provide default subject
template = handler.get_auto_subject_template('mock_foo', default="whatever is clever")
template = handler.get_auto_subject_template(
"mock_foo", default="whatever is clever"
)
self.assertEqual(template, "whatever is clever")
def test_get_auto_subject(self):
handler = self.make_handler()
# global default
subject = handler.get_auto_subject('foo')
subject = handler.get_auto_subject("foo")
self.assertEqual(subject, "Automated message")
# can configure alternate global default
self.config.setdefault('wutta.email.default.subject', "Wutta Message")
subject = handler.get_auto_subject('foo')
self.config.setdefault("wutta.email.default.subject", "Wutta Message")
subject = handler.get_auto_subject("foo")
self.assertEqual(subject, "Wutta Message")
# caller can provide default subject
subject = handler.get_auto_subject('foo', default="whatever is clever")
subject = handler.get_auto_subject("foo", default="whatever is clever")
self.assertEqual(subject, "whatever is clever")
# can configure just for key
self.config.setdefault('wutta.email.foo.subject', "Foo Message")
subject = handler.get_auto_subject('foo')
self.config.setdefault("wutta.email.foo.subject", "Foo Message")
subject = handler.get_auto_subject("foo")
self.assertEqual(subject, "Foo Message")
# proper template is rendered
self.config.setdefault('wutta.email.bar.subject', "${foo} Message")
subject = handler.get_auto_subject('bar', {'foo': "FOO"})
self.config.setdefault("wutta.email.bar.subject", "${foo} Message")
subject = handler.get_auto_subject("bar", {"foo": "FOO"})
self.assertEqual(subject, "FOO Message")
# unless we ask it not to
subject = handler.get_auto_subject('bar', {'foo': "FOO"}, rendered=False)
subject = handler.get_auto_subject("bar", {"foo": "FOO"}, rendered=False)
self.assertEqual(subject, "${foo} Message")
def test_get_auto_recips(self):
handler = self.make_handler()
# error if bad type requested
self.assertRaises(ValueError, handler.get_auto_recips, 'foo', 'doesnotexist')
self.assertRaises(ValueError, handler.get_auto_recips, "foo", "doesnotexist")
# can configure global default
self.config.setdefault('wutta.email.default.to', 'admin@example.com')
recips = handler.get_auto_recips('foo', 'to')
self.assertEqual(recips, ['admin@example.com'])
self.config.setdefault("wutta.email.default.to", "admin@example.com")
recips = handler.get_auto_recips("foo", "to")
self.assertEqual(recips, ["admin@example.com"])
# can configure just for key
self.config.setdefault('wutta.email.foo.to', 'bob@example.com')
recips = handler.get_auto_recips('foo', 'to')
self.assertEqual(recips, ['bob@example.com'])
self.config.setdefault("wutta.email.foo.to", "bob@example.com")
recips = handler.get_auto_recips("foo", "to")
self.assertEqual(recips, ["bob@example.com"])
def test_get_auto_body_template(self):
from mako.template import Template
@ -440,88 +451,88 @@ class TestEmailHandler(ConfigTestCase):
handler = self.make_handler()
# error if bad request
self.assertRaises(ValueError, handler.get_auto_body_template, 'foo', 'BADTYPE')
self.assertRaises(ValueError, handler.get_auto_body_template, "foo", "BADTYPE")
# empty by default
template = handler.get_auto_body_template('foo', 'txt')
template = handler.get_auto_body_template("foo", "txt")
self.assertIsNone(template)
# but returns a template if it exists
providers = {
'wuttatest': MagicMock(email_templates=['tests:email-templates']),
"wuttatest": MagicMock(email_templates=["tests:email-templates"]),
}
with patch.object(self.app, 'providers', new=providers):
with patch.object(self.app, "providers", new=providers):
handler = self.make_handler()
template = handler.get_auto_body_template('test_foo', 'txt')
template = handler.get_auto_body_template("test_foo", "txt")
self.assertIsInstance(template, Template)
self.assertEqual(template.uri, 'test_foo.txt.mako')
self.assertEqual(template.uri, "test_foo.txt.mako")
def test_get_auto_txt_body(self):
handler = self.make_handler()
# empty by default
body = handler.get_auto_txt_body('some-random-email')
body = handler.get_auto_txt_body("some-random-email")
self.assertIsNone(body)
# but returns body if template exists
providers = {
'wuttatest': MagicMock(email_templates=['tests:email-templates']),
"wuttatest": MagicMock(email_templates=["tests:email-templates"]),
}
with patch.object(self.app, 'providers', new=providers):
with patch.object(self.app, "providers", new=providers):
handler = self.make_handler()
body = handler.get_auto_txt_body('test_foo')
self.assertEqual(body, 'hello from foo txt template\n')
body = handler.get_auto_txt_body("test_foo")
self.assertEqual(body, "hello from foo txt template\n")
def test_get_auto_html_body(self):
handler = self.make_handler()
# empty by default
body = handler.get_auto_html_body('some-random-email')
body = handler.get_auto_html_body("some-random-email")
self.assertIsNone(body)
# but returns body if template exists
providers = {
'wuttatest': MagicMock(email_templates=['tests:email-templates']),
"wuttatest": MagicMock(email_templates=["tests:email-templates"]),
}
with patch.object(self.app, 'providers', new=providers):
with patch.object(self.app, "providers", new=providers):
handler = self.make_handler()
body = handler.get_auto_html_body('test_foo')
self.assertEqual(body, '<p>hello from foo html template</p>\n')
body = handler.get_auto_html_body("test_foo")
self.assertEqual(body, "<p>hello from foo html template</p>\n")
def test_get_notes(self):
handler = self.make_handler()
# null by default
self.assertIsNone(handler.get_notes('foo'))
self.assertIsNone(handler.get_notes("foo"))
# configured notes
self.config.setdefault('wutta.email.foo.notes', 'hello world')
self.assertEqual(handler.get_notes('foo'), 'hello world')
self.config.setdefault("wutta.email.foo.notes", "hello world")
self.assertEqual(handler.get_notes("foo"), "hello world")
def test_is_enabled(self):
handler = self.make_handler()
# enabled by default
self.assertTrue(handler.is_enabled('default'))
self.assertTrue(handler.is_enabled('foo'))
self.assertTrue(handler.is_enabled("default"))
self.assertTrue(handler.is_enabled("foo"))
# specific type disabled
self.config.setdefault('wutta.email.foo.enabled', 'false')
self.assertFalse(handler.is_enabled('foo'))
self.config.setdefault("wutta.email.foo.enabled", "false")
self.assertFalse(handler.is_enabled("foo"))
# default is disabled
self.assertTrue(handler.is_enabled('bar'))
self.config.setdefault('wutta.email.default.enabled', 'false')
self.assertFalse(handler.is_enabled('bar'))
self.assertTrue(handler.is_enabled("bar"))
self.config.setdefault("wutta.email.default.enabled", "false")
self.assertFalse(handler.is_enabled("bar"))
def test_deliver_message(self):
handler = self.make_handler()
msg = handler.make_message(sender='bob@example.com', to='sally@example.com')
with patch.object(msg, 'as_string', return_value='msg-str'):
msg = handler.make_message(sender="bob@example.com", to="sally@example.com")
with patch.object(msg, "as_string", return_value="msg-str"):
# no smtp session since sending email is disabled by default
with patch.object(mod, 'smtplib') as smtplib:
with patch.object(mod, "smtplib") as smtplib:
session = MagicMock()
smtplib.SMTP.return_value = session
handler.deliver_message(msg)
@ -530,85 +541,99 @@ class TestEmailHandler(ConfigTestCase):
session.sendmail.assert_not_called()
# now let's enable sending
self.config.setdefault('wutta.mail.send_emails', 'true')
self.config.setdefault("wutta.mail.send_emails", "true")
# smtp login not attempted by default
with patch.object(mod, 'smtplib') as smtplib:
with patch.object(mod, "smtplib") as smtplib:
session = MagicMock()
smtplib.SMTP.return_value = session
handler.deliver_message(msg)
smtplib.SMTP.assert_called_once_with('localhost')
smtplib.SMTP.assert_called_once_with("localhost")
session.login.assert_not_called()
session.sendmail.assert_called_once_with('bob@example.com', {'sally@example.com'}, 'msg-str')
session.sendmail.assert_called_once_with(
"bob@example.com", {"sally@example.com"}, "msg-str"
)
# but login attempted if config has credentials
self.config.setdefault('wutta.mail.smtp.username', 'bob')
self.config.setdefault('wutta.mail.smtp.password', 'seekrit')
with patch.object(mod, 'smtplib') as smtplib:
self.config.setdefault("wutta.mail.smtp.username", "bob")
self.config.setdefault("wutta.mail.smtp.password", "seekrit")
with patch.object(mod, "smtplib") as smtplib:
session = MagicMock()
smtplib.SMTP.return_value = session
handler.deliver_message(msg)
smtplib.SMTP.assert_called_once_with('localhost')
session.login.assert_called_once_with('bob', 'seekrit')
session.sendmail.assert_called_once_with('bob@example.com', {'sally@example.com'}, 'msg-str')
smtplib.SMTP.assert_called_once_with("localhost")
session.login.assert_called_once_with("bob", "seekrit")
session.sendmail.assert_called_once_with(
"bob@example.com", {"sally@example.com"}, "msg-str"
)
# error if no sender
msg = handler.make_message(to='sally@example.com')
msg = handler.make_message(to="sally@example.com")
self.assertRaises(ValueError, handler.deliver_message, msg)
# error if no recips
msg = handler.make_message(sender='bob@example.com')
msg = handler.make_message(sender="bob@example.com")
self.assertRaises(ValueError, handler.deliver_message, msg)
# can set recips as list
msg = handler.make_message(sender='bob@example.com')
with patch.object(msg, 'as_string', return_value='msg-str'):
with patch.object(mod, 'smtplib') as smtplib:
msg = handler.make_message(sender="bob@example.com")
with patch.object(msg, "as_string", return_value="msg-str"):
with patch.object(mod, "smtplib") as smtplib:
session = MagicMock()
smtplib.SMTP.return_value = session
handler.deliver_message(msg, recips=['sally@example.com'])
smtplib.SMTP.assert_called_once_with('localhost')
session.sendmail.assert_called_once_with('bob@example.com', {'sally@example.com'}, 'msg-str')
handler.deliver_message(msg, recips=["sally@example.com"])
smtplib.SMTP.assert_called_once_with("localhost")
session.sendmail.assert_called_once_with(
"bob@example.com", {"sally@example.com"}, "msg-str"
)
# can set recips as string
msg = handler.make_message(sender='bob@example.com')
with patch.object(msg, 'as_string', return_value='msg-str'):
with patch.object(mod, 'smtplib') as smtplib:
msg = handler.make_message(sender="bob@example.com")
with patch.object(msg, "as_string", return_value="msg-str"):
with patch.object(mod, "smtplib") as smtplib:
session = MagicMock()
smtplib.SMTP.return_value = session
handler.deliver_message(msg, recips='sally@example.com')
smtplib.SMTP.assert_called_once_with('localhost')
session.sendmail.assert_called_once_with('bob@example.com', {'sally@example.com'}, 'msg-str')
handler.deliver_message(msg, recips="sally@example.com")
smtplib.SMTP.assert_called_once_with("localhost")
session.sendmail.assert_called_once_with(
"bob@example.com", {"sally@example.com"}, "msg-str"
)
# can set recips via to
msg = handler.make_message(sender='bob@example.com', to='sally@example.com')
with patch.object(msg, 'as_string', return_value='msg-str'):
with patch.object(mod, 'smtplib') as smtplib:
msg = handler.make_message(sender="bob@example.com", to="sally@example.com")
with patch.object(msg, "as_string", return_value="msg-str"):
with patch.object(mod, "smtplib") as smtplib:
session = MagicMock()
smtplib.SMTP.return_value = session
handler.deliver_message(msg)
smtplib.SMTP.assert_called_once_with('localhost')
session.sendmail.assert_called_once_with('bob@example.com', {'sally@example.com'}, 'msg-str')
smtplib.SMTP.assert_called_once_with("localhost")
session.sendmail.assert_called_once_with(
"bob@example.com", {"sally@example.com"}, "msg-str"
)
# can set recips via cc
msg = handler.make_message(sender='bob@example.com', cc='sally@example.com')
with patch.object(msg, 'as_string', return_value='msg-str'):
with patch.object(mod, 'smtplib') as smtplib:
msg = handler.make_message(sender="bob@example.com", cc="sally@example.com")
with patch.object(msg, "as_string", return_value="msg-str"):
with patch.object(mod, "smtplib") as smtplib:
session = MagicMock()
smtplib.SMTP.return_value = session
handler.deliver_message(msg)
smtplib.SMTP.assert_called_once_with('localhost')
session.sendmail.assert_called_once_with('bob@example.com', {'sally@example.com'}, 'msg-str')
smtplib.SMTP.assert_called_once_with("localhost")
session.sendmail.assert_called_once_with(
"bob@example.com", {"sally@example.com"}, "msg-str"
)
# can set recips via bcc
msg = handler.make_message(sender='bob@example.com', bcc='sally@example.com')
with patch.object(msg, 'as_string', return_value='msg-str'):
with patch.object(mod, 'smtplib') as smtplib:
msg = handler.make_message(sender="bob@example.com", bcc="sally@example.com")
with patch.object(msg, "as_string", return_value="msg-str"):
with patch.object(mod, "smtplib") as smtplib:
session = MagicMock()
smtplib.SMTP.return_value = session
handler.deliver_message(msg)
smtplib.SMTP.assert_called_once_with('localhost')
session.sendmail.assert_called_once_with('bob@example.com', {'sally@example.com'}, 'msg-str')
smtplib.SMTP.assert_called_once_with("localhost")
session.sendmail.assert_called_once_with(
"bob@example.com", {"sally@example.com"}, "msg-str"
)
def test_sending_is_enabled(self):
handler = self.make_handler()
@ -617,12 +642,12 @@ class TestEmailHandler(ConfigTestCase):
self.assertFalse(handler.sending_is_enabled())
# but can be turned on
self.config.setdefault('wutta.mail.send_emails', 'true')
self.config.setdefault("wutta.mail.send_emails", "true")
self.assertTrue(handler.sending_is_enabled())
def test_send_email(self):
handler = self.make_handler()
with patch.object(handler, 'deliver_message') as deliver_message:
with patch.object(handler, "deliver_message") as deliver_message:
# specify message w/ no body
msg = handler.make_message()
@ -631,7 +656,7 @@ class TestEmailHandler(ConfigTestCase):
# again, but also specify key
msg = handler.make_message()
self.assertRaises(ValueError, handler.send_email, 'foo', message=msg)
self.assertRaises(ValueError, handler.send_email, "foo", message=msg)
self.assertFalse(deliver_message.called)
# specify complete message
@ -643,7 +668,7 @@ class TestEmailHandler(ConfigTestCase):
# again, but also specify key
deliver_message.reset_mock()
msg = handler.make_message(txt_body="hello world")
handler.send_email('foo', message=msg)
handler.send_email("foo", message=msg)
deliver_message.assert_called_once_with(msg, recips=None)
# no key, no message
@ -652,25 +677,27 @@ class TestEmailHandler(ConfigTestCase):
# auto-create message w/ no template
deliver_message.reset_mock()
self.assertRaises(RuntimeError, handler.send_email, 'foo', sender='foo@example.com')
self.assertRaises(
RuntimeError, handler.send_email, "foo", sender="foo@example.com"
)
self.assertFalse(deliver_message.called)
# auto create w/ body
deliver_message.reset_mock()
handler.send_email('foo', sender='foo@example.com', txt_body="hello world")
handler.send_email("foo", sender="foo@example.com", txt_body="hello world")
self.assertTrue(deliver_message.called)
# type is disabled
deliver_message.reset_mock()
self.config.setdefault('wutta.email.foo.enabled', False)
handler.send_email('foo', sender='foo@example.com', txt_body="hello world")
self.config.setdefault("wutta.email.foo.enabled", False)
handler.send_email("foo", sender="foo@example.com", txt_body="hello world")
self.assertFalse(deliver_message.called)
# default is disabled
deliver_message.reset_mock()
handler.send_email('bar', sender='bar@example.com', txt_body="hello world")
handler.send_email("bar", sender="bar@example.com", txt_body="hello world")
self.assertTrue(deliver_message.called)
deliver_message.reset_mock()
self.config.setdefault('wutta.email.default.enabled', False)
handler.send_email('bar', sender='bar@example.com', txt_body="hello world")
self.config.setdefault("wutta.email.default.enabled", False)
handler.send_email("bar", sender="bar@example.com", txt_body="hello world")
self.assertFalse(deliver_message.called)