import aioredis.util import pytest from _pytest.config import UsageError def pytest_addoption(parser): parser.addoption( "--redis", default=None, help="run tests which require redis connection" ) def pytest_configure(config): config.addinivalue_line( "markers", "redis: marked tests require redis connection to run" ) def pytest_collection_modifyitems(config, items): redis_uri = config.getoption("--redis") if redis_uri is None: skip_redis = pytest.mark.skip( reason="need --redis option with redis URI to run" ) for item in items: if "redis" in item.keywords: item.add_marker(skip_redis) return try: address, options = aioredis.util.parse_url(redis_uri) if not isinstance(address, tuple): raise AssertionError( "Only redis and rediss schemas are supported, eg redis://foo." ) except AssertionError as e: raise UsageError(f"Invalid redis URI {redis_uri!r}: {e}") @pytest.fixture(scope="session") def redis_options(request): redis_uri = request.config.getoption("--redis") (host, port), options = aioredis.util.parse_url(redis_uri) options.update({"host": host, "port": port}) return options