diff --git a/lms/djangoapps/commerce/http.py b/lms/djangoapps/commerce/http.py index 443703a51f..262107868d 100644 --- a/lms/djangoapps/commerce/http.py +++ b/lms/djangoapps/commerce/http.py @@ -1,6 +1,6 @@ """ 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 @@ -13,9 +13,13 @@ class DetailResponse(JsonResponse): super(DetailResponse, self).__init__(object=data, status=status) -class ApiErrorResponse(DetailResponse): - """ Response returned when calls to the E-Commerce API fail or the returned data is invalid. """ +class InternalRequestErrorResponse(DetailResponse): + """ Response returned when an internal service request fails. """ - def __init__(self): - message = 'Call to E-Commerce API failed. Order creation failed.' - super(ApiErrorResponse, self).__init__(message=message, status=HTTP_503_SERVICE_UNAVAILABLE) + def __init__(self, internal_message, internal_status): + message = ( + '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) diff --git a/lms/djangoapps/commerce/tests/test_views.py b/lms/djangoapps/commerce/tests/test_views.py index 434178bea8..ab918b2776 100644 --- a/lms/djangoapps/commerce/tests/test_views.py +++ b/lms/djangoapps/commerce/tests/test_views.py @@ -48,10 +48,12 @@ class OrdersViewTests(EnrollmentEventTestMixin, EcommerceApiTestMixin, ModuleSto actual = json.loads(response.content)['detail'] 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. """ - self.assertEqual(response.status_code, 503) - self.assertResponseMessage(response, 'Call to E-Commerce API failed. Order creation failed.') + self.assertEqual(response.status_code, 500) + actual = json.loads(response.content)['detail'] + self.assertIn('Call to E-Commerce API failed', actual) + self.assertIn(str(internal_status), actual) def assertUserNotEnrolled(self): """ 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 with self.mock_create_order(side_effect=TimeoutError): response = self._post_to_view() - self.assertValidEcommerceApiErrorResponse(response) + self.assertValidEcommerceInternalRequestErrorResponse(response, 408) self.assertUserNotEnrolled() def test_ecommerce_api_error(self): @@ -122,7 +124,7 @@ class OrdersViewTests(EnrollmentEventTestMixin, EcommerceApiTestMixin, ModuleSto with self.mock_create_order(side_effect=ApiError): response = self._post_to_view() - self.assertValidEcommerceApiErrorResponse(response) + self.assertValidEcommerceInternalRequestErrorResponse(response, 500) self.assertUserNotEnrolled() def _test_successful_ecommerce_api_call(self):