fix: Stop showing course certificate buttons to beta testers (#28416)

Beta testers can’t earn course certificates, so they should not see a “Request Certificate” button or other info describing how they can earn a cert.

MICROBA-992
This commit is contained in:
Christie Rice
2021-08-10 09:06:14 -04:00
committed by GitHub
parent f2bb92bc64
commit cf3a6c16d6
9 changed files with 127 additions and 19 deletions

View File

@@ -44,6 +44,7 @@ from lms.djangoapps.certificates.api import (
)
from lms.djangoapps.certificates.data import CertificateStatuses
from lms.djangoapps.grades.api import CourseGradeFactory
from lms.djangoapps.instructor import access
from lms.djangoapps.verify_student.models import VerificationDeadline
from lms.djangoapps.verify_student.services import IDVerificationService
from lms.djangoapps.verify_student.utils import is_verification_expiring_soon, verification_for_datetime
@@ -465,6 +466,10 @@ def _cert_info(user, enrollment, cert_status):
"""
Implements the logic for cert_info -- split out for testing.
TODO: replace with a method that lives in the certificates app and combines this logic with
openedx.core.djangoapps.certificates.api.can_show_certificate_message and
lms.djangoapps.courseware.views.get_cert_data
Arguments:
user (User): A user.
enrollment (CourseEnrollment): A course enrollment.
@@ -526,6 +531,10 @@ def _cert_info(user, enrollment, cert_status):
if not CourseMode.is_eligible_for_certificate(enrollment.mode, status=status):
return default_info
if course_overview and access.is_beta_tester(user, course_overview.id):
# Beta testers are not eligible for a course certificate
return default_info
status_dict = {
'status': status,
'mode': cert_status.get('mode', None),

View File

@@ -54,6 +54,8 @@ from xmodule.data import CertificatesDisplayBehaviors
log = logging.getLogger(__name__)
BETA_TESTER_METHOD = 'common.djangoapps.student.helpers.access.is_beta_tester'
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
@ddt.ddt
@@ -169,6 +171,45 @@ class CourseEndingTest(ModuleStoreTestCase):
assert _cert_info(user, enrollment3, cert_status) == {'status': 'processing', 'show_survey_button': False,
'can_unenroll': True}
def test_cert_info_beta_tester(self):
user = UserFactory.create()
course = CourseOverviewFactory.create()
mode = CourseMode.VERIFIED
grade = '0.67'
status = CertificateStatuses.downloadable
cert = GeneratedCertificateFactory.create(
user=user,
course_id=course.id,
status=status,
mode=mode
)
enrollment = CourseEnrollmentFactory(user=user, course_id=course.id, mode=mode)
cert_status = {
'status': status,
'grade': grade,
'download_url': cert.download_url,
'mode': mode,
'uuid': 'blah',
}
with patch(BETA_TESTER_METHOD, return_value=False):
assert _cert_info(user, enrollment, cert_status) == {
'status': status,
'download_url': cert.download_url,
'show_survey_button': False,
'grade': grade,
'mode': mode,
'linked_in_url': None,
'can_unenroll': False
}
with patch(BETA_TESTER_METHOD, return_value=True):
assert _cert_info(user, enrollment, cert_status) == {
'status': 'processing',
'show_survey_button': False,
'can_unenroll': True
}
@ddt.data(
(0.70, 0.60),
(0.60, 0.70),
@@ -823,7 +864,7 @@ class EnrollInCourseTest(EnrollmentEventTestMixin, CacheIsolationTestCase):
assert CourseEnrollment.is_enrolled(user, course_id)
self.assert_no_events_were_emitted()
# Now deactive
# Now deactivate
enrollment.deactivate()
assert not CourseEnrollment.is_enrolled(user, course_id)
self.assert_unenrollment_event_was_emitted(user, course_id, course, enrollment)