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:
Eugene Dyudyunov
2022-05-13 15:48:42 +03:00
committed by GitHub
parent 0d2ea3c2e2
commit 52dd883a3c
16 changed files with 93 additions and 143 deletions

View File

@@ -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())

View File

@@ -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}]"
)

View File

@@ -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