Verified Commit 36bc9ae2 authored by Kevin Morris's avatar Kevin Morris
Browse files

fix(notify): gracefully fail notifications

Instead of allowing an exception to propogate through the framework
routes, catch it and log out an error about notifications not being

Signed-off-by: Kevin Morris's avatarKevin Morris <>
parent d6d41cdb
Pipeline #13945 passed with stages
in 9 minutes and 4 seconds
......@@ -13,10 +13,12 @@ import aurweb.config
import aurweb.db
import aurweb.l10n
from aurweb import db
from aurweb import db, logging
from aurweb.models import (PackageBase, PackageComaintainer, PackageComment, PackageNotification, PackageRequest, RequestType,
TUVote, User)
logger = logging.get_logger(__name__)
aur_location = aurweb.config.get('options', 'aur_location')
......@@ -49,7 +51,7 @@ class Notification:
body += '\n' + '[%d] %s' % (i + 1, ref)
return body.rstrip()
def send(self):
def _send(self) -> None:
sendmail = aurweb.config.get('notifications', 'sendmail')
sender = aurweb.config.get('notifications', 'sender')
reply_to = aurweb.config.get('notifications', 'reply-to')
......@@ -111,6 +113,14 @@ class Notification:
server.sendmail(sender, deliver_to, msg.as_bytes())
def send(self) -> None:
except OSError as exc:
logger.error("Unable to emit notification due to an "
"OSError (precise exception following).")
class ResetKeyNotification(Notification):
def __init__(self, uid):
from datetime import datetime
from logging import ERROR
from typing import List
from unittest import mock
......@@ -634,3 +635,32 @@ def test_notification_defaults():
assert notif.get_refs() == tuple()
assert notif.get_headers() == dict()
assert notif.get_cc() == list()
def test_notification_oserror(user: User, caplog: pytest.LogCaptureFixture):
""" Try sending a notification with a bad SMTP configuration. """
config_get = config.get
mocked_options = {
"sendmail": str(),
"smtp-server": "",
"smtp-port": "587",
"smtp-user": "",
"smtp-password": "notify_server_xyz",
"sender": "",
"reply-to": ""
def mock_config_get(section: str, key: str) -> str:
if section == "notifications":
if key in mocked_options:
return mocked_options.get(key)
return config_get(section, key)
notif = notify.WelcomeNotification(user.ID)
with mock.patch("aurweb.config.get", side_effect=mock_config_get):
expected = "Unable to emit notification due to an OSError"
assert expected in caplog.text
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment