From 1198e5f29b541427b4522c85684340d7617e7ee2 Mon Sep 17 00:00:00 2001 From: Jeremy Bowman <jbowman@edx.org> Date: Mon, 10 Jun 2019 14:56:33 -0400 Subject: [PATCH] Fix intermittent unit test failures (#20783) --- .../commands/tests/send_email_base.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py b/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py index 406426cd1ee..3eb64924990 100644 --- a/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py +++ b/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py @@ -12,6 +12,8 @@ import attr import ddt import pytz from django.conf import settings +from django.contrib.auth.models import User +from django.db.models import Max from edx_ace.channel import ChannelMap, ChannelType from edx_ace.test_utils import StubPolicy, patch_policies from edx_ace.utils.date import serialize @@ -105,6 +107,18 @@ class ScheduleSendEmailTestMixin(FilteredQueryCountMixin): def _calculate_bin_for_user(self, user): return user.id % self.task.num_bins + def _next_user_id(self): + """ + Get the next user ID which is a multiple of the bin count and greater + than the current largest user ID. Avoids intermittent ID collisions + with the user created in ModuleStoreTestCase.setUp(). + """ + max_user_id = User.objects.aggregate(Max('id'))['id__max'] + if max_user_id is None: + max_user_id = 0 + num_bins = self.task.num_bins + return max_user_id + num_bins - (max_user_id % num_bins) + def _get_dates(self, offset=None): current_day = _get_datetime_beginning_of_day(datetime.datetime.now(pytz.UTC)) offset = offset or self.expected_offsets[0] @@ -296,8 +310,8 @@ class ScheduleSendEmailTestMixin(FilteredQueryCountMixin): for config in (this_config, other_config): ScheduleConfigFactory.create(site=config.site) - user1 = UserFactory.create(id=self.task.num_bins) - user2 = UserFactory.create(id=self.task.num_bins * 2) + user1 = UserFactory.create(id=self._next_user_id()) + user2 = UserFactory.create(id=user1.id + self.task.num_bins) current_day, offset, target_day, upgrade_deadline = self._get_dates() self._schedule_factory( @@ -323,7 +337,7 @@ class ScheduleSendEmailTestMixin(FilteredQueryCountMixin): @ddt.data(True, False) def test_course_end(self, has_course_ended): - user1 = UserFactory.create(id=self.task.num_bins) + user1 = UserFactory.create(id=self._next_user_id()) current_day, offset, target_day, upgrade_deadline = self._get_dates() end_date_offset = -2 if has_course_ended else 2 -- GitLab