Avoid testcontainers Redis deprecation warning in integration tests.
Code Quality Pipeline / code-quality (pull_request) Successful in 47s
PR Title Check / check-title (pull_request) Successful in 5s
Test Python Package / test (pull_request) Successful in 52s

Use a local RedisTestContainer with wait strategies instead of the deprecated RedisContainer, and keep conftest focused on fixtures.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Brian Bjarke Jensen
2026-06-29 15:00:45 +02:00
co-authored by Cursor
parent 3073bfbf50
commit 0096df78a5
2 changed files with 49 additions and 10 deletions
+13 -10
View File
@@ -1,16 +1,19 @@
"""Integration tests configuration.""" """Integration tests configuration."""
import logging
import os import os
from collections.abc import Generator from collections.abc import Generator
import pytest import pytest
import redis import redis
import structlog import structlog
import logging
from minio import Minio from minio import Minio
from testcontainers.redis import RedisContainer
from testcontainers.minio import MinioContainer from testcontainers.minio import MinioContainer
from tests.integration.redis_container_test import REDIS_PORT, RedisTestContainer
collect_ignore = ["redis_container_test.py"]
MINIO_ACCESS_KEY = "minioadmin" MINIO_ACCESS_KEY = "minioadmin"
MINIO_SECRET_KEY = "minioadmin" MINIO_SECRET_KEY = "minioadmin"
MINIO_BUCKET = "test-bucket" MINIO_BUCKET = "test-bucket"
@@ -37,16 +40,16 @@ def configure_logging() -> None:
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def redis_container() -> Generator[str]: def redis_container() -> Generator[str, None, None]:
"""Set up a Redis container for testing and yield the Redis URI.""" """Set up a Redis container for testing and yield the Redis URI."""
# Start container # Start container
container = RedisContainer( container = RedisTestContainer(
image="redis/redis-stack:7.2.0-v0", image="redis/redis-stack:7.2.0-v0",
) )
container.start() container.start()
# Set environment variable for Redis URI # Set environment variable for Redis URI
redis_host = container.get_container_host_ip() redis_host = container.get_container_host_ip()
redis_port = container.get_exposed_port(6379) redis_port = container.get_exposed_port(REDIS_PORT)
redis_uri = f"redis://{redis_host}:{redis_port}" redis_uri = f"redis://{redis_host}:{redis_port}"
yield redis_uri yield redis_uri
@@ -56,7 +59,7 @@ def redis_container() -> Generator[str]:
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def minio_container() -> Generator[dict[str, str]]: def minio_container() -> Generator[dict[str, str], None, None]:
"""Set up a Minio container for testing and yield the Minio URI.""" """Set up a Minio container for testing and yield the Minio URI."""
# Start container # Start container
container = MinioContainer( container = MinioContainer(
@@ -86,7 +89,7 @@ def minio_container() -> Generator[dict[str, str]]:
def set_environment_variables( def set_environment_variables(
redis_container: str, redis_container: str,
minio_container: dict[str, str], minio_container: dict[str, str],
) -> Generator[dict[str, str]]: ) -> Generator[dict[str, str], None, None]:
"""Set environment variables needed for tests.""" """Set environment variables needed for tests."""
# Build environment variables dictionary # Build environment variables dictionary
env_vars = {"REDIS_URI": redis_container} env_vars = {"REDIS_URI": redis_container}
@@ -103,7 +106,7 @@ def set_environment_variables(
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def raw_redis_client(redis_container: str) -> Generator[redis.Redis]: def raw_redis_client(redis_container: str) -> Generator[redis.Redis, None, None]:
"""Provide a raw Redis client connected to the test Redis container.""" """Provide a raw Redis client connected to the test Redis container."""
# Connect client # Connect client
client = redis.Redis.from_url( client = redis.Redis.from_url(
@@ -119,7 +122,7 @@ def raw_redis_client(redis_container: str) -> Generator[redis.Redis]:
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def raw_minio_client(minio_container: dict[str, str]) -> Generator[Minio]: def raw_minio_client(minio_container: dict[str, str]) -> Generator[Minio, None, None]:
"""Provide a raw Minio client connected to the test Minio container.""" """Provide a raw Minio client connected to the test Minio container."""
# Connect client # Connect client
client = Minio( client = Minio(
+36
View File
@@ -0,0 +1,36 @@
"""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,
)