refactor: delete now unused FutureCourseWaffleFlag (#30367)
Remove temporary FutureCourseWaffleFlag class; Update ora2 and edx-toggles to versions cleaned from the LegacyWaffle* classes; Replace `override_flag`s with `override_waffle_flag`; Replace `override_switch`s with `override_waffle_switch` (where it's possible).
This commit is contained in:
@@ -12,26 +12,29 @@ import pytz
|
||||
from django.test import TestCase
|
||||
from django.test.client import RequestFactory
|
||||
from django.test.utils import override_settings
|
||||
from edx_toggles.toggles.testutils import override_waffle_switch
|
||||
from testfixtures import LogCapture
|
||||
from waffle.testutils import override_switch
|
||||
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
||||
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
|
||||
|
||||
from common.djangoapps.student.models import CourseEnrollment
|
||||
from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
|
||||
from lms.djangoapps.experiments.testutils import override_experiment_waffle_flag
|
||||
from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory
|
||||
from openedx.core.djangoapps.schedules.config import _EXTERNAL_COURSE_UPDATES_FLAG
|
||||
from openedx.core.djangoapps.schedules.config import (
|
||||
_EXTERNAL_COURSE_UPDATES_FLAG,
|
||||
COURSE_UPDATE_SHOW_UNSUBSCRIBE_WAFFLE_SWITCH,
|
||||
)
|
||||
from openedx.core.djangoapps.schedules.models import Schedule
|
||||
from openedx.core.djangoapps.schedules.resolvers import (
|
||||
LOG,
|
||||
BinnedSchedulesBaseResolver,
|
||||
CourseNextSectionUpdate,
|
||||
CourseUpdateResolver
|
||||
CourseUpdateResolver,
|
||||
)
|
||||
from openedx.core.djangoapps.schedules.tests.factories import ScheduleConfigFactory
|
||||
from openedx.core.djangoapps.site_configuration.tests.factories import SiteConfigurationFactory, SiteFactory
|
||||
from openedx.core.djangolib.testing.utils import CacheIsolationMixin, skip_unless_lms
|
||||
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order
|
||||
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory # lint-amnesty, pylint: disable=wrong-import-order
|
||||
|
||||
|
||||
class SchedulesResolverTestMixin(CacheIsolationMixin):
|
||||
@@ -183,7 +186,7 @@ class TestCourseUpdateResolver(SchedulesResolverTestMixin, ModuleStoreTestCase):
|
||||
}
|
||||
assert schedules == [(self.user, None, expected_context)]
|
||||
|
||||
@override_switch('schedules.course_update_show_unsubscribe', True)
|
||||
@override_waffle_switch(COURSE_UPDATE_SHOW_UNSUBSCRIBE_WAFFLE_SWITCH, True)
|
||||
def test_schedule_context_show_unsubscribe(self):
|
||||
resolver = self.create_resolver()
|
||||
schedules = list(resolver.schedules_for_bin())
|
||||
@@ -274,7 +277,7 @@ class TestCourseNextSectionUpdateResolver(SchedulesResolverTestMixin, ModuleStor
|
||||
}
|
||||
assert schedules == [(self.user, None, expected_context)]
|
||||
|
||||
@override_switch('schedules.course_update_show_unsubscribe', True)
|
||||
@override_waffle_switch(COURSE_UPDATE_SHOW_UNSUBSCRIBE_WAFFLE_SWITCH, True)
|
||||
def test_schedule_context_show_unsubscribe(self):
|
||||
resolver = self.create_resolver()
|
||||
schedules = list(resolver.get_schedules())
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
"""
|
||||
Temporary module to switch from the LegacyWaffle* classes.
|
||||
"""
|
||||
from edx_django_utils.monitoring import set_custom_attribute
|
||||
|
||||
from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag
|
||||
|
||||
|
||||
class FutureCourseWaffleFlag(CourseWaffleFlag):
|
||||
"""
|
||||
Temporary class to support ORA transition to the modern CourseWaffleFlag.
|
||||
"""
|
||||
def __init__(self, name, module_name, log_prefix=""):
|
||||
super().__init__(name, module_name=module_name, log_prefix=log_prefix)
|
||||
set_custom_attribute(
|
||||
"deprecated_legacy_waffle_class",
|
||||
f"{self.__class__.__module__}.{self.__class__.__name__}[{self.name}]"
|
||||
)
|
||||
@@ -9,11 +9,10 @@ import crum
|
||||
import ddt
|
||||
from django.test.client import RequestFactory
|
||||
from edx_django_utils.cache import RequestCache
|
||||
from edx_toggles.toggles.testutils import override_waffle_flag
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from waffle.testutils import override_flag
|
||||
|
||||
from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag
|
||||
from openedx.core.djangoapps.waffle_utils.__future__ import FutureCourseWaffleFlag
|
||||
from openedx.core.djangoapps.waffle_utils.models import WaffleFlagCourseOverrideModel, WaffleFlagOrgOverrideModel
|
||||
from openedx.core.djangolib.testing.utils import CacheIsolationTestCase
|
||||
|
||||
@@ -54,8 +53,8 @@ class TestCourseWaffleFlag(CacheIsolationTestCase):
|
||||
"""
|
||||
Tests various combinations of a flag being set in waffle and overridden for a course.
|
||||
"""
|
||||
with patch.object(WaffleFlagCourseOverrideModel, 'override_value', return_value=course_override):
|
||||
with override_flag(self.NAMESPACED_FLAG_NAME, active=waffle_enabled):
|
||||
with override_waffle_flag(self.TEST_COURSE_FLAG, active=waffle_enabled):
|
||||
with patch.object(WaffleFlagCourseOverrideModel, 'override_value', return_value=course_override):
|
||||
# check twice to test that the result is properly cached
|
||||
assert self.TEST_COURSE_FLAG.is_enabled(self.TEST_COURSE_KEY) == result
|
||||
assert self.TEST_COURSE_FLAG.is_enabled(self.TEST_COURSE_KEY) == result
|
||||
@@ -65,52 +64,11 @@ class TestCourseWaffleFlag(CacheIsolationTestCase):
|
||||
self.NAMESPACED_FLAG_NAME,
|
||||
self.TEST_COURSE_KEY
|
||||
)
|
||||
|
||||
# check flag for a second course
|
||||
if course_override == WaffleFlagCourseOverrideModel.ALL_CHOICES.unset:
|
||||
# When course override wasn't set for the first course, the second course will get the same
|
||||
# cached value from waffle.
|
||||
# Check flag for a second course.
|
||||
# This should be the same cached value as for overriden flag.
|
||||
assert self.TEST_COURSE_FLAG.is_enabled(self.TEST_COURSE_2_KEY) == waffle_enabled
|
||||
else:
|
||||
# When course override was set for the first course, it should not apply to the second
|
||||
# course which should get the default value of False.
|
||||
assert self.TEST_COURSE_FLAG.is_enabled(self.TEST_COURSE_2_KEY) is False
|
||||
|
||||
@ddt.data(
|
||||
(False, WaffleFlagCourseOverrideModel.ALL_CHOICES.on, True),
|
||||
(True, WaffleFlagCourseOverrideModel.ALL_CHOICES.off, False),
|
||||
(True, WaffleFlagCourseOverrideModel.ALL_CHOICES.unset, True),
|
||||
(False, WaffleFlagCourseOverrideModel.ALL_CHOICES.unset, False),
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_future_course_waffle_flag(self, waffle_enabled, course_override, result):
|
||||
"""
|
||||
Tests various combinations of a __future__ flag being set in waffle and overridden for a course.
|
||||
"""
|
||||
test_future_course_flag = FutureCourseWaffleFlag(
|
||||
self.NAMESPACED_FLAG_NAME, __name__
|
||||
)
|
||||
with patch.object(WaffleFlagCourseOverrideModel, 'override_value', return_value=course_override):
|
||||
with override_flag(self.NAMESPACED_FLAG_NAME, active=waffle_enabled):
|
||||
# check twice to test that the result is properly cached
|
||||
assert test_future_course_flag.is_enabled(self.TEST_COURSE_KEY) == result
|
||||
assert test_future_course_flag.is_enabled(self.TEST_COURSE_KEY) == result
|
||||
# result is cached, so override check should happen only once
|
||||
# pylint: disable=no-member
|
||||
WaffleFlagCourseOverrideModel.override_value.assert_called_once_with(
|
||||
self.NAMESPACED_FLAG_NAME,
|
||||
self.TEST_COURSE_KEY
|
||||
)
|
||||
|
||||
# check flag for a second course
|
||||
if course_override == WaffleFlagCourseOverrideModel.ALL_CHOICES.unset:
|
||||
# When course override wasn't set for the first course, the second course will get the same
|
||||
# cached value from waffle.
|
||||
assert test_future_course_flag.is_enabled(self.TEST_COURSE_2_KEY) == waffle_enabled
|
||||
else:
|
||||
# When course override was set for the first course, it should not apply to the second
|
||||
# course which should get the default value of False.
|
||||
assert test_future_course_flag.is_enabled(self.TEST_COURSE_2_KEY) is False
|
||||
# Check the default value for the second course after the cache was restored
|
||||
assert self.TEST_COURSE_FLAG.is_enabled(self.TEST_COURSE_2_KEY) is False
|
||||
|
||||
@ddt.data(
|
||||
(False, WaffleFlagOrgOverrideModel.ALL_CHOICES.unset, False),
|
||||
@@ -140,7 +98,7 @@ class TestCourseWaffleFlag(CacheIsolationTestCase):
|
||||
enabled=True
|
||||
)
|
||||
# Both course keys should match the org-level override.
|
||||
with override_flag(self.NAMESPACED_FLAG_NAME, active=waffle_enabled):
|
||||
with override_waffle_flag(self.TEST_COURSE_FLAG, active=waffle_enabled):
|
||||
assert self.TEST_COURSE_FLAG.is_enabled(self.TEST_COURSE_KEY) == is_enabled
|
||||
assert self.TEST_COURSE_FLAG.is_enabled(self.TEST_COURSE_2_KEY) == is_enabled
|
||||
|
||||
@@ -170,7 +128,7 @@ class TestCourseWaffleFlag(CacheIsolationTestCase):
|
||||
enabled=True
|
||||
)
|
||||
# Org doesn't match the course key, so should never be enabled.
|
||||
with override_flag(self.NAMESPACED_FLAG_NAME, active=waffle_enabled):
|
||||
with override_waffle_flag(self.TEST_COURSE_FLAG, active=waffle_enabled):
|
||||
assert self.TEST_COURSE_FLAG.is_enabled(self.TEST_COURSE_3_KEY) == is_enabled
|
||||
|
||||
@ddt.data(
|
||||
@@ -226,7 +184,7 @@ class TestCourseWaffleFlag(CacheIsolationTestCase):
|
||||
note='',
|
||||
enabled=True
|
||||
)
|
||||
with override_flag(self.NAMESPACED_FLAG_NAME, active=waffle_enabled):
|
||||
with override_waffle_flag(self.TEST_COURSE_FLAG, active=waffle_enabled):
|
||||
assert self.TEST_COURSE_FLAG.is_enabled(self.TEST_COURSE_KEY) == is_enabled
|
||||
|
||||
def test_undefined_waffle_flag(self):
|
||||
@@ -265,5 +223,5 @@ class TestCourseWaffleFlag(CacheIsolationTestCase):
|
||||
crum.set_current_request(None)
|
||||
|
||||
test_course_flag = CourseWaffleFlag(self.NAMESPACED_FLAG_NAME, __name__)
|
||||
with override_flag(self.NAMESPACED_FLAG_NAME, active=True):
|
||||
with override_waffle_flag(self.TEST_COURSE_FLAG, active=True):
|
||||
assert test_course_flag.is_enabled(self.TEST_COURSE_KEY) is True
|
||||
|
||||
Reference in New Issue
Block a user