Source code for blissoda.tests.conftest
import os
from collections import namedtuple
from contextlib import ExitStack
import mock
import pytest
from ..persistent import mock_redis
from ..persistent import ordereddict as ordereddict_mod
from ..persistent import parameters as parameters_mod
from ..version_utils import has_minimal_version
[docs]
def has_redis_server() -> bool:
# TODO: instead of pytest-redis which needs a real Redis server, use fakeredis?
with os.popen("redis-server --version") as output:
return bool(output.read())
MockedBlissInfo = namedtuple("MockedBlissInfo", "beacon_connection")
if has_redis_server():
@pytest.fixture(scope="session")
def mock_bliss_session(redis_proc):
# Ensure we do not connect to a real Beacon host
os.environ["BEACON_HOST"] = "nonexisting:25000"
# Skip test when Beacon dependencies are not available
# TODO: mock to the extend we no longer need bliss as a dependency
if has_minimal_version("blissdata", "1"):
try:
from bliss.redis.manager import RedisAddress
except ImportError:
pytest.skip("requires bliss")
else:
from blissdata.redis import RedisAddress
try:
from bliss.config.conductor.client import get_default_connection
from bliss.config.conductor.connection import Connection
except ImportError:
pytest.skip("requires bliss")
redis_url = f"{redis_proc.host}:{redis_proc.port}"
def _get_redis_url(self):
"""Return the pytest-redis server URL"""
return RedisAddress.factory(redis_url)
with ExitStack() as stack:
# The Beacon connection should connect to the pytest-redis server
ctx = mock.patch.object(
Connection, "get_redis_connection_address", _get_redis_url
)
stack.enter_context(ctx)
ctx = mock.patch.object(
Connection, "get_redis_data_server_connection_address", _get_redis_url
)
stack.enter_context(ctx)
yield MockedBlissInfo(get_default_connection())
else:
[docs]
@pytest.fixture(scope="session")
def mock_bliss_session():
# redis_proc raises an exception when redis-server is not available
pytest.skip("requires redis-server")
[docs]
@pytest.fixture
def mock_bliss(mock_bliss_session):
yield
proxy = mock_bliss_session.beacon_connection.get_redis_proxy()
proxy.flushall()
[docs]
@pytest.fixture
def mock_persistent():
with mock.patch.object(
parameters_mod, "HashObjSetting", mock_redis.LocalHashObjSetting
):
with mock.patch.object(
ordereddict_mod,
"OrderedHashObjSetting",
mock_redis.LocalOrderedHashObjSetting,
):
try:
mock_redis.LocalHashObjSetting._LOCAL_REASON = "unit test"
mock_redis.LocalOrderedHashObjSetting._LOCAL_REASON = "unit test"
mock_redis.LocalHashObjSetting._LOCAL_WARNING_EMITTED = False
mock_redis.LocalOrderedHashObjSetting._LOCAL_WARNING_EMITTED = False
yield mock_redis._REDIS_STORE
finally:
mock_redis._REDIS_STORE.clear()
mock_redis.LocalHashObjSetting._LOCAL_REASON = None
mock_redis.LocalOrderedHashObjSetting._LOCAL_REASON = None
mock_redis.LocalHashObjSetting._LOCAL_WARNING_EMITTED = False
mock_redis.LocalOrderedHashObjSetting._LOCAL_WARNING_EMITTED = False
[docs]
@pytest.fixture
def mock_processing_triggers():
enabled = {}
def enable(processing_id, trigger, timing):
enabled[processing_id] = (trigger, timing)
def disable(processing_id):
enabled.pop(processing_id, None)
with mock.patch(
"blissoda.utils.trigger.enable_processing_trigger",
side_effect=enable,
autospec=True,
), mock.patch(
"blissoda.utils.trigger.disable_processing_trigger",
side_effect=disable,
autospec=True,
):
yield enabled