summaryrefslogtreecommitdiff
path: root/tests/conftest.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/conftest.py')
-rw-r--r--tests/conftest.py79
1 files changed, 72 insertions, 7 deletions
diff --git a/tests/conftest.py b/tests/conftest.py
index d9de876..2534ca0 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,5 +1,7 @@
+import argparse
import random
import time
+from typing import Callable, TypeVar
from unittest.mock import Mock
from urllib.parse import urlparse
@@ -21,6 +23,54 @@ default_redis_unstable_url = "redis://localhost:6378"
default_redis_ssl_url = "rediss://localhost:6666"
default_cluster_nodes = 6
+_DecoratedTest = TypeVar("_DecoratedTest", bound="Callable")
+_TestDecorator = Callable[[_DecoratedTest], _DecoratedTest]
+
+
+# Taken from python3.9
+class BooleanOptionalAction(argparse.Action):
+ def __init__(
+ self,
+ option_strings,
+ dest,
+ default=None,
+ type=None,
+ choices=None,
+ required=False,
+ help=None,
+ metavar=None,
+ ):
+
+ _option_strings = []
+ for option_string in option_strings:
+ _option_strings.append(option_string)
+
+ if option_string.startswith("--"):
+ option_string = "--no-" + option_string[2:]
+ _option_strings.append(option_string)
+
+ if help is not None and default is not None:
+ help += f" (default: {default})"
+
+ super().__init__(
+ option_strings=_option_strings,
+ dest=dest,
+ nargs=0,
+ default=default,
+ type=type,
+ choices=choices,
+ required=required,
+ help=help,
+ metavar=metavar,
+ )
+
+ def __call__(self, parser, namespace, values, option_string=None):
+ if option_string in self.option_strings:
+ setattr(namespace, self.dest, not option_string.startswith("--no-"))
+
+ def format_usage(self):
+ return " | ".join(self.option_strings)
+
def pytest_addoption(parser):
parser.addoption(
@@ -62,6 +112,9 @@ def pytest_addoption(parser):
help="Redis unstable (latest version) connection string "
"defaults to %(default)s`",
)
+ parser.addoption(
+ "--uvloop", action=BooleanOptionalAction, help="Run tests with uvloop"
+ )
def _get_info(redis_url):
@@ -101,6 +154,18 @@ def pytest_sessionstart(session):
cluster_nodes = session.config.getoption("--redis-cluster-nodes")
wait_for_cluster_creation(redis_url, cluster_nodes)
+ use_uvloop = session.config.getoption("--uvloop")
+
+ if use_uvloop:
+ try:
+ import uvloop
+
+ uvloop.install()
+ except ImportError as e:
+ raise RuntimeError(
+ "Can not import uvloop, make sure it is installed"
+ ) from e
+
def wait_for_cluster_creation(redis_url, cluster_nodes, timeout=60):
"""
@@ -133,19 +198,19 @@ def wait_for_cluster_creation(redis_url, cluster_nodes, timeout=60):
)
-def skip_if_server_version_lt(min_version):
+def skip_if_server_version_lt(min_version: str) -> _TestDecorator:
redis_version = REDIS_INFO["version"]
check = Version(redis_version) < Version(min_version)
return pytest.mark.skipif(check, reason=f"Redis version required >= {min_version}")
-def skip_if_server_version_gte(min_version):
+def skip_if_server_version_gte(min_version: str) -> _TestDecorator:
redis_version = REDIS_INFO["version"]
check = Version(redis_version) >= Version(min_version)
return pytest.mark.skipif(check, reason=f"Redis version required < {min_version}")
-def skip_unless_arch_bits(arch_bits):
+def skip_unless_arch_bits(arch_bits: int) -> _TestDecorator:
return pytest.mark.skipif(
REDIS_INFO["arch_bits"] != arch_bits, reason=f"server is not {arch_bits}-bit"
)
@@ -169,17 +234,17 @@ def skip_ifmodversion_lt(min_version: str, module_name: str):
raise AttributeError(f"No redis module named {module_name}")
-def skip_if_redis_enterprise():
+def skip_if_redis_enterprise() -> _TestDecorator:
check = REDIS_INFO["enterprise"] is True
return pytest.mark.skipif(check, reason="Redis enterprise")
-def skip_ifnot_redis_enterprise():
+def skip_ifnot_redis_enterprise() -> _TestDecorator:
check = REDIS_INFO["enterprise"] is False
return pytest.mark.skipif(check, reason="Not running in redis enterprise")
-def skip_if_nocryptography():
+def skip_if_nocryptography() -> _TestDecorator:
try:
import cryptography # noqa
@@ -188,7 +253,7 @@ def skip_if_nocryptography():
return pytest.mark.skipif(True, reason="No cryptography dependency")
-def skip_if_cryptography():
+def skip_if_cryptography() -> _TestDecorator:
try:
import cryptography # noqa