فهرست منبع

tests: Fixture that simplifies Docker compose file changes

Richard Hansen 2 سال پیش
والد
کامیت
4d8f878ba7
1فایلهای تغییر یافته به همراه37 افزوده شده و 9 حذف شده
  1. 37 9
      test/conftest.py

+ 37 - 9
test/conftest.py

@@ -416,6 +416,35 @@ def connect_to_all_networks():
         return [connect_to_network(network) for network in networks]
 
 
+class DockerComposer(contextlib.AbstractContextManager):
+    def __init__(self):
+        self._docker_compose_file = None
+
+    def __exit__(self, *exc_info):
+        self._down()
+
+    def _down(self):
+        if self._docker_compose_file is None:
+            return
+        for network in self._networks:
+            disconnect_from_network(network)
+        docker_compose_down(self._docker_compose_file)
+        self._docker_compose_file = None
+
+    def compose(self, docker_compose_file):
+        if docker_compose_file == self._docker_compose_file:
+            return
+        self._down()
+        if docker_compose_file is None:
+            return
+        remove_all_containers()
+        docker_compose_up(docker_compose_file)
+        self._networks = connect_to_all_networks()
+        wait_for_nginxproxy_to_be_ready()
+        time.sleep(3)  # give time to containers to be ready
+        self._docker_compose_file = docker_compose_file
+
+
 ###############################################################################
 #
 # Py.test fixtures
@@ -423,6 +452,12 @@ def connect_to_all_networks():
 ###############################################################################
 
 
+@pytest.fixture(scope="module")
+def docker_composer():
+    with DockerComposer() as d:
+        yield d
+
+
 @pytest.fixture
 def ca_root_certificate():
     return CA_ROOT_CERTIFICATE
@@ -436,7 +471,7 @@ def monkey_patched_dns():
 
 
 @pytest.fixture(scope="module")
-def docker_compose(monkey_patched_dns, docker_compose_file):
+def docker_compose(monkey_patched_dns, docker_composer, docker_compose_file):
     """Ensures containers described in a docker compose file are started.
 
     A custom docker compose file name can be specified by overriding the `docker_compose_file`
@@ -445,15 +480,8 @@ def docker_compose(monkey_patched_dns, docker_compose_file):
     Also, in the case where pytest is running from a docker container, this fixture makes sure
     our container will be attached to all the docker networks.
     """
-    remove_all_containers()
-    docker_compose_up(docker_compose_file)
-    networks = connect_to_all_networks()
-    wait_for_nginxproxy_to_be_ready()
-    time.sleep(3)  # give time to containers to be ready
+    docker_composer.compose(docker_compose_file)
     yield docker_client
-    for network in networks:
-        disconnect_from_network(network)
-    docker_compose_down(docker_compose_file)
 
 
 @pytest.fixture()