From f5dcf60561703086a070a2b59ad3918df68cbd0e Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Wed, 19 Sep 2018 17:35:20 +0200 Subject: [PATCH] Fix and test anonymous error reports Fixes https://github.com/galaxyproject/galaxy/issues/6675 --- lib/galaxy/webapps/galaxy/api/jobs.py | 15 ++++++++---- test/api/test_jobs.py | 34 +++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/lib/galaxy/webapps/galaxy/api/jobs.py b/lib/galaxy/webapps/galaxy/api/jobs.py index 8b534c2b0ae..8692ce47137 100644 --- a/lib/galaxy/webapps/galaxy/api/jobs.py +++ b/lib/galaxy/webapps/galaxy/api/jobs.py @@ -320,7 +320,7 @@ class JobController(BaseAPIController, UsesLibraryMixinItems): jobs.append(job) return [self.encode_all_ids(trans, single_job.to_dict('element'), True) for single_job in jobs] - @expose_api + @expose_api_anonymous def error(self, trans, id, **kwd): """ error( trans, id ) @@ -343,10 +343,17 @@ class JobController(BaseAPIController, UsesLibraryMixinItems): # Get job job = self.__get_job(trans, id) tool = trans.app.toolbox.get_tool(job.tool_id, tool_version=job.tool_version) or None + email = kwd.get('email') + if not email and not trans.anonymous: + email = trans.user.email messages = trans.app.error_reports.default_error_plugin.submit_report( - dataset, job, tool, user_submission=True, user=trans.user, - email=kwd.get('email', trans.user.email), - message=kwd.get('message', None) + dataset=dataset, + job=job, + tool=tool, + user_submission=True, + user=trans.user, + email=email, + message=kwd.get('message') ) return {'messages': messages} diff --git a/test/api/test_jobs.py b/test/api/test_jobs.py index f876571725d..5534cbec428 100644 --- a/test/api/test_jobs.py +++ b/test/api/test_jobs.py @@ -4,13 +4,14 @@ import os import time from operator import itemgetter -from requests import put +import requests from base import api # noqa: I100,I202 from base.api_asserts import assert_status_code_is_ok # noqa: I100 from base.populators import ( # noqa: I100 DatasetCollectionPopulator, DatasetPopulator, + skip_without_tool, wait_on, wait_on_state, ) @@ -131,6 +132,35 @@ class JobsApiTestCase(api.ApiTestCase): show_jobs_response = self._get("jobs/%s" % job_id, admin=True) self._assert_has_keys(show_jobs_response.json(), "command_line", "external_id") + @skip_without_tool('detect_errors_aggressive') + def test_report_error(self): + with self.dataset_populator.test_history() as history_id: + payload = self.dataset_populator.run_tool_payload( + tool_id='detect_errors_aggressive', + inputs={'error_bool': 'true'}, + history_id=history_id, + ) + run_response = self._post("tools", data=payload).json() + job_id = run_response['jobs'][0]["id"] + dataset_id = run_response['outputs'][0]['id'] + response = self._post('jobs/%s/error' % job_id, + data={'dataset_id': dataset_id}) + assert response.status_code == 200 + + @skip_without_tool('detect_errors_aggressive') + def test_report_error_anon(self): + # Need to get a cookie and use that for anonymous tool runs + cookies = requests.get(self.galaxy_interactor.api_url.rsplit('/api', 1)[0]).cookies + payload = json.dumps({"tool_id": "detect_errors_aggressive", + "inputs": {"error_bool": "true"}}) + run_response = requests.post("%s/tools" % self.galaxy_interactor.api_url, data=payload, cookies=cookies).json() + job_id = run_response['jobs'][0]["id"] + dataset_id = run_response['outputs'][0]['id'] + response = requests.post('%s/jobs/%s/error' % (self.galaxy_interactor.api_url, job_id), + params={'email': 'someone@domain.com', 'dataset_id': dataset_id}, + cookies=cookies) + assert response.status_code == 200 + def test_deleting_output_keep_running_until_all_deleted(self): history_id, job_state, outputs = self._setup_running_two_output_job(120) @@ -263,7 +293,7 @@ class JobsApiTestCase(api.ApiTestCase): def _raw_update_history_item(self, history_id, item_id, data): update_url = self._api_url("histories/%s/contents/%s" % (history_id, item_id), use_key=True) - update_response = put(update_url, json=data) + update_response = requests.put(update_url, json=data) assert_status_code_is_ok(update_response) return update_response