diff --git a/swh/web/api/apiresponse.py b/swh/web/api/apiresponse.py --- a/swh/web/api/apiresponse.py +++ b/swh/web/api/apiresponse.py @@ -13,7 +13,7 @@ from swh.storage.exc import StorageDBError, StorageAPIError from swh.web.api import utils -from swh.web.common.exc import NotFoundExc, ForbiddenExc +from swh.web.common.exc import NotFoundExc, ForbiddenExc, BadInputExc from swh.web.common.utils import shorten_path, gen_path_info from swh.web.config import get_config @@ -164,8 +164,10 @@ doc_data: documentation data for HTML response """ - error_code = 400 - if isinstance(error, NotFoundExc): + error_code = 500 + if isinstance(error, BadInputExc): + error_code = 400 + elif isinstance(error, NotFoundExc): error_code = 404 elif isinstance(error, ForbiddenExc): error_code = 403 diff --git a/swh/web/tests/api/test_apidoc.py b/swh/web/tests/api/test_apidoc.py --- a/swh/web/tests/api/test_apidoc.py +++ b/swh/web/tests/api/test_apidoc.py @@ -6,8 +6,11 @@ from rest_framework.test import APITestCase from rest_framework.response import Response +from swh.storage.exc import StorageDBError, StorageAPIError + from swh.web.api.apidoc import api_doc, _parse_httpdomain_doc from swh.web.api.apiurls import api_route +from swh.web.common.exc import BadInputExc, ForbiddenExc, NotFoundExc from swh.web.tests.testcase import WebTestCase # flake8: noqa @@ -58,6 +61,15 @@ class APIDocTestCase(WebTestCase, APITestCase): + exception_http_code = { + BadInputExc: 400, + ForbiddenExc: 403, + NotFoundExc: 404, + Exception: 500, + StorageAPIError: 503, + StorageDBError: 503, + } + def test_apidoc_nodoc_failure(self): with self.assertRaises(Exception): @api_doc('/my/nodoc/url/') @@ -90,6 +102,26 @@ # then self.assertEqual(rv.status_code, 200, rv.data) + @staticmethod + @api_route(r'/test/error/(?P.+)/', + 'test-error') + @api_doc('/test/error/') + def apidoc_test_error_route(request, exc_name): + """ + Sample doc + """ + for e in APIDocTestCase.exception_http_code.keys(): + if e.__name__ == exc_name: + raise e('Error') + + def test_apidoc_error(self): + for exc, code in self.exception_http_code.items(): + # when + rv = self.client.get('/api/1/test/error/%s/' % exc.__name__) + + # then + self.assertEqual(rv.status_code, code) + @staticmethod @api_route(r'/some/full/(?P[0-9]+)/(?P[0-9]+)/', 'some-complete-doc-route') diff --git a/swh/web/tests/api/views/test_origin.py b/swh/web/tests/api/views/test_origin.py --- a/swh/web/tests/api/views/test_origin.py +++ b/swh/web/tests/api/views/test_origin.py @@ -12,6 +12,7 @@ from swh.storage.exc import StorageDBError, StorageAPIError +from swh.web.common.exc import BadInputExc from swh.web.common.utils import reverse from swh.web.common.origin_visits import get_origin_visits from swh.web.tests.strategies import ( @@ -55,7 +56,7 @@ err_msg = 'voluntary error to check the bad request middleware.' - mock_get_origin_visits.side_effect = ValueError(err_msg) + mock_get_origin_visits.side_effect = BadInputExc(err_msg) url = reverse( 'api-1-origin-visits', url_args={'origin_url': 'http://foo'}) @@ -64,7 +65,7 @@ self.assertEqual(rv.status_code, 400, rv.data) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { - 'exception': 'ValueError', + 'exception': 'BadInputExc', 'reason': err_msg}) @patch('swh.web.api.views.origin.get_origin_visits') diff --git a/swh/web/tests/api/views/test_stat.py b/swh/web/tests/api/views/test_stat.py --- a/swh/web/tests/api/views/test_stat.py +++ b/swh/web/tests/api/views/test_stat.py @@ -8,6 +8,7 @@ from swh.storage.exc import StorageDBError, StorageAPIError +from swh.web.common.exc import BadInputExc from swh.web.common.utils import reverse from swh.web.tests.testcase import WebTestCase @@ -16,7 +17,7 @@ @patch('swh.web.api.views.stat.service') def test_api_1_stat_counters_raise_error(self, mock_service): - mock_service.stat_counters.side_effect = ValueError( + mock_service.stat_counters.side_effect = BadInputExc( 'voluntary error to check the bad request middleware.') url = reverse('api-1-stat-counters') @@ -25,7 +26,7 @@ self.assertEqual(rv.status_code, 400, rv.data) self.assertEqual(rv['Content-Type'], 'application/json') self.assertEqual(rv.data, { - 'exception': 'ValueError', + 'exception': 'BadInputExc', 'reason': 'voluntary error to check the bad request middleware.'}) @patch('swh.web.api.views.stat.service')