forked from galaxyproject/galaxy
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Unit test for email error reporting.
- Loading branch information
Showing
4 changed files
with
146 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
import json | ||
|
||
from galaxy import model | ||
from galaxy.app_unittest_utils.tools_support import UsesApp | ||
from galaxy.model.base import transaction | ||
from galaxy.tools.errors import EmailErrorReporter | ||
from galaxy.util.unittest import TestCase | ||
|
||
# The email the user created their account with. | ||
TEST_USER_EMAIL = "[email protected]" | ||
# The email the user supplied when submitting the error | ||
TEST_USER_SUPPLIED_EMAIL = "[email protected]" | ||
TEST_SERVER_EMAIL_FROM = "[email protected]" | ||
TEST_SERVER_ERROR_EMAIL_TO = "[email protected]" # setup in mock config | ||
|
||
|
||
class TestErrorReporter(TestCase, UsesApp): | ||
|
||
def setUp(self): | ||
self.setup_app() | ||
self.app.config.email_from = TEST_SERVER_EMAIL_FROM | ||
|
||
def test_basic(self, tmp_path): | ||
email_path = tmp_path / "moo.json" | ||
self.app.config.smtp_server = f"mock_emails_to_path://{email_path}" | ||
user, hda = self._setup_model_objects() | ||
|
||
assert not email_path.exists() | ||
error_report = EmailErrorReporter(hda, self.app) | ||
error_report.send_report(user, email=TEST_USER_SUPPLIED_EMAIL, message="My custom message") | ||
assert email_path.exists() | ||
text = email_path.read_text() | ||
email_json = json.loads(text) | ||
assert email_json["from"] == TEST_SERVER_EMAIL_FROM | ||
assert email_json["to"] == f"{TEST_SERVER_ERROR_EMAIL_TO}, {TEST_USER_SUPPLIED_EMAIL}" | ||
assert f"Galaxy tool error report from {TEST_USER_SUPPLIED_EMAIL}" == email_json["subject"] | ||
assert "cat1" in email_json["body"] | ||
assert "cat1" in email_json["html"] | ||
assert TEST_USER_EMAIL == email_json["reply_to"] | ||
|
||
def test_hda_security(self, tmp_path): | ||
email_path = tmp_path / "moo.json" | ||
self.app.config.smtp_server = f"mock_emails_to_path://{email_path}" | ||
user, hda = self._setup_model_objects() | ||
error_report = EmailErrorReporter(hda, self.app) | ||
security_agent = self.app.security_agent | ||
private_role = security_agent.create_private_user_role(user) | ||
access_action = security_agent.permitted_actions.DATASET_ACCESS.action | ||
manage_action = security_agent.permitted_actions.DATASET_MANAGE_PERMISSIONS.action | ||
permissions = {access_action: [private_role], manage_action: [private_role]} | ||
security_agent.set_all_dataset_permissions(hda.dataset, permissions) | ||
|
||
other_user = model.User(email="[email protected]", password="mockpass2") | ||
self._commit_objects([other_user]) | ||
security_agent = self.app.security_agent | ||
assert not email_path.exists() | ||
error_report.send_report(other_user, email=TEST_USER_SUPPLIED_EMAIL, message="My custom message") | ||
# Without permissions, the email still gets sent but the supplied email is ignored | ||
# I'm not saying this is the right behavior but it is what the code does at the time of test | ||
# writing -John | ||
assert email_path.exists() | ||
text = email_path.read_text() | ||
email_json = json.loads(text) | ||
assert "[email protected]" not in email_json["to"] | ||
|
||
def test_html_sanitization(self, tmp_path): | ||
email_path = tmp_path / "moo.json" | ||
self.app.config.smtp_server = f"mock_emails_to_path://{email_path}" | ||
user, hda = self._setup_model_objects() | ||
|
||
assert not email_path.exists() | ||
error_report = EmailErrorReporter(hda, self.app) | ||
error_report.send_report( | ||
user, email=TEST_USER_SUPPLIED_EMAIL, message='My custom <a href="http://sneaky.com/">message</a>' | ||
) | ||
assert email_path.exists() | ||
text = email_path.read_text() | ||
email_json = json.loads(text) | ||
html = email_json["html"] | ||
assert "<a href="http://sneaky.com/">message</a>" in html | ||
|
||
def test_redact_user_details_in_bugreport(self, tmp_path): | ||
email_path = tmp_path / "moo.json" | ||
self.app.config.smtp_server = f"mock_emails_to_path://{email_path}" | ||
user, hda = self._setup_model_objects() | ||
|
||
assert not email_path.exists() | ||
error_report = EmailErrorReporter(hda, self.app) | ||
error_report.send_report( | ||
user, email=TEST_USER_SUPPLIED_EMAIL, message="My custom message", redact_user_details_in_bugreport=True | ||
) | ||
assert email_path.exists() | ||
text = email_path.read_text() | ||
email_json = json.loads(text) | ||
assert "The user redacted (user: 1) provided the following information:" in email_json["body"] | ||
assert ( | ||
"""The user <span style="font-family: monospace;">redacted (user: 1)</span> provided the following information:""" | ||
in email_json["html"] | ||
) | ||
|
||
def test_no_redact_user_details_in_bugreport(self, tmp_path): | ||
email_path = tmp_path / "moo.json" | ||
self.app.config.smtp_server = f"mock_emails_to_path://{email_path}" | ||
user, hda = self._setup_model_objects() | ||
|
||
assert not email_path.exists() | ||
error_report = EmailErrorReporter(hda, self.app) | ||
error_report.send_report( | ||
user, email=TEST_USER_SUPPLIED_EMAIL, message="My custom message", redact_user_details_in_bugreport=False | ||
) | ||
assert email_path.exists() | ||
text = email_path.read_text() | ||
email_json = json.loads(text) | ||
assert ( | ||
f"The user '{TEST_USER_EMAIL}' (providing preferred contact email '{TEST_USER_SUPPLIED_EMAIL}') provided the following information:" | ||
in email_json["body"] | ||
) | ||
assert ( | ||
f"""The user <span style="font-family: monospace;">'{TEST_USER_EMAIL}' (providing preferred contact email '{TEST_USER_SUPPLIED_EMAIL}')</span> provided the following information:""" | ||
in email_json["html"] | ||
) | ||
|
||
def _setup_model_objects(self): | ||
user = model.User(email=TEST_USER_EMAIL, password="mockpass") | ||
job = model.Job() | ||
job.tool_id = "cat1" | ||
job.history = model.History() | ||
job.user = user | ||
job.history.user = user | ||
hda = model.HistoryDatasetAssociation(history=job.history) | ||
hda.dataset = model.Dataset() | ||
hda.dataset.state = "ok" | ||
job.add_output_dataset("out1", hda) | ||
self._commit_objects([job, hda, user]) | ||
return user, hda | ||
|
||
def _commit_objects(self, objects): | ||
session = self.app.model.context | ||
session.add_all(objects) | ||
with transaction(session): | ||
session.commit() |