From 36c7203f8a9283d9f9e08765a6e339dd25d53a38 Mon Sep 17 00:00:00 2001 From: Monika Kairaityte Date: Sat, 20 Jul 2024 16:39:06 +0200 Subject: [PATCH] tests/integration: Automate 'env-file-tests' manual tests Signed-off-by: Monika Kairaityte --- tests/integration/env-file-tests/README.md | 37 --- ...compose.env-file-obj-optional-exists.yaml} | 2 +- ...compose.env-file-obj-optional-missing.yaml | 11 + .../test_podman_compose_env_file.py | 246 ++++++++++++++++++ 4 files changed, 258 insertions(+), 38 deletions(-) delete mode 100644 tests/integration/env-file-tests/README.md rename tests/integration/env-file-tests/project/{container-compose.env-file-obj-optional.yaml => container-compose.env-file-obj-optional-exists.yaml} (77%) create mode 100644 tests/integration/env-file-tests/project/container-compose.env-file-obj-optional-missing.yaml create mode 100644 tests/integration/test_podman_compose_env_file.py diff --git a/tests/integration/env-file-tests/README.md b/tests/integration/env-file-tests/README.md deleted file mode 100644 index 9de7018..0000000 --- a/tests/integration/env-file-tests/README.md +++ /dev/null @@ -1,37 +0,0 @@ -running the following commands should always give podman-rocks-123 - -``` -podman-compose -f project/container-compose.yaml --env-file env-files/project-1.env up -``` - -``` -podman-compose -f $(pwd)/project/container-compose.yaml --env-file $(pwd)/env-files/project-1.env up -``` - -``` -podman-compose -f $(pwd)/project/container-compose.env-file-flat.yaml up -``` - -``` -podman-compose -f $(pwd)/project/container-compose.env-file-obj.yaml up -``` - -``` -podman-compose -f $(pwd)/project/container-compose.env-file-obj-optional.yaml up -``` - -based on environment variable precedent this command should give podman-rocks-321 - -``` -ZZVAR1=podman-rocks-321 podman-compose -f $(pwd)/project/container-compose.yaml --env-file $(pwd)/env-files/project-1.env up -``` - -_The below test should print three environment variables_ - -``` -podman-compose -f $(pwd)/project/container-compose.load-.env-in-project.yaml run --rm app - -ZZVAR1=This value is overwritten by env-file-tests/.env -ZZVAR2=This value is loaded from .env in project/ directory -ZZVAR3=This value is loaded from env-file-tests/.env -``` diff --git a/tests/integration/env-file-tests/project/container-compose.env-file-obj-optional.yaml b/tests/integration/env-file-tests/project/container-compose.env-file-obj-optional-exists.yaml similarity index 77% rename from tests/integration/env-file-tests/project/container-compose.env-file-obj-optional.yaml rename to tests/integration/env-file-tests/project/container-compose.env-file-obj-optional-exists.yaml index cfcdb64..24eaccc 100644 --- a/tests/integration/env-file-tests/project/container-compose.env-file-obj-optional.yaml +++ b/tests/integration/env-file-tests/project/container-compose.env-file-obj-optional-exists.yaml @@ -7,5 +7,5 @@ services: - /tmp env_file: - path: ../env-files/project-1.env - - path: ../env-files/project-2.env + - path: ../env-files/project-2.env # this file exists required: false diff --git a/tests/integration/env-file-tests/project/container-compose.env-file-obj-optional-missing.yaml b/tests/integration/env-file-tests/project/container-compose.env-file-obj-optional-missing.yaml new file mode 100644 index 0000000..7c1d0ab --- /dev/null +++ b/tests/integration/env-file-tests/project/container-compose.env-file-obj-optional-missing.yaml @@ -0,0 +1,11 @@ +services: + app: + image: busybox + command: ["/bin/busybox", "sh", "-c", "env | grep ZZ"] + tmpfs: + - /run + - /tmp + env_file: + - path: ../env-files/project-1.env + - path: ../env-files/project-3.env # this file is missing + required: false diff --git a/tests/integration/test_podman_compose_env_file.py b/tests/integration/test_podman_compose_env_file.py new file mode 100644 index 0000000..cb8fdae --- /dev/null +++ b/tests/integration/test_podman_compose_env_file.py @@ -0,0 +1,246 @@ +# SPDX-License-Identifier: GPL-2.0 + +import os +import unittest + +from tests.integration.test_podman_compose import podman_compose_path +from tests.integration.test_podman_compose import test_path +from tests.integration.test_utils import RunSubprocessMixin + + +def compose_base_path(): + """Returns the base path used for this test module""" + return os.path.join(test_path(), "env-file-tests") + + +class TestComposeEnvFile(unittest.TestCase, RunSubprocessMixin): + def test_path_env_file_inline(self): + # Test taking env variable value directly from env-file when its path is inline path + base_path = compose_base_path() + path_compose_file = os.path.join(base_path, "project/container-compose.yaml") + try: + output, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "--env-file", + os.path.join(base_path, "env-files/project-1.env"), + "up", + ]) + output_logs, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "logs", + ]) + # takes only value ZZVAR1 as container-compose.yaml file requires + self.assertEqual(b"ZZVAR1=podman-rocks-123\n", output_logs) + finally: + self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "down", + ]) + + def test_path_env_file_flat_in_compose_file(self): + # Test taking env variable value from env-file/project-1.env which was declared in + # compose file's env_file + base_path = compose_base_path() + path_compose_file = os.path.join(base_path, "project/container-compose.env-file-flat.yaml") + try: + output, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "up", + ]) + output_logs, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "logs", + ]) + # takes all values with a substring ZZ as container-compose.env-file-flat.yaml + # file requires + self.assertEqual( + b"ZZVAR1=podman-rocks-123\nZZVAR2=podman-rocks-124\nZZVAR3=podman-rocks-125\n", + output_logs, + ) + finally: + self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "down", + ]) + + def test_path_env_file_obj_in_compose_file(self): + # take variable value from env-file project-1.env which was declared in compose + # file's env_file by -path: ... + base_path = compose_base_path() + path_compose_file = os.path.join(base_path, "project/container-compose.env-file-obj.yaml") + try: + output, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "up", + ]) + output_logs, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "logs", + ]) + # takes all values with a substring ZZ as container-compose.env-file-obj.yaml + # file requires + self.assertEqual( + b"ZZVAR1=podman-rocks-123\nZZVAR2=podman-rocks-124\nZZVAR3=podman-rocks-125\n", + output_logs, + ) + finally: + self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "down", + ]) + + def test_exists_optional_env_file_path_in_compose_file(self): + # test taking env variable values from several env-files when one of them is optional + # and exists + base_path = compose_base_path() + path_compose_file = os.path.join( + base_path, "project/container-compose.env-file-obj-optional-exists.yaml" + ) + try: + output, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "up", + ]) + output_logs, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "logs", + ]) + # FIXME: gives a weird output, needs to be double checked + self.assertEqual( + b"ZZVAR1=podman-rocks-223\nZZVAR2=podman-rocks-224\nZZVAR3=podman-rocks-125\n", + output_logs, + ) + finally: + self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "down", + ]) + + def test_missing_optional_env_file_path_in_compose_file(self): + # test taking env variable values from several env-files when one of them is optional and + # is missing (silently skip it) + base_path = compose_base_path() + path_compose_file = os.path.join( + base_path, "project/container-compose.env-file-obj-optional-missing.yaml" + ) + try: + output, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "up", + ]) + output_logs, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "logs", + ]) + # takes all values with a substring ZZ as container-compose.env-file-obj-optional.yaml + # file requires + self.assertEqual( + b"ZZVAR1=podman-rocks-123\nZZVAR2=podman-rocks-124\nZZVAR3=podman-rocks-125\n", + output_logs, + ) + finally: + self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "down", + ]) + + def test_var_value_inline_overrides_env_file_path_inline(self): + # Test overriding env value when value is declared in inline command + base_path = compose_base_path() + path_compose_file = os.path.join(base_path, "project/container-compose.yaml") + try: + output, _ = self.run_subprocess_assert_returncode([ + "env", + "ZZVAR1=podman-rocks-321", + podman_compose_path(), + "-f", + path_compose_file, + "--env-file", + os.path.join(base_path, "env-files/project-1.env"), + "up", + ]) + output_logs, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "logs", + ]) + # takes only value ZZVAR1 as container-compose.yaml file requires + self.assertEqual(b"ZZVAR1=podman-rocks-321\n", output_logs) + finally: + self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "down", + ]) + + def test_taking_env_variables_from_env_files_from_different_directories(self): + # FIXME: It is not clear what this test actually tests, but from README.md it looks like: + # Test overriding env values by directory env-files-tests/.env file values + # and only take value from project/.env, when it does not exist in env-files-tests/.env + base_path = compose_base_path() + path_compose_file = os.path.join( + base_path, "project/container-compose.load-.env-in-project.yaml" + ) + try: + # looks like 'run' command does not actually create a container, so output_logs can not + # be used for test comparison + output, _ = self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "run", + "--rm", + "app", + ]) + # takes all values with a substring ZZ as container-compose.load-.env-in-project.yaml + # file requires + decoded_string = output.decode('utf-8') + index_first_newline = decoded_string.find('\n') + string_without_numbers = decoded_string[index_first_newline + 1 : len(decoded_string)] + removed_r_string = string_without_numbers.replace( + '\r', '' + ) # idk where this \r comes from + + test_output = "ZZVAR1=This value is loaded but should be overwritten\nZZVAR2=This " \ + "value is loaded from .env in project/ directory\nZZVAR3=\n" + + self.assertEqual(removed_r_string, test_output) + finally: + self.run_subprocess_assert_returncode([ + podman_compose_path(), + "-f", + path_compose_file, + "down", + ])