Merge pull request #27357 from edx/jhynes/microba-1164_revoke-program-certs-bugfix

fix: fix bug with `revoke_program_certificates` task
This commit is contained in:
Justin Hynes
2021-04-22 07:38:32 -04:00
committed by GitHub
5 changed files with 28 additions and 32 deletions

View File

@@ -343,4 +343,4 @@ class CertificateInvalidationTest(SharedModuleStoreTestCase):
self.certificate.invalidate()
assert mock_revoke_task.call_count == 1
assert mock_revoke_task.call_args[0] == (self.user.username, self.course_id)
assert mock_revoke_task.call_args[0] == (self.user.username, str(self.course_id))

View File

@@ -169,15 +169,11 @@ def handle_course_cert_revoked(sender, user, course_key, mode, status, **kwargs)
# schedule background task to process
LOGGER.info(
'handling COURSE_CERT_REVOKED: username=%s, course_key=%s, mode=%s, status=%s',
user,
course_key,
mode,
status,
f"handling COURSE_CERT_REVOKED: user={user.id}, course_key={course_key}, mode={mode}, status={status}"
)
# import here, because signal is registered at startup, but items in tasks are not yet able to be loaded
from openedx.core.djangoapps.programs.tasks import revoke_program_certificates
revoke_program_certificates.delay(user.username, course_key)
revoke_program_certificates.delay(user.username, str(course_key))
@receiver(COURSE_CERT_DATE_CHANGE, dispatch_uid='course_certificate_date_change_handler')

View File

@@ -467,7 +467,7 @@ def revoke_program_certificates(self, username, course_key): # lint-amnesty, py
Args:
username (str): The username of the student
course_key (str|CourseKey): The course identifier
course_key (str): The course identifier
Returns:
None
@@ -510,7 +510,7 @@ def revoke_program_certificates(self, username, course_key): # lint-amnesty, py
try:
inverted_programs = get_inverted_programs(student)
course_specific_programs = inverted_programs.get(str(course_key))
course_specific_programs = inverted_programs.get(course_key)
if not course_specific_programs:
# No reason to continue beyond this point
LOGGER.info(

View File

@@ -230,7 +230,7 @@ class CertRevokedReceiverTest(TestCase):
assert mock_is_learner_issuance_enabled.call_count == 1
assert mock_task.call_count == 1
assert mock_task.call_args[0] == (TEST_USERNAME, TEST_COURSE_KEY)
assert mock_task.call_args[0] == (TEST_USERNAME, str(TEST_COURSE_KEY))
@skip_unless_lms

View File

@@ -676,6 +676,27 @@ class RevokeProgramCertificatesTestCase(CatalogIntegrationMixin, CredentialsApiC
self.inverted_programs = {self.course_key: [{'uuid': 1}, {'uuid': 2}]}
def _make_side_effect(self, side_effects):
"""
DRY helper. Returns a side effect function for use with mocks that
will be called multiple times, permitting Exceptions to be raised
(or not) in a specified order.
See Also:
http://www.voidspace.org.uk/python/mock/examples.html#multiple-calls-with-different-effects
http://www.voidspace.org.uk/python/mock/mock.html#mock.Mock.side_effect
"""
def side_effect(*_a):
if side_effects:
exc = side_effects.pop(0)
if exc:
raise exc
return mock.DEFAULT
return side_effect
def test_inverted_programs(
self,
mock_get_inverted_programs,
@@ -689,7 +710,7 @@ class RevokeProgramCertificatesTestCase(CatalogIntegrationMixin, CredentialsApiC
tasks.revoke_program_certificates.delay(self.student.username, self.course_key).get()
mock_get_inverted_programs.assert_any_call(self.student)
def test_revokinging_certificate(
def test_revoke_program_certificate(
self,
mock_get_inverted_programs,
mock_get_certified_programs,
@@ -760,27 +781,6 @@ class RevokeProgramCertificatesTestCase(CatalogIntegrationMixin, CredentialsApiC
assert not mock_get_certified_programs.called
assert not mock_revoke_program_certificate.called
def _make_side_effect(self, side_effects):
"""
DRY helper. Returns a side effect function for use with mocks that
will be called multiple times, permitting Exceptions to be raised
(or not) in a specified order.
See Also:
http://www.voidspace.org.uk/python/mock/examples.html#multiple-calls-with-different-effects
http://www.voidspace.org.uk/python/mock/mock.html#mock.Mock.side_effect
"""
def side_effect(*_a):
if side_effects:
exc = side_effects.pop(0)
if exc:
raise exc
return mock.DEFAULT
return side_effect
def test_continue_revoking_certs_if_error(
self,
mock_get_inverted_programs,