From b50aa9be42dc7a7b5fb38675a2ea762c830614b8 Mon Sep 17 00:00:00 2001 From: Alexander Dusenbery Date: Mon, 12 Aug 2024 16:04:16 -0400 Subject: [PATCH] feat: remove check for auto external cancelation The write_reversals_from_enterprise_unenrollments management command (currently run on a cron) has this conditional (source). We used the not self.automatic_external_cancellation check to gate this code path on a Django setting. On stage/prod, this setting is set to True, and thus bypasses this conditional check. Now that stage/prod is always True, we can remove this gating altogether. ENT-9269 --- ...reversals_from_enterprise_unenrollments.py | 17 --- .../apps/transaction/tests/test_management.py | 108 +----------------- 2 files changed, 1 insertion(+), 124 deletions(-) diff --git a/enterprise_subsidy/apps/transaction/management/commands/write_reversals_from_enterprise_unenrollments.py b/enterprise_subsidy/apps/transaction/management/commands/write_reversals_from_enterprise_unenrollments.py index c4b6252a..e21dc900 100644 --- a/enterprise_subsidy/apps/transaction/management/commands/write_reversals_from_enterprise_unenrollments.py +++ b/enterprise_subsidy/apps/transaction/management/commands/write_reversals_from_enterprise_unenrollments.py @@ -37,11 +37,6 @@ def __init__(self, *args, **kwargs): provider_url=settings.GET_SMARTER_OAUTH2_PROVIDER_URL, api_url=settings.GET_SMARTER_API_URL ) - self.automatic_external_cancellation = getattr( - settings, - "ENTERPRISE_SUBSIDY_AUTOMATIC_EXTERNAL_CANCELLATION", - False - ) def add_arguments(self, parser): """ @@ -163,18 +158,6 @@ def handle_reversing_enterprise_course_unenrollment(self, unenrollment): f"Writing Reversal for Transaction: {related_transaction}." ) - # On initial release we are only supporting learner initiated unenrollments for OCM courses. - # OCM courses are identified by the lack of an external_reference on the Transaction object. - # Externally referenced transactions can be unenrolled through the Django admin actions related to the - # Transaction model. - if related_transaction.external_reference.exists() and not self.automatic_external_cancellation: - logger.info( - f"{self.dry_run_prefix}Found unenrolled enterprise fulfillment: {fulfillment_uuid} related to " - f"an externally referenced transaction: {related_transaction.external_reference.first()}. " - f"Skipping ENTERPRISE_SUBSIDY_AUTOMATIC_EXTERNAL_CANCELLATION={self.automatic_external_cancellation}." - ) - return 0 - # Memoize the content metadata for the course run fetched from the enterprise catalog if not self.fetched_content_metadata.get(enrollment_course_run_key): content_metadata = ContentMetadataApi.get_content_metadata( diff --git a/enterprise_subsidy/apps/transaction/tests/test_management.py b/enterprise_subsidy/apps/transaction/tests/test_management.py index 30b87d5a..137ae328 100644 --- a/enterprise_subsidy/apps/transaction/tests/test_management.py +++ b/enterprise_subsidy/apps/transaction/tests/test_management.py @@ -7,7 +7,7 @@ import ddt from django.core.management import call_command -from django.test import TestCase, override_settings +from django.test import TestCase from openedx_ledger.models import Reversal, TransactionStateChoices from openedx_ledger.test_utils.factories import ( ExternalFulfillmentProviderFactory, @@ -653,110 +653,6 @@ def test_write_reversals_from_enterprise_unenrollments( assert Reversal.objects.count() == 0 self.assertFalse(mock_send_event_bus_reversed.called) - @mock.patch('enterprise_subsidy.apps.transaction.signals.handlers.send_transaction_reversed_event') - @mock.patch( - 'enterprise_subsidy.apps.transaction.management.commands.write_reversals_from_enterprise_unenrollments.' - 'EnterpriseApiClient' - ) - @mock.patch( - 'enterprise_subsidy.apps.transaction.management.commands.write_reversals_from_enterprise_unenrollments.' - 'ContentMetadataApi' - ) - @mock.patch( - 'enterprise_subsidy.apps.transaction.api.EnterpriseApiClient' - ) - @override_settings(ENTERPRISE_SUBSIDY_AUTOMATIC_EXTERNAL_CANCELLATION=False) - def test_write_reversals_from_geag_enterprise_unenrollments_disabled_setting( - self, - mock_signal_client, - mock_fetch_course_metadata_client, - mock_fetch_recent_unenrollments_client, - mock_send_event_bus_reversed, - ): - """ - Test the write_reversals_from_enterprise_unenrollments management command's ability to create a reversal. - """ - # Reversal creation will trigger a signal handler that will make a call to enterprise - mock_signal_client.return_value = mock.MagicMock() - - # Call to enterprise, fetching recent unenrollments - mock_fetch_recent_unenrollments_client.return_value.fetch_recent_unenrollments.return_value = [ - { - 'enterprise_course_enrollment': { - 'enterprise_customer_user': 10, - 'course_id': self.geag_transaction.content_key, - 'created': '2023-05-25T19:27:29Z', - 'unenrolled_at': '2023-06-1T19:27:29Z', - }, - 'transaction_id': self.geag_transaction.uuid, - 'uuid': str(self.geag_transaction.fulfillment_identifier), - } - ] - - # Call to enterprise catalog, fetching course metadata - mock_fetch_course_metadata_client.get_content_metadata.return_value = { - 'key': self.course_key, - 'content_type': 'course', - 'uuid': self.course_uuid, - 'title': 'Demonstration Course', - 'course_runs': [{ - 'key': self.geag_transaction.content_key, - 'uuid': '00f8945b-bb50-4c7a-98f4-2f2f6178ff2f', - 'title': 'Demonstration Course', - 'external_key': None, - 'seats': [{ - 'type': 'verified', - 'price': '149.00', - 'currency': 'USD', - 'upgrade_deadline': '2023-05-26T15:45:32.494051Z', - 'upgrade_deadline_override': None, - 'credit_provider': None, - 'credit_hours': None, - 'sku': '8CF08E5', - 'bulk_sku': 'A5B6DBE' - }, { - 'type': 'audit', - 'price': '0.00', - 'currency': 'USD', - 'upgrade_deadline': None, - 'upgrade_deadline_override': None, - 'credit_provider': None, - 'credit_hours': None, - 'sku': '68EFFFF', - 'bulk_sku': None - }], - 'start': '2013-02-05T05:00:00Z', - 'end': None, - 'go_live_date': None, - 'enrollment_start': None, - 'enrollment_end': None, - 'is_enrollable': True, - 'availability': 'Current', - 'course': 'edX+DemoX', - 'first_enrollable_paid_seat_price': 149, - 'enrollment_count': 0, - 'recent_enrollment_count': 0, - 'course_uuid': self.course_uuid, - }], - 'entitlements': self.course_entitlements, - 'modified': '2022-05-26T15:46:24.355321Z', - 'additional_metadata': None, - 'enrollment_count': 0, - 'recent_enrollment_count': 0, - 'course_run_keys': [self.courserun_key], - 'content_last_modified': '2023-03-06T20:56:46Z', - 'enrollment_url': 'https://foobar.com', - 'active': False - } - - assert Reversal.objects.count() == 0 - - call_command('write_reversals_from_enterprise_unenrollments') - - assert Reversal.objects.count() == 0 - - self.assertFalse(mock_send_event_bus_reversed.called) - @mock.patch('enterprise_subsidy.apps.transaction.signals.handlers.send_transaction_reversed_event') @mock.patch( 'enterprise_subsidy.apps.fulfillment.api.GetSmarterEnterpriseApiClient' @@ -772,7 +668,6 @@ def test_write_reversals_from_geag_enterprise_unenrollments_disabled_setting( @mock.patch( 'enterprise_subsidy.apps.transaction.api.EnterpriseApiClient' ) - @override_settings(ENTERPRISE_SUBSIDY_AUTOMATIC_EXTERNAL_CANCELLATION=True) def test_write_reversals_from_geag_enterprise_unenrollments_enabled_setting( self, mock_signal_client, @@ -880,7 +775,6 @@ def test_write_reversals_from_geag_enterprise_unenrollments_enabled_setting( @mock.patch( 'enterprise_subsidy.apps.transaction.api.EnterpriseApiClient' ) - @override_settings(ENTERPRISE_SUBSIDY_AUTOMATIC_EXTERNAL_CANCELLATION=True) def test_write_reversals_from_geag_enterprise_unenrollments_unknown_provider( self, mock_signal_client,