Verified Commit d8e3ca1a authored by Kevin Morris's avatar Kevin Morris
Browse files

change(notify): converted to use aurweb.db ORM



- Removed notify sharness test

Signed-off-by: Kevin Morris's avatarKevin Morris <kevr@0cost.org>
parent 9fb1fbe3
......@@ -239,7 +239,6 @@ def remove_comaintainers(pkgbase: models.PackageBase,
:param usernames: Iterable of username strings
:return: None
"""
conn = db.ConnectionExecutor(db.get_engine().raw_connection())
notifications = []
with db.begin():
for username in usernames:
......@@ -250,8 +249,7 @@ def remove_comaintainers(pkgbase: models.PackageBase,
).first()
notifications.append(
notify.ComaintainerRemoveNotification(
conn, comaintainer.User.ID, pkgbase.ID
)
comaintainer.User.ID, pkgbase.ID)
)
db.delete(comaintainer)
......@@ -283,7 +281,6 @@ def add_comaintainers(request: Request, pkgbase: models.PackageBase,
memo[username] = user
# Alright, now that we got past the check, add them all to the DB.
conn = db.ConnectionExecutor(db.get_engine().raw_connection())
notifications = []
with db.begin():
for username in usernames:
......@@ -302,7 +299,7 @@ def add_comaintainers(request: Request, pkgbase: models.PackageBase,
notifications.append(
notify.ComaintainerAddNotification(
conn, comaintainer.User.ID, pkgbase.ID)
comaintainer.User.ID, pkgbase.ID)
)
# Send out notifications.
......
......@@ -97,8 +97,7 @@ async def passreset_post(request: Request,
with db.begin():
user.ResetKey = resetkey
executor = db.ConnectionExecutor(db.get_engine().raw_connection())
ResetKeyNotification(executor, user.ID).send()
ResetKeyNotification(user.ID).send()
# Render ?step=confirm.
return RedirectResponse(url="/passreset?step=confirm",
......@@ -323,8 +322,7 @@ async def account_register_post(request: Request,
Fingerprint=fingerprint)
# Send a reset key notification to the new user.
executor = db.ConnectionExecutor(db.get_engine().raw_connection())
WelcomeNotification(executor, user.ID).send()
WelcomeNotification(user.ID).send()
context["complete"] = True
context["user"] = user
......
......@@ -146,7 +146,6 @@ def delete_package(deleter: models.User, package: models.Package):
requests = []
bases_to_delete = []
conn = db.ConnectionExecutor(db.get_engine().raw_connection())
# In all cases, though, just delete the Package in question.
if package.PackageBase.packages.count() == 1:
reqtype = db.query(models.RequestType).filter(
......@@ -162,7 +161,7 @@ def delete_package(deleter: models.User, package: models.Package):
# Prepare DeleteNotification.
notifications.append(
notify.DeleteNotification(conn, deleter.ID, package.PackageBase.ID)
notify.DeleteNotification(deleter.ID, package.PackageBase.ID)
)
# For each PackageRequest created, mock up an open and close notification.
......@@ -170,12 +169,12 @@ def delete_package(deleter: models.User, package: models.Package):
for pkgreq in requests:
notifications.append(
notify.RequestOpenNotification(
conn, deleter.ID, pkgreq.ID, reqtype.Name,
deleter.ID, pkgreq.ID, reqtype.Name,
pkgreq.PackageBase.ID, merge_into=basename or None)
)
notifications.append(
notify.RequestCloseNotification(
conn, deleter.ID, pkgreq.ID, pkgreq.status_display())
deleter.ID, pkgreq.ID, pkgreq.status_display())
)
# Perform all the deletions.
......@@ -666,10 +665,9 @@ async def pkgbase_request_post(request: Request, name: str,
Comments=comments,
ClosureComment=str())
conn = db.ConnectionExecutor(db.get_engine().raw_connection())
# Prepare notification object.
notif = notify.RequestOpenNotification(
conn, request.user.ID, pkgreq.ID, reqtype.Name,
request.user.ID, pkgreq.ID, reqtype.Name,
pkgreq.PackageBase.ID, merge_into=merge_into or None)
# Send the notification now that we're out of the DB scope.
......@@ -688,7 +686,7 @@ async def pkgbase_request_post(request: Request, name: str,
pkgreq.Status = ACCEPTED_ID
db.refresh(pkgreq)
notif = notify.RequestCloseNotification(
conn, request.user.ID, pkgreq.ID, pkgreq.status_display())
request.user.ID, pkgreq.ID, pkgreq.status_display())
notif.send()
elif type == "deletion" and is_maintainer and outdated:
packages = pkgbase.packages.all()
......@@ -742,9 +740,8 @@ async def requests_close_post(request: Request, id: int,
pkgreq.Status = reason
pkgreq.ClosureComment = comments
conn = db.ConnectionExecutor(db.get_engine().raw_connection())
notify_ = notify.RequestCloseNotification(
conn, request.user.ID, pkgreq.ID, pkgreq.status_display())
request.user.ID, pkgreq.ID, pkgreq.status_display())
notify_.send()
return RedirectResponse("/requests", status_code=HTTPStatus.SEE_OTHER)
......@@ -936,9 +933,7 @@ async def pkgbase_unvote(request: Request, name: str):
def pkgbase_disown_instance(request: Request, pkgbase: models.PackageBase):
disowner = request.user
conn = db.ConnectionExecutor(db.get_engine().raw_connection())
notif = notify.DisownNotification(conn, disowner.ID, pkgbase.ID)
notif = notify.DisownNotification(disowner.ID, pkgbase.ID)
if disowner != pkgbase.Maintainer:
with db.begin():
......@@ -1003,8 +998,7 @@ def pkgbase_adopt_instance(request: Request, pkgbase: models.PackageBase):
with db.begin():
pkgbase.Maintainer = request.user
conn = db.ConnectionExecutor(db.get_engine().raw_connection())
notif = notify.AdoptNotification(conn, request.user.ID, pkgbase.ID)
notif = notify.AdoptNotification(request.user.ID, pkgbase.ID)
notif.send()
......@@ -1366,7 +1360,7 @@ def pkgbase_merge_instance(request: Request, pkgbase: models.PackageBase,
f"{request.user.Username}.")
rejected_closure_comment = ("Rejected because another merge request "
"for the same package base was accepted.")
conn = db.ConnectionExecutor(db.get_engine().raw_connection())
if not requests:
# If there are no requests, create one owned by request.user.
with db.begin():
......@@ -1383,7 +1377,7 @@ def pkgbase_merge_instance(request: Request, pkgbase: models.PackageBase,
# Add a notification about the opening to our notifs array.
notif = notify.RequestOpenNotification(
conn, request.user.ID, pkgreq.ID, MERGE,
request.user.ID, pkgreq.ID, MERGE,
pkgbase.ID, merge_into=target.Name)
notifs.append(notif)
......@@ -1417,11 +1411,9 @@ def pkgbase_merge_instance(request: Request, pkgbase: models.PackageBase,
for pkgreq in all_requests:
# Create notifications for request closure.
notif = notify.RequestCloseNotification(
conn, request.user.ID, pkgreq.ID, pkgreq.status_display())
request.user.ID, pkgreq.ID, pkgreq.status_display())
notifs.append(notif)
conn.close()
# Log this out for accountability purposes.
logger.info(f"Trusted User '{request.user.Username}' merged "
f"'{pkgbasename}' into '{target.Name}'.")
......
This diff is collapsed.
""" Fake SMTP clients that can be used for testing. """
class FakeSMTP:
""" A fake version of smtplib.SMTP used for testing. """
starttls_enabled = False
use_ssl = False
def __init__(self):
self.emails = []
self.count = 0
self.ehlo_count = 0
self.quit_count = 0
self.set_debuglevel_count = 0
self.user = None
self.passwd = None
def ehlo(self) -> None:
self.ehlo_count += 1
def starttls(self) -> None:
self.starttls_enabled = True
def set_debuglevel(self, level: int = 0) -> None:
self.set_debuglevel_count += 1
def login(self, user: str, passwd: str) -> None:
self.user = user
self.passwd = passwd
def sendmail(self, sender: str, to: str, msg: bytes) -> None:
self.emails.append((sender, to, msg.decode()))
self.count += 1
def quit(self) -> None:
self.quit_count += 1
class FakeSMTP_SSL(FakeSMTP):
""" A fake version of smtplib.SMTP_SSL used for testing. """
use_ssl = True
#!/bin/sh
test_description='notify tests'
. "$(dirname "$0")/setup.sh"
test_expect_success 'Test out-of-date notifications.' '
cat <<-EOD | sqlite3 aur.db &&
/* Use package base IDs which can be distinguished from user IDs. */
INSERT INTO PackageBases (ID, Name, MaintainerUID, SubmittedTS, ModifiedTS, FlaggerComment) VALUES (1001, "foobar", 1, 0, 0, "This is a test OOD comment.");
INSERT INTO PackageBases (ID, Name, MaintainerUID, SubmittedTS, ModifiedTS, FlaggerComment) VALUES (1002, "foobar2", 2, 0, 0, "");
INSERT INTO PackageBases (ID, Name, MaintainerUID, SubmittedTS, ModifiedTS, FlaggerComment) VALUES (1003, "foobar3", NULL, 0, 0, "");
INSERT INTO PackageBases (ID, Name, MaintainerUID, SubmittedTS, ModifiedTS, FlaggerComment) VALUES (1004, "foobar4", 1, 0, 0, "");
INSERT INTO PackageComaintainers (PackageBaseID, UsersID, Priority) VALUES (1001, 2, 1);
INSERT INTO PackageComaintainers (PackageBaseID, UsersID, Priority) VALUES (1001, 4, 2);
INSERT INTO PackageComaintainers (PackageBaseID, UsersID, Priority) VALUES (1002, 3, 1);
INSERT INTO PackageComaintainers (PackageBaseID, UsersID, Priority) VALUES (1002, 5, 2);
INSERT INTO PackageComaintainers (PackageBaseID, UsersID, Priority) VALUES (1003, 4, 1);
EOD
>sendmail.out &&
cover "$NOTIFY" flag 1 1001 &&
cat <<-EOD >expected &&
Subject: AUR Out-of-date Notification for foobar
To: tu@localhost
Subject: AUR Out-of-date Notification for foobar
To: user2@localhost
Subject: AUR Out-of-date Notification for foobar
To: user@localhost
EOD
grep "^\(Subject\|To\)" sendmail.out >sendmail.parts &&
test_cmp sendmail.parts expected &&
cat <<-EOD | sqlite3 aur.db
DELETE FROM PackageComaintainers;
EOD
'
test_expect_success 'Test subject and body of reset key notifications.' '
cat <<-EOD | sqlite3 aur.db &&
UPDATE Users SET ResetKey = "12345678901234567890123456789012" WHERE ID = 1;
EOD
>sendmail.out &&
cover "$NOTIFY" send-resetkey 1 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: AUR Password Reset
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
A password reset request was submitted for the account user associated
with your email address. If you wish to reset your password follow the
link [1] below, otherwise ignore this message and nothing will happen.
[1] https://aur.archlinux.org/passreset/?resetkey=12345678901234567890123456789012
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of welcome notifications.' '
cat <<-EOD | sqlite3 aur.db &&
UPDATE Users SET ResetKey = "12345678901234567890123456789012" WHERE ID = 1;
EOD
>sendmail.out &&
cover "$NOTIFY" welcome 1 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: Welcome to the Arch User Repository
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
Welcome to the Arch User Repository! In order to set an initial
password for your new account, please click the link [1] below. If the
link does not work, try copying and pasting it into your browser.
[1] https://aur.archlinux.org/passreset/?resetkey=12345678901234567890123456789012
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of comment notifications.' '
cat <<-EOD | sqlite3 aur.db &&
/* Use package comments IDs which can be distinguished from other IDs. */
INSERT INTO PackageComments (ID, PackageBaseID, UsersID, Comments, RenderedComment) VALUES (2001, 1001, 1, "This is a test comment.", "This is a test comment.");
INSERT INTO PackageNotifications (PackageBaseID, UserID) VALUES (1001, 2);
UPDATE Users SET CommentNotify = 1 WHERE ID = 2;
EOD
>sendmail.out &&
cover "$NOTIFY" comment 1 1001 2001 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: AUR Comment for foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
user [1] added the following comment to foobar [2]:
This is a test comment.
--
If you no longer wish to receive notifications about this package,
please go to the package page [2] and select "Disable notifications".
[1] https://aur.archlinux.org/account/user/
[2] https://aur.archlinux.org/pkgbase/foobar/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of update notifications.' '
cat <<-EOD | sqlite3 aur.db &&
UPDATE Users SET UpdateNotify = 1 WHERE ID = 2;
EOD
>sendmail.out &&
cover "$NOTIFY" update 1 1001 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: AUR Package Update: foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
user [1] pushed a new commit to foobar [2].
--
If you no longer wish to receive notifications about this package,
please go to the package page [2] and select "Disable notifications".
[1] https://aur.archlinux.org/account/user/
[2] https://aur.archlinux.org/pkgbase/foobar/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of out-of-date notifications.' '
>sendmail.out &&
cover "$NOTIFY" flag 1 1001 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: AUR Out-of-date Notification for foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
Your package foobar [1] has been flagged out-of-date by user [2]:
This is a test OOD comment.
[1] https://aur.archlinux.org/pkgbase/foobar/
[2] https://aur.archlinux.org/account/user/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of adopt notifications.' '
>sendmail.out &&
cover "$NOTIFY" adopt 1 1001 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: AUR Ownership Notification for foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
The package foobar [1] was adopted by user [2].
[1] https://aur.archlinux.org/pkgbase/foobar/
[2] https://aur.archlinux.org/account/user/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of disown notifications.' '
>sendmail.out &&
cover "$NOTIFY" disown 1 1001 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: AUR Ownership Notification for foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
The package foobar [1] was disowned by user [2].
[1] https://aur.archlinux.org/pkgbase/foobar/
[2] https://aur.archlinux.org/account/user/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of co-maintainer addition notifications.' '
>sendmail.out &&
cover "$NOTIFY" comaintainer-add 1 1001 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: AUR Co-Maintainer Notification for foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
You were added to the co-maintainer list of foobar [1].
[1] https://aur.archlinux.org/pkgbase/foobar/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of co-maintainer removal notifications.' '
>sendmail.out &&
cover "$NOTIFY" comaintainer-remove 1 1001 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: AUR Co-Maintainer Notification for foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
You were removed from the co-maintainer list of foobar [1].
[1] https://aur.archlinux.org/pkgbase/foobar/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of delete notifications.' '
>sendmail.out &&
cover "$NOTIFY" delete 1 1001 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: AUR Package deleted: foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
user [1] deleted foobar [2].
You will no longer receive notifications about this package.
[1] https://aur.archlinux.org/account/user/
[2] https://aur.archlinux.org/pkgbase/foobar/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of merge notifications.' '
>sendmail.out &&
cover "$NOTIFY" delete 1 1001 1002 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: AUR Package deleted: foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
user [1] merged foobar [2] into foobar2 [3].
--
If you no longer wish receive notifications about the new package,
please go to [3] and click "Disable notifications".
[1] https://aur.archlinux.org/account/user/
[2] https://aur.archlinux.org/pkgbase/foobar/
[3] https://aur.archlinux.org/pkgbase/foobar2/
EOD
test_cmp actual expected
'
test_expect_success 'Test Cc, subject and body of request open notifications.' '
cat <<-EOD | sqlite3 aur.db &&
/* Use package request IDs which can be distinguished from other IDs. */
INSERT INTO PackageRequests (ID, PackageBaseID, PackageBaseName, UsersID, ReqTypeID, Comments, ClosureComment) VALUES (3001, 1001, "foobar", 2, 1, "This is a request test comment.", "");
EOD
>sendmail.out &&
cover "$NOTIFY" request-open 1 3001 orphan 1001 &&
grep ^Cc: sendmail.out >actual &&
cat <<-EOD >expected &&
Cc: user@localhost, tu@localhost
EOD
test_cmp actual expected &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: [PRQ#3001] Orphan Request for foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
user [1] filed an orphan request for foobar [2]:
This is a request test comment.
[1] https://aur.archlinux.org/account/user/
[2] https://aur.archlinux.org/pkgbase/foobar/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of request open notifications for merge requests.' '
>sendmail.out &&
cover "$NOTIFY" request-open 1 3001 merge 1001 foobar2 &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: [PRQ#3001] Merge Request for foobar
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
user [1] filed a request to merge foobar [2] into foobar2 [3]:
This is a request test comment.
[1] https://aur.archlinux.org/account/user/
[2] https://aur.archlinux.org/pkgbase/foobar/
[3] https://aur.archlinux.org/pkgbase/foobar2/
EOD
test_cmp actual expected
'
test_expect_success 'Test Cc, subject and body of request close notifications.' '
>sendmail.out &&
cover "$NOTIFY" request-close 1 3001 accepted &&
grep ^Cc: sendmail.out >actual &&
cat <<-EOD >expected &&
Cc: user@localhost, tu@localhost
EOD
test_cmp actual expected &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: [PRQ#3001] Deletion Request for foobar Accepted
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
Request #3001 has been accepted by user [1].
[1] https://aur.archlinux.org/account/user/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of request close notifications (auto-accept).' '
>sendmail.out &&
cover "$NOTIFY" request-close 0 3001 accepted &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: [PRQ#3001] Deletion Request for foobar Accepted
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
Request #3001 has been accepted automatically by the Arch User
Repository package request system.
EOD
test_cmp actual expected
'
test_expect_success 'Test Cc of request close notification with co-maintainer.' '
cat <<-EOD | sqlite3 aur.db &&
/* Use package base IDs which can be distinguished from user IDs. */
INSERT INTO PackageComaintainers (PackageBaseID, UsersID, Priority) VALUES (1001, 3, 1);
EOD
>sendmail.out &&
"$NOTIFY" request-close 0 3001 accepted &&
grep ^Cc: sendmail.out >actual &&
cat <<-EOD >expected &&
Cc: user@localhost, tu@localhost, dev@localhost
EOD
test_cmp actual expected &&
cat <<-EOD | sqlite3 aur.db
DELETE FROM PackageComaintainers;
EOD
'
test_expect_success 'Test subject and body of request close notifications with closure comment.' '
cat <<-EOD | sqlite3 aur.db &&
UPDATE PackageRequests SET ClosureComment = "This is a test closure comment." WHERE ID = 3001;
EOD
>sendmail.out &&
cover "$NOTIFY" request-close 1 3001 accepted &&
grep ^Subject: sendmail.out >actual &&
cat <<-EOD >expected &&
Subject: [PRQ#3001] Deletion Request for foobar Accepted
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&
Request #3001 has been accepted by user [1]:
This is a test closure comment.
[1] https://aur.archlinux.org/account/user/
EOD
test_cmp actual expected
'
test_expect_success 'Test subject and body of TU vote reminders.' '
>sendmail.out &&
cover "$NOTIFY" tu-vote-reminder 1 &&
grep ^Subject: sendmail.out | head -1 >actual &&
cat <<-EOD >expected &&
Subject: TU Vote Reminder: Proposal 1
EOD
test_cmp actual expected &&
sed -n "/^\$/,\$p" sendmail.out | head -4 | base64 -d >actual &&
echo >>actual &&
cat <<-EOD >expected &&