Skip to content

Commit

Permalink
tests/integration: Automate 'env-file-tests' manual tests
Browse files Browse the repository at this point in the history
Signed-off-by: Monika Kairaityte <monika@kibit.lt>
  • Loading branch information
mokibit committed Jul 20, 2024
1 parent 255da76 commit 36c7203
Show file tree
Hide file tree
Showing 4 changed files with 258 additions and 38 deletions.
37 changes: 0 additions & 37 deletions tests/integration/env-file-tests/README.md

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
@@ -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
246 changes: 246 additions & 0 deletions tests/integration/test_podman_compose_env_file.py
Original file line number Diff line number Diff line change
@@ -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",
])

0 comments on commit 36c7203

Please sign in to comment.