mirror of
https://github.com/containers/podman-compose.git
synced 2025-08-16 08:38:04 +02:00
Migrate tests to unittest
unittest is much more straightforward without any magic. In a small project like podman-compose being easy to understand is more important than features. Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
This commit is contained in:
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
@ -1,27 +0,0 @@
|
||||
"""conftest.py
|
||||
|
||||
Defines global pytest fixtures available to all tests.
|
||||
"""
|
||||
|
||||
# pylint: disable=redefined-outer-name
|
||||
from pathlib import Path
|
||||
import os
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def base_path():
|
||||
"""Returns the base path for the project"""
|
||||
return Path(__file__).parent.parent
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def test_path(base_path):
|
||||
"""Returns the path to the tests directory"""
|
||||
return os.path.join(base_path, "tests")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def podman_compose_path(base_path):
|
||||
"""Returns the path to the podman compose script"""
|
||||
return os.path.join(base_path, "podman_compose.py")
|
@ -1,8 +1,10 @@
|
||||
from pathlib import Path
|
||||
import subprocess
|
||||
import os
|
||||
import unittest
|
||||
|
||||
|
||||
def capture(command):
|
||||
def run_subprocess(command):
|
||||
proc = subprocess.Popen(
|
||||
command,
|
||||
stdout=subprocess.PIPE,
|
||||
@ -12,75 +14,89 @@ def capture(command):
|
||||
return out, err, proc.returncode
|
||||
|
||||
|
||||
def test_podman_compose_extends_w_file_subdir():
|
||||
"""
|
||||
Test that podman-compose can execute podman-compose -f <file> up with extended File which
|
||||
includes a build context
|
||||
:return:
|
||||
"""
|
||||
main_path = Path(__file__).parent.parent
|
||||
|
||||
command_up = [
|
||||
"coverage",
|
||||
"run",
|
||||
str(main_path.joinpath("podman_compose.py")),
|
||||
"-f",
|
||||
str(main_path.joinpath("tests", "extends_w_file_subdir", "docker-compose.yml")),
|
||||
"up",
|
||||
"-d",
|
||||
]
|
||||
|
||||
command_check_container = [
|
||||
"coverage",
|
||||
"run",
|
||||
str(main_path.joinpath("podman_compose.py")),
|
||||
"-f",
|
||||
str(main_path.joinpath("tests", "extends_w_file_subdir", "docker-compose.yml")),
|
||||
"ps",
|
||||
"--format",
|
||||
'{{.Image}}',
|
||||
]
|
||||
|
||||
command_down = [
|
||||
"podman",
|
||||
"rmi",
|
||||
"--force",
|
||||
"localhost/subdir_test:me",
|
||||
"docker.io/library/busybox",
|
||||
]
|
||||
|
||||
out, _, returncode = capture(command_up)
|
||||
assert 0 == returncode
|
||||
# check container was created and exists
|
||||
out, err, returncode = capture(command_check_container)
|
||||
assert 0 == returncode
|
||||
assert b'localhost/subdir_test:me\n' == out
|
||||
out, _, returncode = capture(command_down)
|
||||
# cleanup test image(tags)
|
||||
assert 0 == returncode
|
||||
print('ok')
|
||||
# check container did not exists anymore
|
||||
out, _, returncode = capture(command_check_container)
|
||||
assert 0 == returncode
|
||||
assert b'' == out
|
||||
def base_path():
|
||||
"""Returns the base path for the project"""
|
||||
return Path(__file__).parent.parent
|
||||
|
||||
|
||||
def test_podman_compose_extends_w_empty_service():
|
||||
"""
|
||||
Test that podman-compose can execute podman-compose -f <file> up with extended File which
|
||||
includes an empty service. (e.g. if the file is used as placeholder for more complex configurations.)
|
||||
:return:
|
||||
"""
|
||||
main_path = Path(__file__).parent.parent
|
||||
def test_path():
|
||||
"""Returns the path to the tests directory"""
|
||||
return os.path.join(base_path(), "tests")
|
||||
|
||||
command_up = [
|
||||
"python3",
|
||||
str(main_path.joinpath("podman_compose.py")),
|
||||
"-f",
|
||||
str(main_path.joinpath("tests", "extends_w_empty_service", "docker-compose.yml")),
|
||||
"up",
|
||||
"-d",
|
||||
]
|
||||
|
||||
_, _, returncode = capture(command_up)
|
||||
assert 0 == returncode
|
||||
def podman_compose_path():
|
||||
"""Returns the path to the podman compose script"""
|
||||
return os.path.join(base_path(), "podman_compose.py")
|
||||
|
||||
|
||||
class TestPodmanCompose(unittest.TestCase):
|
||||
def test_extends_w_file_subdir(self):
|
||||
"""
|
||||
Test that podman-compose can execute podman-compose -f <file> up with extended File which
|
||||
includes a build context
|
||||
:return:
|
||||
"""
|
||||
main_path = Path(__file__).parent.parent
|
||||
|
||||
command_up = [
|
||||
"coverage",
|
||||
"run",
|
||||
str(main_path.joinpath("podman_compose.py")),
|
||||
"-f",
|
||||
str(main_path.joinpath("tests", "extends_w_file_subdir", "docker-compose.yml")),
|
||||
"up",
|
||||
"-d",
|
||||
]
|
||||
|
||||
command_check_container = [
|
||||
"coverage",
|
||||
"run",
|
||||
str(main_path.joinpath("podman_compose.py")),
|
||||
"-f",
|
||||
str(main_path.joinpath("tests", "extends_w_file_subdir", "docker-compose.yml")),
|
||||
"ps",
|
||||
"--format",
|
||||
'{{.Image}}',
|
||||
]
|
||||
|
||||
command_down = [
|
||||
"podman",
|
||||
"rmi",
|
||||
"--force",
|
||||
"localhost/subdir_test:me",
|
||||
"docker.io/library/busybox",
|
||||
]
|
||||
|
||||
out, _, returncode = run_subprocess(command_up)
|
||||
self.assertEqual(returncode, 0)
|
||||
# check container was created and exists
|
||||
out, err, returncode = run_subprocess(command_check_container)
|
||||
self.assertEqual(returncode, 0)
|
||||
self.assertEqual(out, b'localhost/subdir_test:me\n')
|
||||
out, _, returncode = run_subprocess(command_down)
|
||||
# cleanup test image(tags)
|
||||
self.assertEqual(returncode, 0)
|
||||
# check container did not exists anymore
|
||||
out, _, returncode = run_subprocess(command_check_container)
|
||||
self.assertEqual(returncode, 0)
|
||||
self.assertEqual(out, b'')
|
||||
|
||||
def test_extends_w_empty_service(self):
|
||||
"""
|
||||
Test that podman-compose can execute podman-compose -f <file> up with extended File which
|
||||
includes an empty service. (e.g. if the file is used as placeholder for more complex configurations.)
|
||||
:return:
|
||||
"""
|
||||
main_path = Path(__file__).parent.parent
|
||||
|
||||
command_up = [
|
||||
"python3",
|
||||
str(main_path.joinpath("podman_compose.py")),
|
||||
"-f",
|
||||
str(main_path.joinpath("tests", "extends_w_empty_service", "docker-compose.yml")),
|
||||
"up",
|
||||
"-d",
|
||||
]
|
||||
|
||||
_, _, returncode = run_subprocess(command_up)
|
||||
self.assertEqual(returncode, 0)
|
||||
|
@ -6,72 +6,75 @@ Tests the podman-compose config command which is used to return defined compose
|
||||
|
||||
# pylint: disable=redefined-outer-name
|
||||
import os
|
||||
from test_podman_compose import capture
|
||||
import pytest
|
||||
from .test_podman_compose import podman_compose_path
|
||||
from .test_podman_compose import run_subprocess
|
||||
from .test_podman_compose import test_path
|
||||
import unittest
|
||||
from parameterized import parameterized
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def profile_compose_file(test_path):
|
||||
def profile_compose_file():
|
||||
""" "Returns the path to the `profile` compose file used for this test module"""
|
||||
return os.path.join(test_path, "profile", "docker-compose.yml")
|
||||
return os.path.join(test_path(), "profile", "docker-compose.yml")
|
||||
|
||||
|
||||
def test_config_no_profiles(podman_compose_path, profile_compose_file):
|
||||
"""
|
||||
Tests podman-compose config command without profile enablement.
|
||||
class TestComposeConfig(unittest.TestCase):
|
||||
def test_config_no_profiles(self):
|
||||
"""
|
||||
Tests podman-compose config command without profile enablement.
|
||||
"""
|
||||
config_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
profile_compose_file(),
|
||||
"config",
|
||||
]
|
||||
|
||||
:param podman_compose_path: The fixture used to specify the path to the podman compose file.
|
||||
:param profile_compose_file: The fixtued used to specify the path to the "profile" compose used in the test.
|
||||
"""
|
||||
config_cmd = ["coverage", "run", podman_compose_path, "-f", profile_compose_file, "config"]
|
||||
out, _, return_code = run_subprocess(config_cmd)
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
out, _, return_code = capture(config_cmd)
|
||||
assert return_code == 0
|
||||
string_output = out.decode("utf-8")
|
||||
self.assertIn("default-service", string_output)
|
||||
self.assertNotIn("service-1", string_output)
|
||||
self.assertNotIn("service-2", string_output)
|
||||
|
||||
string_output = out.decode("utf-8")
|
||||
assert "default-service" in string_output
|
||||
assert "service-1" not in string_output
|
||||
assert "service-2" not in string_output
|
||||
@parameterized.expand(
|
||||
[
|
||||
(
|
||||
["--profile", "profile-1", "config"],
|
||||
{"default-service": True, "service-1": True, "service-2": False},
|
||||
),
|
||||
(
|
||||
["--profile", "profile-2", "config"],
|
||||
{"default-service": True, "service-1": False, "service-2": True},
|
||||
),
|
||||
(
|
||||
["--profile", "profile-1", "--profile", "profile-2", "config"],
|
||||
{"default-service": True, "service-1": True, "service-2": True},
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_config_profiles(self, profiles, expected_services):
|
||||
"""
|
||||
Tests podman-compose
|
||||
:param profiles: The enabled profiles for the parameterized test.
|
||||
:param expected_services: Dictionary used to model the expected "enabled" services in the profile.
|
||||
Key = service name, Value = True if the service is enabled, otherwise False.
|
||||
"""
|
||||
config_cmd = ["coverage", "run", podman_compose_path(), "-f", profile_compose_file()]
|
||||
config_cmd.extend(profiles)
|
||||
|
||||
out, _, return_code = run_subprocess(config_cmd)
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"profiles, expected_services",
|
||||
[
|
||||
(
|
||||
["--profile", "profile-1", "config"],
|
||||
{"default-service": True, "service-1": True, "service-2": False},
|
||||
),
|
||||
(
|
||||
["--profile", "profile-2", "config"],
|
||||
{"default-service": True, "service-1": False, "service-2": True},
|
||||
),
|
||||
(
|
||||
["--profile", "profile-1", "--profile", "profile-2", "config"],
|
||||
{"default-service": True, "service-1": True, "service-2": True},
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_config_profiles(podman_compose_path, profile_compose_file, profiles, expected_services):
|
||||
"""
|
||||
Tests podman-compose
|
||||
:param podman_compose_path: The fixture used to specify the path to the podman compose file.
|
||||
:param profile_compose_file: The fixtued used to specify the path to the "profile" compose used in the test.
|
||||
:param profiles: The enabled profiles for the parameterized test.
|
||||
:param expected_services: Dictionary used to model the expected "enabled" services in the profile.
|
||||
Key = service name, Value = True if the service is enabled, otherwise False.
|
||||
"""
|
||||
config_cmd = ["coverage", "run", podman_compose_path, "-f", profile_compose_file]
|
||||
config_cmd.extend(profiles)
|
||||
actual_output = out.decode("utf-8")
|
||||
|
||||
out, _, return_code = capture(config_cmd)
|
||||
assert return_code == 0
|
||||
self.assertEqual(len(expected_services), 3)
|
||||
|
||||
actual_output = out.decode("utf-8")
|
||||
actual_services = {}
|
||||
for service, _ in expected_services.items():
|
||||
actual_services[service] = service in actual_output
|
||||
|
||||
assert len(expected_services) == 3
|
||||
|
||||
actual_services = {}
|
||||
for service, _ in expected_services.items():
|
||||
actual_services[service] = service in actual_output
|
||||
|
||||
assert expected_services == actual_services
|
||||
self.assertEqual(expected_services, actual_services)
|
||||
|
@ -1,8 +1,9 @@
|
||||
from pathlib import Path
|
||||
import subprocess
|
||||
import unittest
|
||||
|
||||
|
||||
def capture(command):
|
||||
def run_subprocess(command):
|
||||
proc = subprocess.Popen(
|
||||
command,
|
||||
stdout=subprocess.PIPE,
|
||||
@ -12,61 +13,62 @@ def capture(command):
|
||||
return out, err, proc.returncode
|
||||
|
||||
|
||||
def test_podman_compose_include():
|
||||
"""
|
||||
Test that podman-compose can execute podman-compose -f <file> up with include
|
||||
:return:
|
||||
"""
|
||||
main_path = Path(__file__).parent.parent
|
||||
class TestPodmanComposeInclude(unittest.TestCase):
|
||||
def test_podman_compose_include(self):
|
||||
"""
|
||||
Test that podman-compose can execute podman-compose -f <file> up with include
|
||||
:return:
|
||||
"""
|
||||
main_path = Path(__file__).parent.parent
|
||||
|
||||
command_up = [
|
||||
"coverage",
|
||||
"run",
|
||||
str(main_path.joinpath("podman_compose.py")),
|
||||
"-f",
|
||||
str(main_path.joinpath("tests", "include", "docker-compose.yaml")),
|
||||
"up",
|
||||
"-d",
|
||||
]
|
||||
command_up = [
|
||||
"coverage",
|
||||
"run",
|
||||
str(main_path.joinpath("podman_compose.py")),
|
||||
"-f",
|
||||
str(main_path.joinpath("tests", "include", "docker-compose.yaml")),
|
||||
"up",
|
||||
"-d",
|
||||
]
|
||||
|
||||
command_check_container = [
|
||||
"podman",
|
||||
"ps",
|
||||
"-a",
|
||||
"--filter",
|
||||
"label=io.podman.compose.project=include",
|
||||
"--format",
|
||||
'"{{.Image}}"',
|
||||
]
|
||||
command_check_container = [
|
||||
"podman",
|
||||
"ps",
|
||||
"-a",
|
||||
"--filter",
|
||||
"label=io.podman.compose.project=include",
|
||||
"--format",
|
||||
'"{{.Image}}"',
|
||||
]
|
||||
|
||||
command_container_id = [
|
||||
"podman",
|
||||
"ps",
|
||||
"-a",
|
||||
"--filter",
|
||||
"label=io.podman.compose.project=include",
|
||||
"--format",
|
||||
'"{{.ID}}"',
|
||||
]
|
||||
command_container_id = [
|
||||
"podman",
|
||||
"ps",
|
||||
"-a",
|
||||
"--filter",
|
||||
"label=io.podman.compose.project=include",
|
||||
"--format",
|
||||
'"{{.ID}}"',
|
||||
]
|
||||
|
||||
command_down = ["podman", "rm", "--force", "CONTAINER_ID"]
|
||||
command_down = ["podman", "rm", "--force", "CONTAINER_ID"]
|
||||
|
||||
out, _, returncode = capture(command_up)
|
||||
assert 0 == returncode
|
||||
out, _, returncode = capture(command_check_container)
|
||||
assert 0 == returncode
|
||||
assert out == b'"docker.io/library/busybox:latest"\n'
|
||||
# Get container ID to remove it
|
||||
out, _, returncode = capture(command_container_id)
|
||||
assert 0 == returncode
|
||||
assert out != b""
|
||||
container_id = out.decode().strip().replace('"', "")
|
||||
command_down[3] = container_id
|
||||
out, _, returncode = capture(command_down)
|
||||
# cleanup test image(tags)
|
||||
assert 0 == returncode
|
||||
assert out != b""
|
||||
# check container did not exists anymore
|
||||
out, _, returncode = capture(command_check_container)
|
||||
assert 0 == returncode
|
||||
assert out == b""
|
||||
out, _, returncode = run_subprocess(command_up)
|
||||
self.assertEqual(returncode, 0)
|
||||
out, _, returncode = run_subprocess(command_check_container)
|
||||
self.assertEqual(returncode, 0)
|
||||
self.assertEqual(out, b'"docker.io/library/busybox:latest"\n')
|
||||
# Get container ID to remove it
|
||||
out, _, returncode = run_subprocess(command_container_id)
|
||||
self.assertEqual(returncode, 0)
|
||||
self.assertNotEqual(out, b"")
|
||||
container_id = out.decode().strip().replace('"', "")
|
||||
command_down[3] = container_id
|
||||
out, _, returncode = run_subprocess(command_down)
|
||||
# cleanup test image(tags)
|
||||
self.assertEqual(returncode, 0)
|
||||
self.assertNotEqual(out, b"")
|
||||
# check container did not exists anymore
|
||||
out, _, returncode = run_subprocess(command_check_container)
|
||||
self.assertEqual(returncode, 0)
|
||||
self.assertEqual(out, b"")
|
||||
|
@ -7,182 +7,192 @@ Tests the podman compose up and down commands used to create and remove services
|
||||
# pylint: disable=redefined-outer-name
|
||||
import os
|
||||
import time
|
||||
import unittest
|
||||
|
||||
from test_podman_compose import capture
|
||||
from .test_podman_compose import run_subprocess
|
||||
from .test_podman_compose import podman_compose_path
|
||||
from .test_podman_compose import test_path
|
||||
|
||||
|
||||
def test_exit_from(podman_compose_path, test_path):
|
||||
up_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"-f",
|
||||
os.path.join(test_path, "exit-from", "docker-compose.yaml"),
|
||||
"up",
|
||||
]
|
||||
class TestPodmanCompose(unittest.TestCase):
|
||||
def test_exit_from(self):
|
||||
up_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
os.path.join(test_path(), "exit-from", "docker-compose.yaml"),
|
||||
"up",
|
||||
]
|
||||
|
||||
out, _, return_code = capture(up_cmd + ["--exit-code-from", "sh1"])
|
||||
assert return_code == 1
|
||||
out, _, return_code = run_subprocess(up_cmd + ["--exit-code-from", "sh1"])
|
||||
self.assertEqual(return_code, 1)
|
||||
|
||||
out, _, return_code = capture(up_cmd + ["--exit-code-from", "sh2"])
|
||||
assert return_code == 2
|
||||
out, _, return_code = run_subprocess(up_cmd + ["--exit-code-from", "sh2"])
|
||||
self.assertEqual(return_code, 2)
|
||||
|
||||
def test_run(self):
|
||||
"""
|
||||
This will test depends_on as well
|
||||
"""
|
||||
run_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
os.path.join(test_path(), "deps", "docker-compose.yaml"),
|
||||
"run",
|
||||
"--rm",
|
||||
"sleep",
|
||||
"/bin/sh",
|
||||
"-c",
|
||||
"wget -q -O - http://web:8000/hosts",
|
||||
]
|
||||
|
||||
def test_run(podman_compose_path, test_path):
|
||||
"""
|
||||
This will test depends_on as well
|
||||
"""
|
||||
run_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"-f",
|
||||
os.path.join(test_path, "deps", "docker-compose.yaml"),
|
||||
"run",
|
||||
"--rm",
|
||||
"sleep",
|
||||
"/bin/sh",
|
||||
"-c",
|
||||
"wget -q -O - http://web:8000/hosts",
|
||||
]
|
||||
out, _, return_code = run_subprocess(run_cmd)
|
||||
self.assertIn(b'127.0.0.1\tlocalhost', out)
|
||||
|
||||
out, _, return_code = capture(run_cmd)
|
||||
assert b'127.0.0.1\tlocalhost' in out
|
||||
# Run it again to make sure we can run it twice. I saw an issue where a second run, with the container left up,
|
||||
# would fail
|
||||
run_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
os.path.join(test_path(), "deps", "docker-compose.yaml"),
|
||||
"run",
|
||||
"--rm",
|
||||
"sleep",
|
||||
"/bin/sh",
|
||||
"-c",
|
||||
"wget -q -O - http://web:8000/hosts",
|
||||
]
|
||||
|
||||
# Run it again to make sure we can run it twice. I saw an issue where a second run, with the container left up,
|
||||
# would fail
|
||||
run_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"-f",
|
||||
os.path.join(test_path, "deps", "docker-compose.yaml"),
|
||||
"run",
|
||||
"--rm",
|
||||
"sleep",
|
||||
"/bin/sh",
|
||||
"-c",
|
||||
"wget -q -O - http://web:8000/hosts",
|
||||
]
|
||||
out, _, return_code = run_subprocess(run_cmd)
|
||||
assert b'127.0.0.1\tlocalhost' in out
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
out, _, return_code = capture(run_cmd)
|
||||
assert b'127.0.0.1\tlocalhost' in out
|
||||
assert return_code == 0
|
||||
# This leaves a container running. Not sure it's intended, but it matches docker-compose
|
||||
down_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
os.path.join(test_path(), "deps", "docker-compose.yaml"),
|
||||
"down",
|
||||
]
|
||||
|
||||
# This leaves a container running. Not sure it's intended, but it matches docker-compose
|
||||
down_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"-f",
|
||||
os.path.join(test_path, "deps", "docker-compose.yaml"),
|
||||
"down",
|
||||
]
|
||||
out, _, return_code = run_subprocess(run_cmd)
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
out, _, return_code = capture(run_cmd)
|
||||
assert return_code == 0
|
||||
def test_up_with_ports(self):
|
||||
up_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
os.path.join(test_path(), "ports", "docker-compose.yml"),
|
||||
"up",
|
||||
"-d",
|
||||
"--force-recreate",
|
||||
]
|
||||
|
||||
down_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
os.path.join(test_path(), "ports", "docker-compose.yml"),
|
||||
"down",
|
||||
"--volumes",
|
||||
]
|
||||
|
||||
def test_up_with_ports(podman_compose_path, test_path):
|
||||
up_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"-f",
|
||||
os.path.join(test_path, "ports", "docker-compose.yml"),
|
||||
"up",
|
||||
"-d",
|
||||
"--force-recreate",
|
||||
]
|
||||
try:
|
||||
out, _, return_code = run_subprocess(up_cmd)
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
down_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"-f",
|
||||
os.path.join(test_path, "ports", "docker-compose.yml"),
|
||||
"down",
|
||||
"--volumes",
|
||||
]
|
||||
finally:
|
||||
out, _, return_code = run_subprocess(down_cmd)
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
try:
|
||||
out, _, return_code = capture(up_cmd)
|
||||
assert return_code == 0
|
||||
def test_down_with_vols(self):
|
||||
up_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
os.path.join(test_path(), "vol", "docker-compose.yaml"),
|
||||
"up",
|
||||
"-d",
|
||||
]
|
||||
|
||||
finally:
|
||||
out, _, return_code = capture(down_cmd)
|
||||
assert return_code == 0
|
||||
down_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
os.path.join(test_path(), "vol", "docker-compose.yaml"),
|
||||
"down",
|
||||
"--volumes",
|
||||
]
|
||||
|
||||
try:
|
||||
out, _, return_code = run_subprocess(["podman", "volume", "create", "my-app-data"])
|
||||
self.assertEqual(return_code, 0)
|
||||
out, _, return_code = run_subprocess([
|
||||
"podman",
|
||||
"volume",
|
||||
"create",
|
||||
"actual-name-of-volume",
|
||||
])
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
def test_down_with_vols(podman_compose_path, test_path):
|
||||
up_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"-f",
|
||||
os.path.join(test_path, "vol", "docker-compose.yaml"),
|
||||
"up",
|
||||
"-d",
|
||||
]
|
||||
out, _, return_code = run_subprocess(up_cmd)
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
down_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"-f",
|
||||
os.path.join(test_path, "vol", "docker-compose.yaml"),
|
||||
"down",
|
||||
"--volumes",
|
||||
]
|
||||
run_subprocess(["podman", "inspect", "volume", ""])
|
||||
|
||||
try:
|
||||
out, _, return_code = capture(["podman", "volume", "create", "my-app-data"])
|
||||
assert return_code == 0
|
||||
out, _, return_code = capture(["podman", "volume", "create", "actual-name-of-volume"])
|
||||
assert return_code == 0
|
||||
finally:
|
||||
out, _, return_code = run_subprocess(down_cmd)
|
||||
run_subprocess(["podman", "volume", "rm", "my-app-data"])
|
||||
run_subprocess(["podman", "volume", "rm", "actual-name-of-volume"])
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
out, _, return_code = capture(up_cmd)
|
||||
assert return_code == 0
|
||||
def test_down_with_orphans(self):
|
||||
container_id, _, return_code = run_subprocess([
|
||||
"podman",
|
||||
"run",
|
||||
"--rm",
|
||||
"-d",
|
||||
"busybox",
|
||||
"/bin/busybox",
|
||||
"httpd",
|
||||
"-f",
|
||||
"-h",
|
||||
"/etc/",
|
||||
"-p",
|
||||
"8000",
|
||||
])
|
||||
|
||||
capture(["podman", "inspect", "volume", ""])
|
||||
down_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
os.path.join(test_path(), "ports", "docker-compose.yml"),
|
||||
"down",
|
||||
"--volumes",
|
||||
"--remove-orphans",
|
||||
]
|
||||
|
||||
finally:
|
||||
out, _, return_code = capture(down_cmd)
|
||||
capture(["podman", "volume", "rm", "my-app-data"])
|
||||
capture(["podman", "volume", "rm", "actual-name-of-volume"])
|
||||
assert return_code == 0
|
||||
out, _, return_code = run_subprocess(down_cmd)
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
_, _, exists = run_subprocess([
|
||||
"podman",
|
||||
"container",
|
||||
"exists",
|
||||
container_id.decode("utf-8"),
|
||||
])
|
||||
|
||||
def test_down_with_orphans(podman_compose_path, test_path):
|
||||
container_id, _, return_code = capture([
|
||||
"podman",
|
||||
"run",
|
||||
"--rm",
|
||||
"-d",
|
||||
"busybox",
|
||||
"/bin/busybox",
|
||||
"httpd",
|
||||
"-f",
|
||||
"-h",
|
||||
"/etc/",
|
||||
"-p",
|
||||
"8000",
|
||||
])
|
||||
|
||||
down_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"-f",
|
||||
os.path.join(test_path, "ports", "docker-compose.yml"),
|
||||
"down",
|
||||
"--volumes",
|
||||
"--remove-orphans",
|
||||
]
|
||||
|
||||
out, _, return_code = capture(down_cmd)
|
||||
assert return_code == 0
|
||||
|
||||
_, _, exists = capture(["podman", "container", "exists", container_id.decode("utf-8")])
|
||||
|
||||
assert exists == 1
|
||||
self.assertEqual(exists, 1)
|
||||
|
@ -6,87 +6,83 @@ Tests the podman compose up and down commands used to create and remove services
|
||||
|
||||
# pylint: disable=redefined-outer-name
|
||||
import os
|
||||
from test_podman_compose import capture
|
||||
import pytest
|
||||
from .test_podman_compose import run_subprocess
|
||||
from .test_podman_compose import podman_compose_path
|
||||
from .test_podman_compose import test_path
|
||||
from parameterized import parameterized
|
||||
import unittest
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def profile_compose_file(test_path):
|
||||
def profile_compose_file():
|
||||
""" "Returns the path to the `profile` compose file used for this test module"""
|
||||
return os.path.join(test_path, "profile", "docker-compose.yml")
|
||||
return os.path.join(test_path(), "profile", "docker-compose.yml")
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def teardown(podman_compose_path, profile_compose_file):
|
||||
"""
|
||||
Ensures that the services within the "profile compose file" are removed between each test case.
|
||||
class TestUpDown(unittest.TestCase):
|
||||
def tearDown(self):
|
||||
"""
|
||||
Ensures that the services within the "profile compose file" are removed between each test case.
|
||||
"""
|
||||
# run the test case
|
||||
|
||||
:param podman_compose_path: The path to the podman compose script.
|
||||
:param profile_compose_file: The path to the compose file used for this test module.
|
||||
"""
|
||||
# run the test case
|
||||
yield
|
||||
down_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"--profile",
|
||||
"profile-1",
|
||||
"--profile",
|
||||
"profile-2",
|
||||
"-f",
|
||||
profile_compose_file(),
|
||||
"down",
|
||||
]
|
||||
run_subprocess(down_cmd)
|
||||
|
||||
down_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"--profile",
|
||||
"profile-1",
|
||||
"--profile",
|
||||
"profile-2",
|
||||
"-f",
|
||||
profile_compose_file,
|
||||
"down",
|
||||
]
|
||||
capture(down_cmd)
|
||||
@parameterized.expand(
|
||||
[
|
||||
(
|
||||
["--profile", "profile-1", "up", "-d"],
|
||||
{"default-service": True, "service-1": True, "service-2": False},
|
||||
),
|
||||
(
|
||||
["--profile", "profile-2", "up", "-d"],
|
||||
{"default-service": True, "service-1": False, "service-2": True},
|
||||
),
|
||||
(
|
||||
["--profile", "profile-1", "--profile", "profile-2", "up", "-d"],
|
||||
{"default-service": True, "service-1": True, "service-2": True},
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_up(self, profiles, expected_services):
|
||||
up_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path(),
|
||||
"-f",
|
||||
profile_compose_file(),
|
||||
]
|
||||
up_cmd.extend(profiles)
|
||||
|
||||
out, _, return_code = run_subprocess(up_cmd)
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"profiles, expected_services",
|
||||
[
|
||||
(
|
||||
["--profile", "profile-1", "up", "-d"],
|
||||
{"default-service": True, "service-1": True, "service-2": False},
|
||||
),
|
||||
(
|
||||
["--profile", "profile-2", "up", "-d"],
|
||||
{"default-service": True, "service-1": False, "service-2": True},
|
||||
),
|
||||
(
|
||||
["--profile", "profile-1", "--profile", "profile-2", "up", "-d"],
|
||||
{"default-service": True, "service-1": True, "service-2": True},
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_up(podman_compose_path, profile_compose_file, profiles, expected_services):
|
||||
up_cmd = [
|
||||
"coverage",
|
||||
"run",
|
||||
podman_compose_path,
|
||||
"-f",
|
||||
profile_compose_file,
|
||||
]
|
||||
up_cmd.extend(profiles)
|
||||
check_cmd = [
|
||||
"podman",
|
||||
"container",
|
||||
"ps",
|
||||
"--format",
|
||||
'"{{.Names}}"',
|
||||
]
|
||||
out, _, return_code = run_subprocess(check_cmd)
|
||||
self.assertEqual(return_code, 0)
|
||||
|
||||
out, _, return_code = capture(up_cmd)
|
||||
assert return_code == 0
|
||||
self.assertEqual(len(expected_services), 3)
|
||||
actual_output = out.decode("utf-8")
|
||||
|
||||
check_cmd = [
|
||||
"podman",
|
||||
"container",
|
||||
"ps",
|
||||
"--format",
|
||||
'"{{.Names}}"',
|
||||
]
|
||||
out, _, return_code = capture(check_cmd)
|
||||
assert return_code == 0
|
||||
actual_services = {}
|
||||
for service, _ in expected_services.items():
|
||||
actual_services[service] = service in actual_output
|
||||
|
||||
assert len(expected_services) == 3
|
||||
actual_output = out.decode("utf-8")
|
||||
|
||||
actual_services = {}
|
||||
for service, _ in expected_services.items():
|
||||
actual_services[service] = service in actual_output
|
||||
|
||||
assert expected_services == actual_services
|
||||
self.assertEqual(expected_services, actual_services)
|
||||
|
Reference in New Issue
Block a user