def test_request_post_deletion_as_maintainer(client: TestClient, auser: User, pkgbase: PackageBase): """ Test the POST route for creating a deletion request as maint works. """ endpoint = f"/pkgbase/{pkgbase.Name}/request" data = {"comments": "Test request.", "type": "deletion"} with client as request: resp = request.post(endpoint, data=data, cookies=auser.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) # Check the pkgreq record got created and accepted. pkgreq = db.query(PackageRequest).first() assert pkgreq is not None assert pkgreq.ReqTypeID == DELETION_ID assert pkgreq.Status == ACCEPTED_ID # Should've gotten two emails. assert Email.count() == 2 # A RequestOpenNotification should've been sent out. email = Email(1) expr = r"^\[PRQ#%d\] Deletion Request for [^ ]+$" % pkgreq.ID assert re.match(expr, email.headers.get("Subject")) # Check the content of the close notification. email = Email(2) expr = r"^\[PRQ#%d\] Deletion Request for [^ ]+ Accepted$" % pkgreq.ID assert re.match(expr, email.headers.get("Subject"))
def test_request_post_orphan_autogenerated_closure(client: TestClient, tu_user: User, pkgbase: PackageBase, pkgreq: PackageRequest): idle_time = config.getint("options", "request_idle_time") now = time.utcnow() with db.begin(): pkgreq.ReqTypeID = ORPHAN_ID # Set the request time so it's seen as due (idle_time has passed). pkgreq.RequestTS = now - idle_time - 10 endpoint = f"/pkgbase/{pkgbase.Name}/disown" data = {"confirm": True} with client as request: resp = request.post(endpoint, data=data, cookies=tu_user.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) assert resp.headers.get("location") == f"/pkgbase/{pkgbase.Name}" assert Email.count() == 1 email = Email(1) expr = r"^\[PRQ#\d+\] Orphan Request for .+ Accepted$" assert re.match(expr, email.headers.get("Subject")) expr = r"\[Autogenerated\] Accepted orphan for .+\." assert re.search(expr, email.body)
def test_update(user: User, user2: User, pkgbases: List[PackageBase]): pkgbase = pkgbases[0] with db.begin(): user.UpdateNotify = 1 notif = notify.UpdateNotification(user2.ID, pkgbase.ID) notif.send() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == user.Email expected = f"AUR Package Update: {pkgbase.Name}" assert email.headers.get("Subject") == expected expected = f"""\ {user2.Username} [1] pushed a new commit to {pkgbase.Name} [2]. -- If you no longer wish to receive notifications about this package, please go to the package page [2] and select "Disable notifications". [1] {aur_location}/account/{user2.Username}/ [2] {aur_location}/pkgbase/{pkgbase.Name}/\ """ assert expected == email.body
def test_comment(user: User, user2: User, pkgbases: List[PackageBase]): pkgbase = pkgbases[0] with db.begin(): comment = db.create(models.PackageComment, PackageBase=pkgbase, User=user2, Comments="This is a test comment.") rendercomment.update_comment_render_fastapi(comment) notif = notify.CommentNotification(user2.ID, pkgbase.ID, comment.ID) notif.send() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == user.Email expected = f"AUR Comment for {pkgbase.Name}" assert email.headers.get("Subject") == expected expected = f"""\ {user2.Username} [1] added the following comment to {pkgbase.Name} [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] {aur_location}/account/{user2.Username}/ [2] {aur_location}/pkgbase/{pkgbase.Name}/\ """ assert expected == email.body
def test_close_request_closure_comment(user: User, user2: User, pkgreq: PackageRequest, pkgbases: List[PackageBase]): pkgbase = pkgbases[0] with db.begin(): pkgreq.ClosureComment = "This is a test closure comment." notif = notify.RequestCloseNotification(user2.ID, pkgreq.ID, "accepted") notif.send() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == aur_request_ml assert email.headers.get("Cc") == ", ".join([user.Email, user2.Email]) expected = f"[PRQ#{pkgreq.ID}] Orphan Request for {pkgbase.Name} Accepted" assert email.headers.get("Subject") == expected expected = f"""\ Request #{pkgreq.ID} has been accepted by {user2.Username} [1]: This is a test closure comment. [1] {aur_location}/account/{user2.Username}/\ """ assert email.body == expected
def test_email_dump(): """ Test that Email.dump() dumps a single email. """ body = "Test email." sendmail("*****@*****.**", "*****@*****.**", body) assert Email.count() == 1 stdout = io.StringIO() Email.dump(file=stdout) content = stdout.getvalue() assert "== Email #1 ==" in content
def test_suspended_ownership_change(user: User, pkgbases: List[PackageBase]): with db.begin(): user.Suspended = 1 pkgbase = pkgbases[0] notif = notify.ComaintainerAddNotification(user.ID, pkgbase.ID) notif.send() assert Email.count() == 1 Email.reset() # Clear the Email pool notif = notify.ComaintainerRemoveNotification(user.ID, pkgbase.ID) notif.send() assert Email.count() == 1
def test_merge_request(client: TestClient, user: User, tu_user: User, pkgbase: PackageBase, target: PackageBase, pkgreq: PackageRequest): """ Test merging a package with a pre - existing request. """ with db.begin(): pkgreq.ReqTypeID = MERGE_ID pkgreq.MergeBaseName = target.Name other_target = create_pkgbase(user, "other-target") other_request = create_request(MERGE_ID, user, pkgbase, "Other request.") other_target2 = create_pkgbase(user, "other-target2") other_request2 = create_request(MERGE_ID, user, pkgbase, "Other request2.") with db.begin(): other_request.MergeBaseName = other_target.Name other_request2.MergeBaseName = other_target2.Name # `pkgreq`.ReqTypeID is already DELETION_ID. endpoint = f"/pkgbase/{pkgbase.Name}/merge" comments = "Test merge closure." data = {"into": target.Name, "comments": comments, "confirm": True} with client as request: resp = request.post(endpoint, data=data, cookies=tu_user.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) assert resp.headers.get("location") == f"/pkgbase/{target.Name}" # Ensure that `pkgreq`.ClosureComment was left alone when specified. assert pkgreq.ClosureComment == comments # We should've gotten 3 emails: an accepting and two rejections. assert Email.count() == 3 # Assert specific IDs match up in the subjects. accepted = Email(1).parse() subj = r"^\[PRQ#%d\] Merge Request for [^ ]+ Accepted$" % pkgreq.ID assert re.match(subj, accepted.headers.get("Subject")) # In the accepted case, we already supplied a closure comment, # which stops one from being autogenerated by the algorithm. assert "[Autogenerated]" not in accepted.body # Test rejection emails, which do have autogenerated closures. rejected = Email(2).parse() subj = r"^\[PRQ#%d\] Merge Request for [^ ]+ Rejected$" % other_request.ID assert re.match(subj, rejected.headers.get("Subject")) assert "[Autogenerated]" in rejected.body rejected = Email(3).parse() subj = r"^\[PRQ#%d\] Merge Request for [^ ]+ Rejected$" % other_request2.ID assert re.match(subj, rejected.headers.get("Subject")) assert "[Autogenerated]" in rejected.body
def test_tu_vote_reminders_only_unvoted(user: User, user2: User, user3: User, voteinfo: TUVoteInfo): # Vote with user2 and user3; leaving only user to be notified. create_vote(user2, voteinfo) create_vote(user3, voteinfo) reminder.main() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == user.Email subject, content = email_pieces(voteinfo) assert email.headers.get("Subject") == subject assert email.body == content
def test_comaintainer_removal(user: User, pkgbases: List[PackageBase]): pkgbase = pkgbases[0] notif = notify.ComaintainerRemoveNotification(user.ID, pkgbase.ID) notif.send() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == user.Email expected = f"AUR Co-Maintainer Notification for {pkgbase.Name}" assert email.headers.get("Subject") == expected expected = f"""\ You were removed from the co-maintainer list of {pkgbase.Name} [1]. [1] {aur_location}/pkgbase/{pkgbase.Name}/\ """ assert email.body == expected
def test_deletion_autorequest(client: TestClient, tu_user: User, pkgbase: PackageBase): """ Test deleting a package without a request. """ # `pkgreq`.ReqTypeID is already DELETION_ID. endpoint = f"/pkgbase/{pkgbase.Name}/delete" data = {"confirm": True} with client as request: resp = request.post(endpoint, data=data, cookies=tu_user.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) assert resp.headers.get("location") == "/packages" assert Email.count() == 1 email = Email(1).parse() subject = r"^\[PRQ#\d+\] Deletion Request for [^ ]+ Accepted$" assert re.match(subject, email.headers.get("Subject")) assert "[Autogenerated]" in email.body
def test_close_request_comaintainer_cc(user: User, user2: User, pkgreq: PackageRequest, pkgbases: List[PackageBase]): pkgbase = pkgbases[0] with db.begin(): db.create(models.PackageComaintainer, PackageBase=pkgbase, User=user2, Priority=1) notif = notify.RequestCloseNotification(0, pkgreq.ID, "accepted") notif.send() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == aur_request_ml assert email.headers.get("Cc") == ", ".join([user.Email, user2.Email])
def test_disown(user: User, user2: User, pkgbases: List[PackageBase]): pkgbase = pkgbases[0] notif = notify.DisownNotification(user2.ID, pkgbase.ID) notif.send() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == user.Email expected = f"AUR Ownership Notification for {pkgbase.Name}" assert email.headers.get("Subject") == expected expected = f"""\ The package {pkgbase.Name} [1] was disowned by {user2.Username} [2]. [1] {aur_location}/pkgbase/{pkgbase.Name}/ [2] {aur_location}/account/{user2.Username}/\ """ assert email.body == expected
def test_tu_vote_reminders(user: User, user2: User, user3: User, voteinfo: TUVoteInfo): reminder.main() assert Email.count() == 3 emails = [Email(i).parse() for i in range(1, 4)] subject, content = email_pieces(voteinfo) expectations = [ # (to, content) (user.Email, subject, content), (user2.Email, subject, content), (user3.Email, subject, content) ] for i, element in enumerate(expectations): email, subject, content = element assert emails[i].headers.get("To") == email assert emails[i].headers.get("Subject") == subject assert emails[i].body == content
def test_request_post_deletion(client: TestClient, auser2: User, pkgbase: PackageBase): """ Test the POST route for creating a deletion request works. """ endpoint = f"/pkgbase/{pkgbase.Name}/request" data = {"comments": "Test request.", "type": "deletion"} with client as request: resp = request.post(endpoint, data=data, cookies=auser2.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) pkgreq = pkgbase.requests.first() assert pkgreq is not None assert pkgreq.ReqTypeID == DELETION_ID assert pkgreq.Status == PENDING_ID # A RequestOpenNotification should've been sent out. assert Email.count() == 1 email = Email(1) expr = r"^\[PRQ#%d\] Deletion Request for [^ ]+$" % pkgreq.ID assert re.match(expr, email.headers.get("Subject"))
def test_email_glue(): """ Test that Email.glue() decodes both base64 and decoded content. """ body = "Test email." sendmail("*****@*****.**", "*****@*****.**", body) assert Email.count() == 1 email1 = Email(1) email2 = Email(1) assert email1.glue() == email2.glue()
def test_delete(user: User, user2: User, pkgbases: List[PackageBase]): pkgbase = pkgbases[0] notif = notify.DeleteNotification(user2.ID, pkgbase.ID) notif.send() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == user.Email expected = f"AUR Package deleted: {pkgbase.Name}" assert email.headers.get("Subject") == expected expected = f"""\ {user2.Username} [1] deleted {pkgbase.Name} [2]. You will no longer receive notifications about this package. [1] {aur_location}/account/{user2.Username}/ [2] {aur_location}/pkgbase/{pkgbase.Name}/\ """ assert email.body == expected
def test_welcome(user: User): with db.begin(): user.ResetKey = "12345678901234567890123456789012" notif = notify.WelcomeNotification(user.ID) notif.send() assert Email.count() == 1 email = Email(1).parse() expected = "Welcome to the Arch User Repository" assert email.headers.get("Subject") == expected expected = f"""\ 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] {aur_location}/passreset/?resetkey=12345678901234567890123456789012\ """ assert email.body == expected
def test_tu_vote_reminders(user: User): set_tu([user]) vote_id = 1 notif = notify.TUVoteReminderNotification(vote_id) notif.send() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == user.Email expected = f"TU Vote Reminder: Proposal {vote_id}" assert email.headers.get("Subject") == expected expected = f"""\ Please remember to cast your vote on proposal {vote_id} [1]. The voting period ends in less than 48 hours. [1] {aur_location}/tu/?id={vote_id}\ """ assert email.body == expected
def test_reset(user: User): with db.begin(): user.ResetKey = "12345678901234567890123456789012" notif = notify.ResetKeyNotification(user.ID) notif.send() assert Email.count() == 1 email = Email(1).parse() expected = "AUR Password Reset" assert email.headers.get("Subject") == expected expected = f"""\ A password reset request was submitted for the account test 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] {aur_location}/passreset/?resetkey=12345678901234567890123456789012\ """ assert email.body == expected
def test_request_post_deletion_autoaccept(client: TestClient, auser: User, pkgbase: PackageBase, caplog: pytest.LogCaptureFixture): """ Test the request route for deletion as maintainer. """ caplog.set_level(DEBUG) now = time.utcnow() auto_delete_age = config.getint("options", "auto_delete_age") with db.begin(): pkgbase.ModifiedTS = now - auto_delete_age + 100 endpoint = f"/pkgbase/{pkgbase.Name}/request" data = {"comments": "Test request.", "type": "deletion"} with client as request: resp = request.post(endpoint, data=data, cookies=auser.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) pkgreq = db.query(PackageRequest).filter( PackageRequest.PackageBaseName == pkgbase.Name).first() assert pkgreq is not None assert pkgreq.ReqTypeID == DELETION_ID assert pkgreq.Status == ACCEPTED_ID # A RequestOpenNotification should've been sent out. assert Email.count() == 2 Email.dump() # Check the content of the open notification. email = Email(1) expr = r"^\[PRQ#%d\] Deletion Request for [^ ]+$" % pkgreq.ID assert re.match(expr, email.headers.get("Subject")) # Check the content of the close notification. email = Email(2) expr = r"^\[PRQ#%d\] Deletion Request for [^ ]+ Accepted$" % pkgreq.ID assert re.match(expr, email.headers.get("Subject")) # Check logs. expr = r"New request #\d+ is marked for auto-deletion." assert re.search(expr, caplog.text)
def test_open_close_request(user: User, user2: User, pkgreq: PackageRequest, pkgbases: List[PackageBase]): set_tu([user]) pkgbase = pkgbases[0] # Send an open request notification. notif = notify.RequestOpenNotification(user2.ID, pkgreq.ID, pkgreq.RequestType.Name, pkgbase.ID) notif.send() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == aur_request_ml assert email.headers.get("Cc") == ", ".join([user.Email, user2.Email]) expected = f"[PRQ#{pkgreq.ID}] Orphan Request for {pkgbase.Name}" assert email.headers.get("Subject") == expected expected = f"""\ {user2.Username} [1] filed an orphan request for {pkgbase.Name} [2]: This is a request test comment. [1] {aur_location}/account/{user2.Username}/ [2] {aur_location}/pkgbase/{pkgbase.Name}/\ """ assert email.body == expected # Now send a closure notification on the pkgbase we just opened. notif = notify.RequestCloseNotification(user2.ID, pkgreq.ID, "rejected") notif.send() assert Email.count() == 2 email = Email(2).parse() assert email.headers.get("To") == aur_request_ml assert email.headers.get("Cc") == ", ".join([user.Email, user2.Email]) expected = f"[PRQ#{pkgreq.ID}] Orphan Request for {pkgbase.Name} Rejected" assert email.headers.get("Subject") == expected expected = f"""\ Request #{pkgreq.ID} has been rejected by {user2.Username} [1]. [1] {aur_location}/account/{user2.Username}/\ """ assert email.body == expected # Test auto-accept. notif = notify.RequestCloseNotification(0, pkgreq.ID, "accepted") notif.send() assert Email.count() == 3 email = Email(3).parse() assert email.headers.get("To") == aur_request_ml assert email.headers.get("Cc") == ", ".join([user.Email, user2.Email]) expected = (f"[PRQ#{pkgreq.ID}] Orphan Request for " f"{pkgbase.Name} Accepted") assert email.headers.get("Subject") == expected expected = (f"Request #{pkgreq.ID} has been accepted automatically " "by the Arch User Repository\npackage request system.") assert email.body == expected
def test_request_post_orphan_autoaccept(client: TestClient, auser: User, pkgbase: PackageBase, caplog: pytest.LogCaptureFixture): """ Test the standard pkgbase request route GET method. """ caplog.set_level(DEBUG) now = time.utcnow() auto_orphan_age = config.getint("options", "auto_orphan_age") with db.begin(): pkgbase.OutOfDateTS = now - auto_orphan_age - 100 endpoint = f"/pkgbase/{pkgbase.Name}/request" data = { "type": "orphan", "comments": "Test request.", } with client as request: resp = request.post(endpoint, data=data, cookies=auser.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) pkgreq = pkgbase.requests.first() assert pkgreq is not None assert pkgreq.ReqTypeID == ORPHAN_ID # A Request(Open|Close)Notification should've been sent out. assert Email.count() == 2 # Check the first email; should be our open request. email = Email(1) expr = r"^\[PRQ#%d\] Orphan Request for [^ ]+$" % pkgreq.ID assert re.match(expr, email.headers.get("Subject")) # And the second should be the automated closure. email = Email(2) expr = r"^\[PRQ#%d\] Orphan Request for [^ ]+ Accepted$" % pkgreq.ID assert re.match(expr, email.headers.get("Subject")) # Check logs. expr = r"New request #\d+ is marked for auto-orphan." assert re.search(expr, caplog.text)
def test_orphan_request(client: TestClient, user: User, tu_user: User, pkgbase: PackageBase, pkgreq: PackageRequest): """ Test the standard orphan request route. """ user2 = create_user("user2", "*****@*****.**") with db.begin(): db.create(PackageComaintainer, User=user2, PackageBase=pkgbase, Priority=1) idle_time = config.getint("options", "request_idle_time") now = time.utcnow() with db.begin(): pkgreq.ReqTypeID = ORPHAN_ID # Set the request time so it's seen as due (idle_time has passed). pkgreq.RequestTS = now - idle_time - 10 endpoint = f"/pkgbase/{pkgbase.Name}/disown" comments = "Test orphan closure." data = {"comments": comments, "confirm": True} with client as request: resp = request.post(endpoint, data=data, cookies=tu_user.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) assert resp.headers.get("location") == f"/pkgbase/{pkgbase.Name}" # We should have unset the maintainer. assert pkgbase.Maintainer is None # We should have removed the comaintainers. assert not pkgbase.comaintainers.all() # Ensure that `pkgreq`.ClosureComment was left alone when specified. assert pkgreq.ClosureComment == comments # Check the email we expect. assert Email.count() == 1 email = Email(1).parse() subj = r"^\[PRQ#%d\] Orphan Request for [^ ]+ Accepted$" % pkgreq.ID assert re.match(subj, email.headers.get("Subject"))
def test_deletion_request(client: TestClient, user: User, tu_user: User, pkgbase: PackageBase, pkgreq: PackageRequest): """ Test deleting a package with a preexisting request. """ # `pkgreq`.ReqTypeID is already DELETION_ID. create_request(DELETION_ID, user, pkgbase, "Other request.") # Create a notification record for another user. They should then # also receive a DeleteNotification. user2 = create_user("test2", "*****@*****.**") create_notification(user2, pkgbase) endpoint = f"/pkgbase/{pkgbase.Name}/delete" comments = "Test closure." data = {"comments": comments, "confirm": True} with client as request: resp = request.post(endpoint, data=data, cookies=tu_user.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) assert resp.headers.get("location") == "/packages" # Ensure that `pkgreq`.ClosureComment was left alone when specified. assert pkgreq.ClosureComment == comments # We should've gotten three emails. Two accepted requests and # a DeleteNotification. assert Email.count() == 3 # Both requests should have gotten accepted and had a notification # sent out for them. for i in range(Email.count() - 1): email = Email(i + 1).parse() expr = r"^\[PRQ#\d+\] Deletion Request for [^ ]+ Accepted$" assert re.match(expr, email.headers.get("Subject")) # We should've also had a DeleteNotification sent out. email = Email(3).parse() subject = r"^AUR Package deleted: [^ ]+$" assert re.match(subject, email.headers.get("Subject")) body = r"%s [1] deleted %s [2]." % (tu_user.Username, pkgbase.Name) assert body in email.body
def test_merge(user: User, user2: User, pkgbases: List[PackageBase]): source, target = pkgbases[:2] notif = notify.DeleteNotification(user2.ID, source.ID, target.ID) notif.send() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == user.Email expected = f"AUR Package deleted: {source.Name}" assert email.headers.get("Subject") == expected expected = f"""\ {user2.Username} [1] merged {source.Name} [2] into {target.Name} [3]. -- If you no longer wish receive notifications about the new package, please go to [3] and click "Disable notifications". [1] {aur_location}/account/{user2.Username}/ [2] {aur_location}/pkgbase/{source.Name}/ [3] {aur_location}/pkgbase/{target.Name}/\ """ assert email.body == expected
def test_orphan_without_requests(client: TestClient, tu_user: User, pkgbase: PackageBase): """ Test orphans are automatically accepted past a certain date. """ endpoint = f"/pkgbase/{pkgbase.Name}/disown" data = {"confirm": True} with client as request: resp = request.post(endpoint, data=data, cookies=tu_user.cookies) assert resp.status_code == int(HTTPStatus.BAD_REQUEST) errors = get_errors(resp.text) expected = r"^No due existing orphan requests to accept for .+\.$" assert re.match(expected, errors[0].text.strip()) assert Email.count() == 0
def test_notify_main(user: User): """ Test TU vote reminder through aurweb.notify.main(). """ set_tu([user]) vote_id = 1 args = ["aurweb-notify", "tu-vote-reminder", str(vote_id)] with mock.patch("sys.argv", args): notify.main() assert Email.count() == 1 email = Email(1).parse() assert email.headers.get("To") == user.Email expected = f"TU Vote Reminder: Proposal {vote_id}" assert email.headers.get("Subject") == expected expected = f"""\ Please remember to cast your vote on proposal {vote_id} [1]. The voting period ends in less than 48 hours. [1] {aur_location}/tu/?id={vote_id}\ """ assert email.body == expected
def test_merge_autorequest(client: TestClient, user: User, tu_user: User, pkgbase: PackageBase, target: PackageBase): """ Test merging a package without a request. """ with db.begin(): pkgreq.ReqTypeID = MERGE_ID pkgreq.MergeBaseName = target.Name # `pkgreq`.ReqTypeID is already DELETION_ID. endpoint = f"/pkgbase/{pkgbase.Name}/merge" data = {"into": target.Name, "confirm": True} with client as request: resp = request.post(endpoint, data=data, cookies=tu_user.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) assert resp.headers.get("location") == f"/pkgbase/{target.Name}" # Should've gotten one email; an [Autogenerated] one. assert Email.count() == 1 # Test accepted merge request notification. email = Email(1).parse() subj = r"^\[PRQ#\d+\] Merge Request for [^ ]+ Accepted$" assert re.match(subj, email.headers.get("Subject")) assert "[Autogenerated]" in email.body
def test_request_post_merge(client: TestClient, auser: User, pkgbase: PackageBase, target: PackageBase): """ Test the request route for merge as maintainer. """ endpoint = f"/pkgbase/{pkgbase.Name}/request" data = { "type": "merge", "merge_into": target.Name, "comments": "Test request.", } with client as request: resp = request.post(endpoint, data=data, cookies=auser.cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) pkgreq = pkgbase.requests.first() assert pkgreq is not None assert pkgreq.ReqTypeID == MERGE_ID assert pkgreq.Status == PENDING_ID assert pkgreq.MergeBaseName == target.Name # A RequestOpenNotification should've been sent out. assert Email.count() == 1 email = Email(1) expr = r"^\[PRQ#%d\] Merge Request for [^ ]+$" % pkgreq.ID assert re.match(expr, email.headers.get("Subject"))