From eafc7170457f1b3abe88aaf835515806c883b084 Mon Sep 17 00:00:00 2001 From: Brian Bjarke Jensen Date: Wed, 8 Jul 2026 21:17:33 +0200 Subject: [PATCH] Move Redis test container helpers into integration conftest. Colocate RedisTestContainer with the fixtures that use it and remove the misleading redis_container_test module plus collect_ignore workaround. Co-authored-by: Cursor --- tests/integration/conftest.py | 33 +++++++++++++++++++-- tests/integration/redis_container_test.py | 36 ----------------------- 2 files changed, 31 insertions(+), 38 deletions(-) delete mode 100644 tests/integration/redis_container_test.py diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index cf1e821..42ce54d 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -2,23 +2,52 @@ import logging from collections.abc import Generator +from typing import Any, cast import pytest import redis import structlog from minio import Minio +from testcontainers.core.container import DockerContainer +from testcontainers.core.waiting_utils import WaitStrategy, WaitStrategyTarget from testcontainers.minio import MinioContainer from python_repositories.config import MinioConfig, RedisConfig -from tests.integration.redis_container_test import REDIS_PORT, RedisTestContainer -collect_ignore = ["redis_container_test.py"] +REDIS_PORT = 6379 MINIO_ACCESS_KEY = "minioadmin" MINIO_SECRET_KEY = "minioadmin" MINIO_BUCKET = "test-bucket" +class _RedisPingWaitStrategy(WaitStrategy): + def __init__(self) -> None: + super().__init__() + self.with_transient_exceptions(redis.exceptions.ConnectionError) + + def wait_until_ready(self, container: WaitStrategyTarget) -> None: + redis_container = cast("RedisTestContainer", container) + if not self._poll(lambda: redis_container.get_client().ping()): + raise redis.exceptions.ConnectionError("Could not connect to Redis") + + +class RedisTestContainer(DockerContainer): + """Redis container using wait strategies instead of the deprecated decorator.""" + + def __init__(self, image: str, port: int = REDIS_PORT) -> None: + super().__init__(image, _wait_strategy=_RedisPingWaitStrategy()) + self.port = port + self.with_exposed_ports(self.port) + + def get_client(self, **kwargs: Any) -> redis.Redis: + return redis.Redis( + host=self.get_container_host_ip(), + port=self.get_exposed_port(self.port), + **kwargs, + ) + + @pytest.fixture(scope="session", autouse=True) def configure_logging() -> None: """Configure logging for the test session.""" diff --git a/tests/integration/redis_container_test.py b/tests/integration/redis_container_test.py deleted file mode 100644 index 51e6712..0000000 --- a/tests/integration/redis_container_test.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Redis test container without testcontainers' deprecated wait decorator.""" - -from typing import Any, cast - -import redis -from testcontainers.core.container import DockerContainer -from testcontainers.core.waiting_utils import WaitStrategy, WaitStrategyTarget - -REDIS_PORT = 6379 - - -class _RedisPingWaitStrategy(WaitStrategy): - def __init__(self) -> None: - super().__init__() - self.with_transient_exceptions(redis.exceptions.ConnectionError) - - def wait_until_ready(self, container: WaitStrategyTarget) -> None: - redis_container = cast("RedisTestContainer", container) - if not self._poll(lambda: redis_container.get_client().ping()): - raise redis.exceptions.ConnectionError("Could not connect to Redis") - - -class RedisTestContainer(DockerContainer): - """Redis container using wait strategies instead of the deprecated decorator.""" - - def __init__(self, image: str, port: int = REDIS_PORT) -> None: - super().__init__(image, _wait_strategy=_RedisPingWaitStrategy()) - self.port = port - self.with_exposed_ports(self.port) - - def get_client(self, **kwargs: Any) -> redis.Redis: - return redis.Redis( - host=self.get_container_host_ip(), - port=self.get_exposed_port(self.port), - **kwargs, - ) -- 2.54.0