From 2af47c7128abb2ac70107d38d5d048ab72f53cc1 Mon Sep 17 00:00:00 2001 From: Phillip Shiu Date: Sun, 25 Jun 2023 22:11:08 -0400 Subject: [PATCH 1/4] temp: remove celery ignore_result=True We are lacking information in Flower about our Celery tasks that are marked as successful but are actually failing. Attempt to remove ignore_result=True to see if this is suppressing valuable debugging information. --- common/djangoapps/entitlements/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/djangoapps/entitlements/tasks.py b/common/djangoapps/entitlements/tasks.py index 1b6a0b13e5..a5fac3c118 100644 --- a/common/djangoapps/entitlements/tasks.py +++ b/common/djangoapps/entitlements/tasks.py @@ -65,7 +65,7 @@ def expire_old_entitlements(self, start, end, logid='...'): LOGGER.info('Successfully completed the task expire_old_entitlements after examining %d entries [%s]', entitlements.count(), logid) # lint-amnesty, pylint: disable=line-too-long -@shared_task(bind=True, ignore_result=True) +@shared_task(bind=True) @set_code_owner_attribute def expire_and_create_entitlements(self, entitlement_ids, support_username): """ From 82338bd375bf2305cd94e2ed19e214ef7b529bc0 Mon Sep 17 00:00:00 2001 From: Phillip Shiu Date: Sun, 25 Jun 2023 22:12:10 -0400 Subject: [PATCH 2/4] fix: SyntaxError: use CourseEntitlement.objects, not .object --- common/djangoapps/entitlements/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/djangoapps/entitlements/tasks.py b/common/djangoapps/entitlements/tasks.py index a5fac3c118..1b268e941b 100644 --- a/common/djangoapps/entitlements/tasks.py +++ b/common/djangoapps/entitlements/tasks.py @@ -100,7 +100,7 @@ def expire_and_create_entitlements(self, entitlement_ids, support_username): try: for entitlement_id in entitlement_ids: - entitlement = CourseEntitlement.object.get(_id=entitlement_id) + entitlement = CourseEntitlement.objects.get(id=entitlement_id) LOGGER.info('Started expiring entitlement with id %d', entitlement.id) entitlement.expire_entitlement() LOGGER.info('Expired entitlement with id %d as expiration period has reached', entitlement.id) From e115cd9873c70f76a1cb972ce1b78f5c19bfa87e Mon Sep 17 00:00:00 2001 From: Phillip Shiu Date: Sun, 25 Jun 2023 22:12:58 -0400 Subject: [PATCH 3/4] test: for entitlements tasks.expire_and_create_entitlements --- .../entitlements/tests/test_tasks.py | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/common/djangoapps/entitlements/tests/test_tasks.py b/common/djangoapps/entitlements/tests/test_tasks.py index 02a1f9468d..0ad97f6bb3 100644 --- a/common/djangoapps/entitlements/tests/test_tasks.py +++ b/common/djangoapps/entitlements/tests/test_tasks.py @@ -11,8 +11,9 @@ import pytz from django.test import TestCase from common.djangoapps.entitlements import tasks -from common.djangoapps.entitlements.models import CourseEntitlementPolicy +from common.djangoapps.entitlements.models import CourseEntitlement, CourseEntitlementPolicy from common.djangoapps.entitlements.tests.factories import CourseEntitlementFactory +from common.djangoapps.student.tests.factories import AdminFactory from openedx.core.djangolib.testing.utils import skip_unless_lms @@ -103,3 +104,63 @@ class TestExpireOldEntitlementsTaskIntegration(TestCase): entitlement.refresh_from_db() assert entitlement.expired_at is not None + + +@skip_unless_lms +class TestExpireAndCreateEntitlementsTaskIntegration(TestCase): + """ + Tests for the 'expire_and_create_entitlements' method. + """ + SUPPORT_USERNAME = 'support_username' + + def setUp(self): + """ + Set up user for tests. + """ + # Mock support user + AdminFactory.create(username=self.SUPPORT_USERNAME) + + def test_actually_expired(self): + """ + Integration test with CourseEntitlement to make sure we are calling the + correct API. + """ + entitlement = make_entitlement() + + # Sanity check + assert entitlement.expired_at is None + + # Run enforcement + tasks.expire_and_create_entitlements.delay( + [entitlement.id], + self.SUPPORT_USERNAME, + ).get() + entitlement.refresh_from_db() + + assert entitlement.expired_at is not None + + + def test_actually_created(self): + """ + Integration test with CourseEntitlement to make sure we are creating an + entitlement after expiring it. + """ + entitlement = make_entitlement() + + # Sanity check + assert not CourseEntitlement.objects.filter( + course_uuid=entitlement.course_uuid, + expired_at=None + ).exclude(id=entitlement.id).exists() + + # Run enforcement + tasks.expire_and_create_entitlements.delay( + [entitlement.id], + self.SUPPORT_USERNAME, + ).get() + entitlement.refresh_from_db() + + assert CourseEntitlement.objects.filter( + course_uuid=entitlement.course_uuid, + expired_at=None + ).exclude(id=entitlement.id).exists() From 87953991e083fe5fbc136a19a06cef94d1bd5eea Mon Sep 17 00:00:00 2001 From: Muhammad Zubair Date: Mon, 26 Jun 2023 15:40:09 +0500 Subject: [PATCH 4/4] feat: removed extra blank line --- common/djangoapps/entitlements/tests/test_tasks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/common/djangoapps/entitlements/tests/test_tasks.py b/common/djangoapps/entitlements/tests/test_tasks.py index 0ad97f6bb3..fe45055151 100644 --- a/common/djangoapps/entitlements/tests/test_tasks.py +++ b/common/djangoapps/entitlements/tests/test_tasks.py @@ -139,7 +139,6 @@ class TestExpireAndCreateEntitlementsTaskIntegration(TestCase): assert entitlement.expired_at is not None - def test_actually_created(self): """ Integration test with CourseEntitlement to make sure we are creating an