diff --git a/lms/djangoapps/support/tests/test_views.py b/lms/djangoapps/support/tests/test_views.py index 5b8cd8895d..9bc8111e0b 100644 --- a/lms/djangoapps/support/tests/test_views.py +++ b/lms/djangoapps/support/tests/test_views.py @@ -21,6 +21,7 @@ from social_django.models import UserSocialAuth from common.djangoapps.course_modes.models import CourseMode from common.djangoapps.course_modes.tests.factories import CourseModeFactory +from common.djangoapps.entitlements.tests.factories import CourseEntitlementFactory from common.djangoapps.student.models import ( ENROLLED_TO_ENROLLED, CourseEnrollment, @@ -320,6 +321,39 @@ class SupportViewEnrollmentsTests(SharedModuleStoreTestCase, SupportViewTestCase assert ManualEnrollmentAudit.get_manual_enrollment_by_email(self.student.email) is not None self.assert_enrollment(CourseMode.VERIFIED) + @disable_signal(signals, 'post_save') + @ddt.data('username', 'email') + @patch("common.djangoapps.entitlements.models.get_course_uuid_for_course") + def test_change_enrollment_mode_fullfills_entitlement(self, search_string_type, mock_get_course_uuid): + """ + Assert that changing student's enrollment fulfills it's respective entitlement if it exists. + """ + assert ManualEnrollmentAudit.get_manual_enrollment_by_email(self.student.email) is None + enrollment = CourseEnrollment.get_enrollment(self.student, self.course.id) + entitlement = CourseEntitlementFactory.create( + user=self.user, + mode=CourseMode.VERIFIED, + enrollment_course_run=enrollment + ) + mock_get_course_uuid.return_value = entitlement.course_uuid + + url = reverse( + 'support:enrollment_list', + kwargs={'username_or_email': getattr(self.student, search_string_type)} + ) + response = self.client.post(url, data={ + 'course_id': str(self.course.id), + 'old_mode': CourseMode.AUDIT, + 'new_mode': CourseMode.VERIFIED, + 'reason': 'Financial Assistance' + }) + entitlement.refresh_from_db() + assert response.status_code == 200 + assert ManualEnrollmentAudit.get_manual_enrollment_by_email(self.student.email) is not None + assert entitlement.enrollment_course_run is not None + assert entitlement.is_entitlement_redeemable() is False + self.assert_enrollment(CourseMode.VERIFIED) + @ddt.data( ({}, r"The field \w+ is required."), ({'course_id': 'bad course key'}, 'Could not parse course key.'), diff --git a/lms/djangoapps/support/views/enrollments.py b/lms/djangoapps/support/views/enrollments.py index 8e2af1072e..92b9e58594 100644 --- a/lms/djangoapps/support/views/enrollments.py +++ b/lms/djangoapps/support/views/enrollments.py @@ -22,6 +22,7 @@ from common.djangoapps.student.models import ( ManualEnrollmentAudit ) from common.djangoapps.util.json_request import JsonResponse +from common.djangoapps.entitlements.models import CourseEntitlement from lms.djangoapps.support.decorators import require_support_permission from lms.djangoapps.support.serializers import ManualEnrollmentSerializer from lms.djangoapps.verify_student.models import VerificationDeadline @@ -130,6 +131,11 @@ class EnrollmentSupportListView(GenericAPIView): CourseEnrollmentAttribute.add_enrollment_attr( enrollment=enrollment, data_list=[credit_provider_attr] ) + entitlement = CourseEntitlement.get_fulfillable_entitlement_for_user_course_run( + user=user, course_run_key=course_id + ) + if entitlement is not None and entitlement.mode == new_mode: + entitlement.set_enrollment(CourseEnrollment.get_enrollment(user, course_id)) return JsonResponse(ManualEnrollmentSerializer(instance=manual_enrollment).data) except CourseModeNotFoundError as err: return HttpResponseBadRequest(str(err))