diff --git a/lms/djangoapps/certificates/tests/test_models.py b/lms/djangoapps/certificates/tests/test_models.py index 3618fb027a..f0e21e09c1 100644 --- a/lms/djangoapps/certificates/tests/test_models.py +++ b/lms/djangoapps/certificates/tests/test_models.py @@ -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)) diff --git a/openedx/core/djangoapps/programs/signals.py b/openedx/core/djangoapps/programs/signals.py index 0ecb2f786e..a548f597a6 100644 --- a/openedx/core/djangoapps/programs/signals.py +++ b/openedx/core/djangoapps/programs/signals.py @@ -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') diff --git a/openedx/core/djangoapps/programs/tasks.py b/openedx/core/djangoapps/programs/tasks.py index 26f40ffcb6..49ec1978e4 100644 --- a/openedx/core/djangoapps/programs/tasks.py +++ b/openedx/core/djangoapps/programs/tasks.py @@ -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( diff --git a/openedx/core/djangoapps/programs/tests/test_signals.py b/openedx/core/djangoapps/programs/tests/test_signals.py index fe7c4c5122..f27ace45f5 100644 --- a/openedx/core/djangoapps/programs/tests/test_signals.py +++ b/openedx/core/djangoapps/programs/tests/test_signals.py @@ -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 diff --git a/openedx/core/djangoapps/programs/tests/test_tasks.py b/openedx/core/djangoapps/programs/tests/test_tasks.py index bcdbc55a88..d67c8066ff 100644 --- a/openedx/core/djangoapps/programs/tests/test_tasks.py +++ b/openedx/core/djangoapps/programs/tests/test_tasks.py @@ -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,