Fix error in experiment tracking

If the user is not logged in, the ExperimentWaffleFlag code was
raising an exception when trying to send an event to segment.

This is a quick fix to ignore anonymous users.
This commit is contained in:
Michael Terry
2020-03-16 16:09:41 -04:00
parent d95e8724d8
commit 2e5f2f2be3
3 changed files with 14 additions and 11 deletions

View File

@@ -3174,7 +3174,6 @@ class DatesTabTestCase(ModuleStoreTestCase):
def setUp(self):
super(DatesTabTestCase, self).setUp()
self.user = UserFactory.create()
now = datetime.now(utc)
self.course = CourseFactory.create(start=now + timedelta(days=-1))
@@ -3197,10 +3196,6 @@ class DatesTabTestCase(ModuleStoreTestCase):
@RELATIVE_DATES_FLAG.override(active=True)
def test_defaults(self):
request = RequestFactory().request()
request.user = self.user
self.addCleanup(crum.set_current_request, None)
crum.set_current_request(request)
enrollment = CourseEnrollmentFactory(course_id=self.course.id, user=self.user, mode=CourseMode.VERIFIED)
now = datetime.now(utc)
with self.store.bulk_operations(self.course.id):

View File

@@ -70,6 +70,10 @@ class ExperimentWaffleFlag(CourseWaffleFlag):
if not request:
return 0
if not request.user.id:
# We need username for stable bucketing and id for tracking, so just skip anonymous (not-logged-in) users
return 0
# Use course key in experiment name to separate caches and segment calls per-course-run
experiment_name = self.namespaced_flag_name + ('.{}'.format(course_key) if course_key else '')
@@ -136,7 +140,8 @@ class ExperimentWaffleFlag(CourseWaffleFlag):
@contextmanager
def override(self, active=True, bucket=1): # pylint: disable=arguments-differ
from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_flag
with override_waffle_flag(self, active):
with override_waffle_flag(self.bucket_flags[bucket], True):
yield
from mock import patch
if not active:
bucket = 0
with patch.object(self, 'get_bucket', return_value=bucket):
yield

View File

@@ -16,6 +16,7 @@ from experiments.factories import ExperimentKeyValueFactory
from experiments.flags import ExperimentWaffleFlag
from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory
from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag
from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_flag
from student.tests.factories import CourseEnrollmentFactory, UserFactory
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
@@ -45,8 +46,10 @@ class ExperimentWaffleFlagTests(SharedModuleStoreTestCase):
self.addCleanup(RequestCache.clear_all_namespaces)
def get_bucket(self, track=False, active=True):
with self.flag.override(active=active):
return self.flag.get_bucket(course_key=self.key, track=track)
# Does not use ExperimentWaffleFlag.override, since that shortcuts get_bucket and we want to test internals
with override_waffle_flag(self.flag, active):
with override_waffle_flag(self.flag.bucket_flags[1], True):
return self.flag.get_bucket(course_key=self.key, track=track)
def test_basic_happy_path(self):
self.assertEqual(self.get_bucket(), 1)