Source code for schrodinger.test.pytest.fixture
"""
Features that a developer might use when writing tests.
"""
import os
import pathlib
import shutil
import sys
from unittest.mock import patch
import pytest
from schrodinger import get_mmshare_version
from schrodinger.infra import mmjob
from schrodinger.test import mmshare_testfile
from . import exetest
[docs]@pytest.fixture
def unittest_preset_manager():
"""
A fixture that mocks out the PresetManager with a PresetManager
that uses the current working directory as the presets directory.
This prevents reliance on system state.
"""
def _getPresetsDirectory(self):
return os.path.join('.', 'foo', self._panel_name)
with patch('schrodinger.models.presets.PresetManager._getPresetsDirectory',
_getPresetsDirectory):
yield
[docs]@pytest.fixture
def json_version():
"""
A fixture that mocks out the version used by
schrodinger.models.json.JsonableClassMixin. By default, the version returned
will be the current mmshare version. The return_value of the fixture can be
adjusted to change the version. Example::
def my_test(json_version):
from schrodinger.models import json
from schrodinger import get_mmshare_version
foo = json.JsonableClassMixin()
assert foo.get_version() == get_mmshare_version()
json_version.return_value = 10
assert foo.get_version() == 10
"""
with patch('schrodinger.models.json.JsonableClassMixin.get_version'
) as get_version_mock:
get_version_mock.return_value = get_mmshare_version()
yield get_version_mock
[docs]@pytest.fixture
def tmp_cwd(tmpdir_factory, request, monkeypatch):
nodeid = os.path.basename(request.node.nodeid)
nodeid = nodeid.replace(':', '_').replace('.', '_')
# nodeid = 'sort_test.sdaf'
d = tmpdir_factory.mktemp(nodeid)
setattr(request.node, 'schro_tmp_cwd', str(d))
cwd = os.getcwd()
try:
os.chdir(d)
yield str(d)
finally:
os.chdir(cwd)
[docs]@pytest.fixture
def log_to_stdout():
"""Log to stdout instead of files"""
with patch('logging.FileHandler._open', return_value=sys.stdout):
yield
class _allow_memtest:
"""
Run a command from a Python test.
For legacy mmlibs tests
Raises an exception if the command fails or if memtest fails.
"""
def __init__(self, request):
self.node = request.node
def check_call(self, cmd, env=None, stdout=None, stderr=None):
# This is all stuff that is required for memtest to accurately
# find suppressions, for instance.
t = exetest.ExecutableTest.from_parent(name=self.node.fspath.basename,
parent=self.node)
exe_candidates = [cmd[0], f"{cmd[0]}.exe"]
exe_candidates.extend([shutil.which(exe) for exe in exe_candidates])
exe_candidates = [
pathlib.Path(exe) for exe in exe_candidates if exe is not None
]
executable = None
for cand in exe_candidates:
if cand.exists():
executable = os.fspath(cand.absolute())
break
if executable is None:
raise RuntimeError(f"executable {cmd[0]} not found")
cmd = [executable] + cmd[1:]
t.command = cmd
t.runtest(capture=False, env=env, stdout=stdout, stderr=stderr)
[docs]@pytest.fixture
def allow_memtest(request):
# class-based fixtures are not supported.
return _allow_memtest(request)
[docs]@pytest.fixture
def fast_jobdj():
"""
Use this fixture to make jobDJ use minimal delays in updating, at the
expense of throttling the CPU.
"""
with patch("schrodinger.job.queue.USE_JOB_CONTROL_MESSAGES", False):
with patch("schrodinger.job.queue.MONITOR_DELAY", 0.1):
yield
[docs]@pytest.fixture
def mock_gpgpu_hosts_env():
try:
with patch.dict(os.environ, {
"SCHRODINGER_HOSTS":
mmshare_testfile("job_test_files/gpgpu.hosts")
}):
mmjob.mmjob_hosts_reload()
yield
finally:
mmjob.mmjob_hosts_reload()