1+ import pytest
2+ import os
3+
4+
5+ import pytest_asyncio
6+ from python_on_whales import docker as libdocker
7+ from reattempt import reattempt
8+ import logging
9+ import uuid
10+
11+ from pydocks .plugin import (
12+ clean_containers ,
13+ socket_test_connection ,
14+ wait_and_run_container ,
15+ )
16+
17+
18+ logger = logging .getLogger ("pydocks" )
19+ logger .addHandler (logging .NullHandler ())
20+
21+
22+ # https://hub.docker.com/r/valkey/valkey/tags
23+ TEST_VALKEY_DOCKER_IMAGE : str = "docker.io/valkey/valkey:8.1.1"
24+
25+
26+ @pytest_asyncio .fixture (scope = "session" , loop_scope = "session" )
27+ async def valkey_clean_all_containers (docker ):
28+ container_name : str = "test-valkey"
29+ # clean before
30+
31+ await clean_containers (docker , container_name )
32+ yield
33+ # clean after
34+ await clean_containers (docker , container_name )
35+
36+
37+ @pytest .fixture (scope = "function" )
38+ async def valkey_container (docker : libdocker , mocker ): # type: ignore
39+ mocker .patch (
40+ "logging.exception" ,
41+ lambda * args , ** kwargs : logger .warning (f"Exception raised { args } " ),
42+ )
43+
44+ container_name = f"test-valkey-{ uuid .uuid4 ()} "
45+ # optional : await clean_containers(docker, container_name)
46+
47+ async for container in setup_valkey_container (docker , container_name ):
48+ yield container
49+
50+
51+ @pytest_asyncio .fixture (scope = "session" , loop_scope = "session" )
52+ async def valkey_container_session (docker : libdocker , session_mocker ): # type: ignore
53+ session_mocker .patch (
54+ "logging.exception" ,
55+ lambda * args , ** kwargs : logger .warning (f"Exception raised { args } " ),
56+ )
57+
58+ await clean_containers (docker , "test-valkey-session" )
59+
60+ container_name = f"test-valkey-session-{ uuid .uuid4 ()} "
61+
62+ async for container in setup_valkey_container (docker , container_name ):
63+ yield container
64+
65+
66+ async def setup_valkey_container (docker : libdocker , container_name ): # type: ignore
67+ valkey_image = (
68+ TEST_VALKEY_DOCKER_IMAGE
69+ if "TEST_VALKEY_DOCKER_IMAGE" not in os .environ
70+ else os .environ ["TEST_VALKEY_DOCKER_IMAGE" ]
71+ )
72+ logger .debug (f"pull docker image : { valkey_image } " )
73+
74+ def run_container (container_name : str ):
75+ return docker .run (
76+ image = valkey_image ,
77+ name = container_name ,
78+ detach = True ,
79+ publish = [(6380 , 6379 )],
80+ expose = [6380 ],
81+ )
82+
83+ # Select the container with the given name if exists, else create a new one
84+ containers = docker .ps (all = True , filters = {"name" : f"^{ container_name } $" })
85+ if containers and len (containers ) > 0 :
86+ container = containers [0 ] # type: ignore
87+ logger .debug (f"found existing container: { container_name } " )
88+ else :
89+ logger .debug (f"no existing container found, creating new one: { container_name } " )
90+ container = run_container (container_name )
91+
92+ await valkey_test_connection ()
93+
94+ async for instance in wait_and_run_container (docker , container , container_name ):
95+ yield instance
96+
97+
98+ @reattempt (max_retries = 30 , min_time = 0.1 , max_time = 0.5 )
99+ async def valkey_test_connection ():
100+ await socket_test_connection ("127.0.0.1" , 6380 )
0 commit comments