Commit 7af1ee3e by Stephen Sanchez

Change error handling to report back internal errors.

parent 30058b91
""" HTTP-related entities. """ """ HTTP-related entities. """
from rest_framework.status import HTTP_503_SERVICE_UNAVAILABLE, HTTP_200_OK from rest_framework.status import HTTP_500_INTERNAL_SERVER_ERROR, HTTP_200_OK
from util.json_request import JsonResponse from util.json_request import JsonResponse
...@@ -13,9 +13,13 @@ class DetailResponse(JsonResponse): ...@@ -13,9 +13,13 @@ class DetailResponse(JsonResponse):
super(DetailResponse, self).__init__(object=data, status=status) super(DetailResponse, self).__init__(object=data, status=status)
class ApiErrorResponse(DetailResponse): class InternalRequestErrorResponse(DetailResponse):
""" Response returned when calls to the E-Commerce API fail or the returned data is invalid. """ """ Response returned when an internal service request fails. """
def __init__(self): def __init__(self, internal_message, internal_status):
message = 'Call to E-Commerce API failed. Order creation failed.' message = (
super(ApiErrorResponse, self).__init__(message=message, status=HTTP_503_SERVICE_UNAVAILABLE) 'Call to E-Commerce API failed. Internal Request Status Code: '
'[{internal_status}], Internal Service Message: [{internal_message}]'
.format(internal_status=internal_status, internal_message=internal_message)
)
super(InternalRequestErrorResponse, self).__init__(message=message, status=HTTP_500_INTERNAL_SERVER_ERROR)
...@@ -48,10 +48,12 @@ class OrdersViewTests(EnrollmentEventTestMixin, EcommerceApiTestMixin, ModuleSto ...@@ -48,10 +48,12 @@ class OrdersViewTests(EnrollmentEventTestMixin, EcommerceApiTestMixin, ModuleSto
actual = json.loads(response.content)['detail'] actual = json.loads(response.content)['detail']
self.assertEqual(actual, expected_msg) self.assertEqual(actual, expected_msg)
def assertValidEcommerceApiErrorResponse(self, response): def assertValidEcommerceInternalRequestErrorResponse(self, response, internal_status):
""" Asserts the response is a valid response sent when the E-Commerce API is unavailable. """ """ Asserts the response is a valid response sent when the E-Commerce API is unavailable. """
self.assertEqual(response.status_code, 503) self.assertEqual(response.status_code, 500)
self.assertResponseMessage(response, 'Call to E-Commerce API failed. Order creation failed.') actual = json.loads(response.content)['detail']
self.assertIn('Call to E-Commerce API failed', actual)
self.assertIn(str(internal_status), actual)
def assertUserNotEnrolled(self): def assertUserNotEnrolled(self):
""" Asserts that the user is NOT enrolled in the course, and that an enrollment event was NOT fired. """ """ Asserts that the user is NOT enrolled in the course, and that an enrollment event was NOT fired. """
...@@ -112,7 +114,7 @@ class OrdersViewTests(EnrollmentEventTestMixin, EcommerceApiTestMixin, ModuleSto ...@@ -112,7 +114,7 @@ class OrdersViewTests(EnrollmentEventTestMixin, EcommerceApiTestMixin, ModuleSto
with self.mock_create_order(side_effect=TimeoutError): with self.mock_create_order(side_effect=TimeoutError):
response = self._post_to_view() response = self._post_to_view()
self.assertValidEcommerceApiErrorResponse(response) self.assertValidEcommerceInternalRequestErrorResponse(response, 408)
self.assertUserNotEnrolled() self.assertUserNotEnrolled()
def test_ecommerce_api_error(self): def test_ecommerce_api_error(self):
...@@ -122,7 +124,7 @@ class OrdersViewTests(EnrollmentEventTestMixin, EcommerceApiTestMixin, ModuleSto ...@@ -122,7 +124,7 @@ class OrdersViewTests(EnrollmentEventTestMixin, EcommerceApiTestMixin, ModuleSto
with self.mock_create_order(side_effect=ApiError): with self.mock_create_order(side_effect=ApiError):
response = self._post_to_view() response = self._post_to_view()
self.assertValidEcommerceApiErrorResponse(response) self.assertValidEcommerceInternalRequestErrorResponse(response, 500)
self.assertUserNotEnrolled() self.assertUserNotEnrolled()
def _test_successful_ecommerce_api_call(self): def _test_successful_ecommerce_api_call(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment