Source code for schrodinger.test.unittest_utils
import contextlib
from unittest import mock
from schrodinger.Qt import QtCore
[docs]def change_booleaness(obj, truth_value):
"""
Sets the return value for __bool__ or __nonzero__ depending on whether or
not you are in Python 2 or Python 3
:param obj: An object that has the __bool__ or __nonzero__ attribute
:type obj: objects
:param truth_value: What __bool__ or __nonzero__ should return
:type truth_value: bool
"""
obj.__bool__.return_value = truth_value
[docs]def wait_until_condition_met(success_cond_func,
poll_interval=500,
timeout=5 * 60):
"""
Call `success_cond_func` until it returns True or the time runs out.
:param success_cond_func: Function to call until it returns True
:type success_cond_func: callable
:param poll_interval: How often to check for success (milliseconds)
:type poll_interval: int
:param timeout: When to time out (seconds)
:type timeout: int
:return: Whether the function timed out
:rtype: bool
"""
if poll_interval == 0 or timeout == 0:
raise ValueError("Interval and timeout must be greater than 0")
timeout_ms = timeout * 1000
if timeout_ms <= poll_interval:
raise ValueError(
f"The timeout ({timeout}s) must be greater than the poll interval "
f"({poll_interval}ms)")
event_loop = QtCore.QEventLoop()
timed_out = False
def check_condition():
if success_cond_func():
event_loop.exit()
def do_time_out():
event_loop.exit()
nonlocal timed_out
timed_out = True
checker = QtCore.QTimer()
checker.timeout.connect(check_condition)
QtCore.QTimer.singleShot(timeout_ms, do_time_out)
checker.start(poll_interval)
event_loop.exec()
checker.stop()
return timed_out
[docs]class PatchStack(contextlib.ExitStack):
"""
Context manager for patching multiple paths at once.
Usage::
with PatchStack() as stack:
stack.patch("foo_module", return_value=bar)
"""
[docs] def patch(self, path, *args, **kwargs):
"""
Patch the given path. args and kwargs will be passed to mock.patch.
"""
self.enter_context(mock.patch(path, *args, **kwargs))
[docs] def patchObject(self, obj, attribute, *args, **kwargs):
"""
Patch an object's attribute. args and kwargs will be passed to
mock.patch.object.
"""
self.enter_context(mock.patch.object(obj, attribute, *args, **kwargs))