summaryrefslogtreecommitdiffstats
path: root/test/test_main.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_main.py')
-rw-r--r--test/test_main.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/test/test_main.py b/test/test_main.py
new file mode 100644
index 0000000..870926f
--- /dev/null
+++ b/test/test_main.py
@@ -0,0 +1,84 @@
+"""Tests related to ansiblelint.__main__ module."""
+import os
+import shutil
+import subprocess
+import sys
+import time
+from pathlib import Path
+
+import pytest
+from pytest_mock import MockerFixture
+
+from ansiblelint.config import get_version_warning
+
+
+@pytest.mark.parametrize(
+ ("expected_warning"),
+ (False, True),
+ ids=("normal", "isolated"),
+)
+def test_call_from_outside_venv(expected_warning: bool) -> None:
+ """Asserts ability to be called w/ or w/o venv activation."""
+ git_location = shutil.which("git")
+ if not git_location:
+ pytest.fail("git not found")
+ git_path = Path(git_location).parent
+
+ if expected_warning:
+ env = {"HOME": str(Path.home()), "PATH": str(git_path)}
+ else:
+ env = os.environ.copy()
+
+ for v in ("COVERAGE_FILE", "COVERAGE_PROCESS_START"):
+ if v in os.environ:
+ env[v] = os.environ[v]
+
+ py_path = Path(sys.executable).parent
+ # Passing custom env prevents the process from inheriting PATH or other
+ # environment variables from the current process, so we emulate being
+ # called from outside the venv.
+ proc = subprocess.run(
+ [str(py_path / "ansible-lint"), "--version"],
+ check=False,
+ capture_output=True,
+ text=True,
+ env=env,
+ )
+ assert proc.returncode == 0, proc
+ warning_found = "PATH altered to include" in proc.stderr
+ assert warning_found is expected_warning
+
+
+@pytest.mark.parametrize(
+ ("ver_diff", "found", "check", "outlen"),
+ (
+ ("v1.2.2", True, "pre-release", 1),
+ ("v1.2.3", False, "", 1),
+ ("v1.2.4", True, "new release", 2),
+ ),
+)
+def test_get_version_warning(
+ mocker: MockerFixture,
+ ver_diff: str,
+ found: bool,
+ check: str,
+ outlen: int,
+) -> None:
+ """Assert get_version_warning working as expected."""
+ data = f'{{"html_url": "https://127.0.0.1", "tag_name": "{ver_diff}"}}'
+ # simulate cache file
+ mocker.patch("os.path.exists", return_value=True)
+ mocker.patch("os.path.getmtime", return_value=time.time())
+ mocker.patch("builtins.open", mocker.mock_open(read_data=data))
+ # overwrite ansible-lint version
+ mocker.patch("ansiblelint.config.__version__", "1.2.3")
+ # overwrite install method to custom one. This one will increase msg line count
+ # to easily detect unwanted call to it.
+ mocker.patch("ansiblelint.config.guess_install_method", return_value="\n")
+ msg = get_version_warning()
+
+ if not found:
+ assert msg == check
+ else:
+ assert check in msg
+ assert len(msg.split("\n")) == outlen