diff --git a/common/djangoapps/entitlements/api/v1/tests/test_views.py b/common/djangoapps/entitlements/api/v1/tests/test_views.py index e508fbffed..44b5086b33 100644 --- a/common/djangoapps/entitlements/api/v1/tests/test_views.py +++ b/common/djangoapps/entitlements/api/v1/tests/test_views.py @@ -475,3 +475,51 @@ class EntitlementEnrollmentViewSetTest(ModuleStoreTestCase): assert not CourseEnrollment.is_enrolled(self.user, self.course.id) assert course_entitlement.enrollment_course_run is None assert course_entitlement.expired_at is not None + + @patch('entitlements.api.v1.views.CourseEntitlement.is_entitlement_refundable', return_value=False) + @patch('lms.djangoapps.commerce.signals.refund_entitlement', return_value=[1]) + @patch("entitlements.api.v1.views.get_course_runs_for_course") + def test_user_can_revoke_and_no_refund_available( + self, + mock_get_course_runs, + mock_refund_entitlement, + mock_is_refundable + ): + course_entitlement = CourseEntitlementFactory.create(user=self.user) + mock_get_course_runs.return_value = self.return_values + + url = reverse( + self.ENTITLEMENTS_ENROLLMENT_NAMESPACE, + args=[str(course_entitlement.uuid)] + ) + assert course_entitlement.enrollment_course_run is None + + data = { + 'course_run_id': str(self.course.id) + } + response = self.client.post( + url, + data=json.dumps(data), + content_type='application/json', + ) + course_entitlement.refresh_from_db() + + assert response.status_code == 201 + assert CourseEnrollment.is_enrolled(self.user, self.course.id) + + # Unenroll with Revoke for refund + with patch('lms.djangoapps.commerce.signals.handle_refund_entitlement') as mock_refund_handler: + REFUND_ENTITLEMENT.connect(mock_refund_handler) + + revoke_url = url + '?is_refund=true' + response = self.client.delete( + revoke_url, + content_type='application/json', + ) + assert response.status_code == 400 + + course_entitlement.refresh_from_db() + assert not mock_refund_handler.called + assert CourseEnrollment.is_enrolled(self.user, self.course.id) + assert course_entitlement.enrollment_course_run is not None + assert course_entitlement.expired_at is None diff --git a/common/djangoapps/entitlements/api/v1/views.py b/common/djangoapps/entitlements/api/v1/views.py index 8b41b891f9..0858fdfbee 100644 --- a/common/djangoapps/entitlements/api/v1/views.py +++ b/common/djangoapps/entitlements/api/v1/views.py @@ -262,7 +262,7 @@ class EntitlementEnrollmentViewSet(viewsets.GenericViewSet): If is_refund parameter is provided then unenroll the user, set Entitlement expiration, and issue a refund """ - is_refund = True if request.query_params.get('is_refund', 'false') == 'true' else False + is_refund = request.query_params.get('is_refund', 'false') == 'true' # Retrieve the entitlement for the UUID belongs to the current user. try: @@ -310,5 +310,10 @@ class EntitlementEnrollmentViewSet(viewsets.GenericViewSet): 'Entitlement Refund failed for Course Entitlement [%s]. Entitlement is not refundable', str(entitlement.uuid) ) + return Response( + status=status.HTTP_400_BAD_REQUEST, + data={ + 'message': 'Entitlement refund failed, Entitlement is not refundable' + }) return Response(status=status.HTTP_204_NO_CONTENT)