From 5dad0e7e20e99fa610668bdb9e7fbcb994447406 Mon Sep 17 00:00:00 2001 From: Balint Bartha <39852431+totallyzen@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:14:37 +0100 Subject: [PATCH 1/3] feat(compose): support for setting profiles --- core/testcontainers/compose/compose.py | 4 ++++ .../profile_support/compose.yaml | 16 +++++++++++++ core/tests/test_compose.py | 24 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 core/tests/compose_fixtures/profile_support/compose.yaml diff --git a/core/testcontainers/compose/compose.py b/core/testcontainers/compose/compose.py index 564eda8fb..3f5438186 100644 --- a/core/testcontainers/compose/compose.py +++ b/core/testcontainers/compose/compose.py @@ -171,6 +171,7 @@ class DockerCompose: env_file: Optional[str] = None services: Optional[list[str]] = None docker_command_path: Optional[str] = None + profiles: Optional[list[str]] = None def __post_init__(self): if isinstance(self.compose_file_name, str): @@ -225,6 +226,9 @@ def start(self) -> None: # we run in detached mode instead of blocking up_cmd.append("--detach") + if self.profiles: + up_cmd.extend([item for profile in self.profiles for item in ["--profile", profile]]) + if self.services: up_cmd.extend(self.services) diff --git a/core/tests/compose_fixtures/profile_support/compose.yaml b/core/tests/compose_fixtures/profile_support/compose.yaml new file mode 100644 index 000000000..c7bec7cc9 --- /dev/null +++ b/core/tests/compose_fixtures/profile_support/compose.yaml @@ -0,0 +1,16 @@ +services: + runs-always: &simple-service + image: alpine:latest + init: true + command: + - sh + - -c + - 'while true; do sleep 0.1 ; date -Ins; done' + runs-profile-a: + <<: *simple-service + profiles: + - profile-a + runs-profile-b: + <<: *simple-service + profiles: + - profile-b diff --git a/core/tests/test_compose.py b/core/tests/test_compose.py index b43da28c5..088934ac4 100644 --- a/core/tests/test_compose.py +++ b/core/tests/test_compose.py @@ -352,3 +352,27 @@ def fetch(req: Union[Request, str]): if 200 < res.getcode() >= 400: raise Exception(f"HTTP Error: {res.getcode()} - {res.reason}: {body}") return res.getcode(), body + + +@pytest.mark.parametrize( + argnames=["profiles", "running", "not_running"], + argvalues=[ + pytest.param(None, ["runs-always"], ["runs-profile-a", "runs-profile-b"], id="default"), + pytest.param( + ["profile-a"], ["runs-always", "runs-profile-a"], ["runs-profile-b"], id="one-additional-profile-via-str" + ), + pytest.param( + ["profile-a", "profile-b"], + ["runs-always", "runs-profile-a", "runs-profile-b"], + [], + id="all-profiles-explicitly", + ), + ], +) +def test_compose_profile_support(profiles: list[str] | None, running: list[str], not_running: list[str]): + with DockerCompose(context=FIXTURES / "profile_support", profiles=profiles) as compose: + for service in running: + assert compose.get_container(service) is not None + for service in not_running: + with pytest.raises(ContainerIsNotRunning): + compose.get_container(service) From 097074368ced9ba929654a253f72f5739cb2f5c8 Mon Sep 17 00:00:00 2001 From: Balint Bartha <39852431+totallyzen@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:19:22 +0100 Subject: [PATCH 2/3] fix: use optional instead of pipe in type annotation --- core/tests/test_compose.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/tests/test_compose.py b/core/tests/test_compose.py index 088934ac4..9279ce3f7 100644 --- a/core/tests/test_compose.py +++ b/core/tests/test_compose.py @@ -2,7 +2,7 @@ from pathlib import Path from re import split from time import sleep -from typing import Union +from typing import Union, Optional from urllib.request import urlopen, Request import pytest @@ -369,7 +369,7 @@ def fetch(req: Union[Request, str]): ), ], ) -def test_compose_profile_support(profiles: list[str] | None, running: list[str], not_running: list[str]): +def test_compose_profile_support(profiles: Optional[list[str]], running: list[str], not_running: list[str]): with DockerCompose(context=FIXTURES / "profile_support", profiles=profiles) as compose: for service in running: assert compose.get_container(service) is not None From 59da76b2d3e424f7b7cd346b14ac5ad9015c06c8 Mon Sep 17 00:00:00 2001 From: Balint Bartha <39852431+totallyzen@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:25:47 +0100 Subject: [PATCH 3/3] fix: profiles is supported for all compose commands --- core/testcontainers/compose/compose.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/testcontainers/compose/compose.py b/core/testcontainers/compose/compose.py index 3f5438186..e8ce37451 100644 --- a/core/testcontainers/compose/compose.py +++ b/core/testcontainers/compose/compose.py @@ -199,6 +199,8 @@ def compose_command_property(self) -> list[str]: if self.compose_file_name: for file in self.compose_file_name: docker_compose_cmd += ["-f", file] + if self.profiles: + docker_compose_cmd += [item for profile in self.profiles for item in ["--profile", profile]] if self.env_file: docker_compose_cmd += ["--env-file", self.env_file] return docker_compose_cmd @@ -226,9 +228,6 @@ def start(self) -> None: # we run in detached mode instead of blocking up_cmd.append("--detach") - if self.profiles: - up_cmd.extend([item for profile in self.profiles for item in ["--profile", profile]]) - if self.services: up_cmd.extend(self.services)