Skip to content

Commit 645cd49

Browse files
Deactivate audit enrollment before deferral (#2664)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 548ba3f commit 645cd49

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

courses/api.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@
2323
from rest_framework.status import HTTP_404_NOT_FOUND
2424

2525
from courses import mail_api
26-
from courses.constants import ENROLL_CHANGE_STATUS_DEFERRED, PROGRAM_TEXT_ID_PREFIX
26+
from courses.constants import (
27+
ENROLL_CHANGE_STATUS_DEFERRED,
28+
ENROLL_CHANGE_STATUS_UNENROLLED,
29+
PROGRAM_TEXT_ID_PREFIX,
30+
)
2731
from courses.models import (
2832
Course,
2933
CourseRun,
@@ -401,6 +405,22 @@ def defer_enrollment( # noqa: C901
401405
if to_enrollments:
402406
return from_enrollment, to_enrollments
403407

408+
# Deactivate an existing audit enrollment before enrolling in verified
409+
# this way we enroll in verified even if the upgrade deadline is in the past
410+
to_enrollments = CourseRunEnrollment.objects.filter(
411+
user=user, run=to_run, enrollment_mode=EDX_ENROLLMENT_AUDIT_MODE
412+
).first()
413+
if to_enrollments:
414+
to_enrollments = deactivate_run_enrollment(
415+
to_enrollments,
416+
change_status=ENROLL_CHANGE_STATUS_UNENROLLED,
417+
keep_failed_enrollments=keep_failed_enrollments,
418+
)
419+
if to_enrollments is None or to_enrollments.edx_enrolled is True:
420+
raise Exception( # noqa: TRY002
421+
f"Failed to deactivate audit enrollment for course run '{to_run}'" # noqa: EM102
422+
)
423+
404424
to_enrollments, enroll_success = create_run_enrollments(
405425
user=user,
406426
runs=[to_run],

courses/api_test.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -523,12 +523,14 @@ def test_deactivate_run_enrollment_line_does_not_exist(
523523
@pytest.mark.parametrize("keep_failed_enrollments", [True, False])
524524
@pytest.mark.parametrize("edx_enroll_succeeds", [True, False])
525525
@pytest.mark.parametrize("edx_downgrade_succeeds", [True, False])
526-
def test_defer_enrollment(
526+
@pytest.mark.parametrize("has_audit_enrollment_already", [True, False])
527+
def test_defer_enrollment( # noqa: PLR0913
527528
mocker,
528529
course,
529530
keep_failed_enrollments,
530531
edx_enroll_succeeds,
531532
edx_downgrade_succeeds,
533+
has_audit_enrollment_already,
532534
):
533535
"""
534536
defer_enrollment should downgrade current enrollment to audit and create a verified enrollment in another
@@ -542,14 +544,24 @@ def test_defer_enrollment(
542544
)
543545

544546
new_enrollment = CourseRunEnrollmentFactory.create(run=course_runs[1])
547+
audit_enrollment = None
548+
if has_audit_enrollment_already:
549+
audit_enrollment = CourseRunEnrollmentFactory.create(
550+
user=existing_enrollment.user,
551+
run=course_runs[1],
552+
enrollment_mode=EDX_ENROLLMENT_AUDIT_MODE,
553+
)
545554
return_values = [
546555
([new_enrollment] if edx_enroll_succeeds else [], edx_enroll_succeeds),
547556
(
548557
[existing_enrollment] if edx_downgrade_succeeds else [],
549558
edx_downgrade_succeeds,
550559
),
551560
]
552-
561+
patched_deactivate_run_enrollment = mocker.patch(
562+
"courses.api.deactivate_run_enrollment",
563+
return_value=audit_enrollment,
564+
)
553565
with patch(
554566
"courses.api.create_run_enrollments", autospec=True
555567
) as patched_create_enrollments:
@@ -598,6 +610,11 @@ def test_defer_enrollment(
598610
keep_failed_enrollments=keep_failed_enrollments,
599611
)
600612

613+
if has_audit_enrollment_already:
614+
assert patched_deactivate_run_enrollment.call_count == 1
615+
else:
616+
assert patched_deactivate_run_enrollment.call_count == 0
617+
601618

602619
def test_defer_enrollment_validation(mocker, user):
603620
"""
@@ -619,7 +636,7 @@ def test_defer_enrollment_validation(mocker, user):
619636
)
620637
mocker.patch(
621638
"courses.api.deactivate_run_enrollment",
622-
return_value=[enrollments[1].run.courseware_id],
639+
return_value=enrollments[1],
623640
)
624641

625642
with pytest.raises(ValidationError):

0 commit comments

Comments
 (0)