Fix random errors when tests are run close to midnight

parent a7f0bbb2
......@@ -51,7 +51,8 @@ class TestOrderMixin(SubcontentReindexingWrapper):
order_cell_portal_type = 'Sale Order Cell'
applied_rule_portal_type = 'Applied Rule'
simulation_movement_portal_type = 'Simulation Movement'
datetime = DateTime()
# see comment about self.datetime on afterSetUp() below
datetime = DateTime() - 2
packing_list_portal_type = 'Sale Packing List'
packing_list_line_portal_type = 'Sale Packing List Line'
packing_list_cell_portal_type = 'Sale Packing List Cell'
......@@ -94,15 +95,28 @@ class TestOrderMixin(SubcontentReindexingWrapper):
def afterSetUp(self, quiet=1, run=1):
def afterSetUp(self):
# XXX-Leo: cannot call super here, because other classes call
# SuperClass.afterSetUp(self) directly... this needs to be cleaned
# up, including consolidating all conflicting definitions of
# .createCategories()
#super(TestOrderMixin, self).afterSetUp()
portal = self.getPortal()
self.category_tool = self.getCategoryTool()
portal_catalog = self.getCatalogTool()
# pin datetime on the day before yesterday, to make sure that:
# 1. All calculations are done relative to the same time
# 2. We don't get random failures when tests run close to midnight
def beforeTearDown(self):
super(TestOrderMixin, self).beforeTearDown()
def createCurrency(self):
currency_module = self.getPortal().currency_module
......@@ -26,6 +26,7 @@ from hashlib import md5
from warnings import warn
from ExtensionClass import pmc_init_of
from ZTUtils import make_query
from DateTime import DateTime
# XXX make sure that get_request works.
import Products.ERP5Type.Utils
......@@ -275,6 +276,21 @@ def profile_if_environ(environment_var_name):
# No profiling, return identity decorator
return lambda self, method: method
# Patch DateTime to allow pinning the notion of "now".
assert getattr(DateTime, '_original_parse_args', None) is None
DateTime._original_parse_args = DateTime._parse_args
_pinned_date_time = None
def _parse_args(self, *args, **kw):
if _pinned_date_time is not None and (not args or args[0] == None):
# simulate fixed "Now"
args = (_pinned_date_time,) + args[1:]
return self._original_parse_args(*args, **kw)
_parse_args._original = DateTime._original_parse_args
DateTime._parse_args = _parse_args
class ERP5TypeTestCaseMixin(ProcessingNodeTestCase, PortalTestCase):
"""Mixin class for ERP5 based tests.
......@@ -354,6 +370,17 @@ class ERP5TypeTestCaseMixin(ProcessingNodeTestCase, PortalTestCase):
cls.__bases__ = cls.__bases__[1:]
def pinDateTime(self, date_time):
# pretend time has stopped at a certain date (i.e. the test runs
# infinitely fast), to avoid errors on tests that are started
# just before midnight.
global _pinned_date_time
assert date_time is None or isinstance(date_time, DateTime)
_pinned_date_time = date_time
def unpinDateTime(self):
def getDefaultSitePreferenceId(self):
"""Default id, usefull method to override
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment