We have some news to share for the request index beta feature. We’ve added more options to sort your requests, counters to the individual filters and documentation for the search functionality. Checkout the blog post for more details.

File make-tests-compatible-with-venv-bundle.patch of Package salt

From 25c3df7713bd2a19a0980358fa72c1c48a08a1f4 Mon Sep 17 00:00:00 2001
From: Marek Czernek <marek.czernek@suse.com>
Date: Wed, 7 Aug 2024 10:28:07 +0200
Subject: [PATCH] Make tests compatible with venv bundle

Co-authored-by: cmcmarrow <charles.mcmarrow.4@gmail.com>
---
 tests/pytests/functional/modules/test_sdb.py  |  1 +
 tests/pytests/functional/modules/test_yaml.py |  2 +-
 .../rthooks/test_salt_utils_vt_terminal.py    | 22 +++++--
 .../pyinstaller/rthooks/test_subprocess.py    | 22 +++++--
 .../utils/yamllint/test_yamllint.py           |  2 +-
 tests/pytests/unit/modules/test_pip.py        | 63 +++++++++++++------
 .../unit/modules/test_transactional_update.py | 13 ++--
 tests/pytests/unit/states/test_pkgrepo.py     |  3 +-
 tests/pytests/unit/test_fileserver.py         |  8 +--
 tests/pytests/unit/utils/test_gitfs.py        | 18 ++++++
 tests/pytests/unit/utils/test_msgpack.py      |  2 +-
 tests/pytests/unit/utils/test_pycrypto.py     | 25 ++++----
 tests/unit/test_config.py                     | 20 +++++-
 tests/unit/utils/test_sdb.py                  |  2 +-
 tests/unit/utils/test_templates.py            | 34 ++++++++++
 15 files changed, 177 insertions(+), 60 deletions(-)

diff --git a/tests/pytests/functional/modules/test_sdb.py b/tests/pytests/functional/modules/test_sdb.py
index 5519bf8ab57..837e7515d30 100644
--- a/tests/pytests/functional/modules/test_sdb.py
+++ b/tests/pytests/functional/modules/test_sdb.py
@@ -16,6 +16,7 @@ def minion_config_overrides():
         }
 
 
+@pytest.mark.skip("Great module migration")
 @pytest.mark.parametrize(
     "expected_value",
     (
diff --git a/tests/pytests/functional/modules/test_yaml.py b/tests/pytests/functional/modules/test_yaml.py
index 2a8fbc113ff..9aad0dfdc8c 100644
--- a/tests/pytests/functional/modules/test_yaml.py
+++ b/tests/pytests/functional/modules/test_yaml.py
@@ -13,7 +13,7 @@ try:
     import salt.modules.yaml
     import salt.utils.yamllint
 
-    YAMLLINT_AVAILABLE = True
+    YAMLLINT_AVAILABLE = salt.utils.yamllint.has_yamllint()
 except ImportError:
     YAMLLINT_AVAILABLE = False
 
diff --git a/tests/pytests/functional/utils/pyinstaller/rthooks/test_salt_utils_vt_terminal.py b/tests/pytests/functional/utils/pyinstaller/rthooks/test_salt_utils_vt_terminal.py
index c45b5730a8e..ea687c0776d 100644
--- a/tests/pytests/functional/utils/pyinstaller/rthooks/test_salt_utils_vt_terminal.py
+++ b/tests/pytests/functional/utils/pyinstaller/rthooks/test_salt_utils_vt_terminal.py
@@ -8,6 +8,9 @@ import salt.utils.pyinstaller.rthooks._overrides as overrides
 from tests.support import mock
 from tests.support.helpers import PatchedEnviron
 
+LD_LIBRARY_PATH = ""
+if os.environ.get('VIRTUAL_ENV'):
+    LD_LIBRARY_PATH = f"{os.environ.get('VIRTUAL_ENV')}/lib"
 
 @pytest.fixture(params=("LD_LIBRARY_PATH", "LIBPATH"))
 def envvar(request):
@@ -17,9 +20,14 @@ def envvar(request):
 @pytest.fixture
 def meipass(envvar):
     with mock.patch("salt.utils.pyinstaller.rthooks._overrides.sys") as patched_sys:
-        patched_sys._MEIPASS = "{}_VALUE".format(envvar)
-        assert overrides.sys._MEIPASS == "{}_VALUE".format(envvar)
-        yield "{}_VALUE".format(envvar)
+        ld_path_mock_val = f"{envvar}_VALUE"
+        if envvar == "LD_LIBRARY_PATH" and LD_LIBRARY_PATH:
+            # venv-minion python wrapper hardcodes LD_LIB_PATH that
+            # we cannot overwrite from the testsuite
+            ld_path_mock_val = LD_LIBRARY_PATH
+        patched_sys._MEIPASS = ld_path_mock_val
+        assert overrides.sys._MEIPASS == ld_path_mock_val
+        yield ld_path_mock_val
     assert not hasattr(sys, "_MEIPASS")
     assert not hasattr(overrides.sys, "_MEIPASS")
 
@@ -111,7 +119,8 @@ def test_vt_terminal_environ_cleanup(envvar, meipass):
         returned_env = json.loads(buffer_o)
         assert returned_env != original_env
         assert envvar in returned_env
-        assert returned_env[envvar] == ""
+        envvar_value = LD_LIBRARY_PATH if envvar == "LD_LIBRARY_PATH" else ""
+        assert returned_env[envvar] == envvar_value
 
 
 def test_vt_terminal_environ_cleanup_passed_directly_not_removed(envvar, meipass):
@@ -139,4 +148,7 @@ def test_vt_terminal_environ_cleanup_passed_directly_not_removed(envvar, meipass
     returned_env = json.loads(buffer_o)
     assert returned_env != original_env
     assert envvar in returned_env
-    assert returned_env[envvar] == envvar
+    envvar_val = envvar
+    if LD_LIBRARY_PATH and envvar == "LD_LIBRARY_PATH":
+        envvar_val = LD_LIBRARY_PATH
+    assert returned_env[envvar] == envvar_val
diff --git a/tests/pytests/functional/utils/pyinstaller/rthooks/test_subprocess.py b/tests/pytests/functional/utils/pyinstaller/rthooks/test_subprocess.py
index 836e392d016..e4b5420d5e3 100644
--- a/tests/pytests/functional/utils/pyinstaller/rthooks/test_subprocess.py
+++ b/tests/pytests/functional/utils/pyinstaller/rthooks/test_subprocess.py
@@ -9,6 +9,9 @@ import salt.utils.pyinstaller.rthooks._overrides as overrides
 from tests.support import mock
 from tests.support.helpers import PatchedEnviron
 
+LD_LIBRARY_PATH = ""
+if os.environ.get('VIRTUAL_ENV'):
+    LD_LIBRARY_PATH = f"{os.environ.get('VIRTUAL_ENV')}/lib"
 
 @pytest.fixture(params=("LD_LIBRARY_PATH", "LIBPATH"))
 def envvar(request):
@@ -18,9 +21,14 @@ def envvar(request):
 @pytest.fixture
 def meipass(envvar):
     with mock.patch("salt.utils.pyinstaller.rthooks._overrides.sys") as patched_sys:
-        patched_sys._MEIPASS = "{}_VALUE".format(envvar)
-        assert overrides.sys._MEIPASS == "{}_VALUE".format(envvar)
-        yield "{}_VALUE".format(envvar)
+        ld_path_mock_val = f"{envvar}_VALUE"
+        if envvar == "LD_LIBRARY_PATH" and LD_LIBRARY_PATH:
+            # venv-minion python wrapper hardcodes LD_LIB_PATH that
+            # we cannot overwrite from the testsuite
+            ld_path_mock_val = LD_LIBRARY_PATH
+        patched_sys._MEIPASS = ld_path_mock_val
+        assert overrides.sys._MEIPASS == ld_path_mock_val
+        yield ld_path_mock_val
     assert not hasattr(sys, "_MEIPASS")
     assert not hasattr(overrides.sys, "_MEIPASS")
 
@@ -88,7 +96,8 @@ def test_subprocess_popen_environ_cleanup(envvar, meipass):
         returned_env = json.loads(stdout)
         assert returned_env != original_env
         assert envvar in returned_env
-        assert returned_env[envvar] == ""
+        envvar_value = LD_LIBRARY_PATH if envvar == "LD_LIBRARY_PATH" else ""
+        assert returned_env[envvar] == envvar_value
 
 
 def test_subprocess_popen_environ_cleanup_passed_directly_not_removed(envvar, meipass):
@@ -108,4 +117,7 @@ def test_subprocess_popen_environ_cleanup_passed_directly_not_removed(envvar, me
     returned_env = json.loads(stdout)
     assert returned_env != original_env
     assert envvar in returned_env
-    assert returned_env[envvar] == envvar
+    envvar_val = envvar
+    if LD_LIBRARY_PATH and envvar == "LD_LIBRARY_PATH":
+        envvar_val = LD_LIBRARY_PATH
+    assert returned_env[envvar] == envvar_val
diff --git a/tests/pytests/functional/utils/yamllint/test_yamllint.py b/tests/pytests/functional/utils/yamllint/test_yamllint.py
index 403c6fc610e..3c730523c4d 100644
--- a/tests/pytests/functional/utils/yamllint/test_yamllint.py
+++ b/tests/pytests/functional/utils/yamllint/test_yamllint.py
@@ -7,7 +7,7 @@ import salt.utils.versions as versions
 try:
     import salt.utils.yamllint as yamllint
 
-    YAMLLINT_AVAILABLE = True
+    YAMLLINT_AVAILABLE = yamllint.has_yamllint()
 except ImportError:
     YAMLLINT_AVAILABLE = False
 
diff --git a/tests/pytests/unit/modules/test_pip.py b/tests/pytests/unit/modules/test_pip.py
index 4b2da77786b..fbe0dc5f1cf 100644
--- a/tests/pytests/unit/modules/test_pip.py
+++ b/tests/pytests/unit/modules/test_pip.py
@@ -15,6 +15,10 @@ MISSING_SETUP_PY_FILE = not os.path.exists(
     os.path.join(RUNTIME_VARS.CODE_DIR, "setup.py")
 )
 
+TARGET = []
+if os.environ.get('VENV_PIP_TARGET'):
+    TARGET = ["--target", os.environ.get('VENV_PIP_TARGET')]
+
 
 class FakeFopen:
     def __init__(self, filename):
@@ -102,6 +106,7 @@ def test_install_frozen_app(python_binary):
                 expected = [
                     *python_binary,
                     "install",
+                    *TARGET,
                     pkg,
                 ]
                 mock.assert_called_with(
@@ -123,6 +128,7 @@ def test_install_source_app(python_binary):
                 expected = [
                     *python_binary,
                     "install",
+                    *TARGET,
                     pkg,
                 ]
                 mock.assert_called_with(
@@ -143,6 +149,7 @@ def test_fix4361(python_binary):
             "install",
             "--requirement",
             "requirements.txt",
+            *TARGET,
         ]
         mock.assert_called_with(
             expected_cmd,
@@ -169,7 +176,7 @@ def test_install_multiple_editable(python_binary):
         "git+https://github.com/saltstack/salt-testing.git#egg=SaltTesting",
     ]
 
-    expected = [*python_binary, "install"]
+    expected = [*python_binary, "install", *TARGET]
     for item in editables:
         expected.extend(["--editable", item])
 
@@ -205,7 +212,7 @@ def test_install_multiple_pkgs_and_editables(python_binary):
         "git+https://github.com/saltstack/salt-testing.git#egg=SaltTesting",
     ]
 
-    expected = [*python_binary, "install"]
+    expected = [*python_binary, "install", *TARGET]
     expected.extend(pkgs)
     for item in editables:
         expected.extend(["--editable", item])
@@ -241,6 +248,7 @@ def test_install_multiple_pkgs_and_editables(python_binary):
         expected = [
             *python_binary,
             "install",
+            *TARGET,
             pkgs[0],
             "--editable",
             editables[0],
@@ -268,7 +276,7 @@ def test_issue5940_install_multiple_pip_mirrors(python_binary):
         expected = [*python_binary, "install", "--use-mirrors"]
         for item in mirrors:
             expected.extend(["--mirrors", item])
-        expected.append("pep8")
+        expected = [*expected, *TARGET, "pep8"]
 
         # Passing mirrors as a list
         mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
@@ -300,6 +308,7 @@ def test_issue5940_install_multiple_pip_mirrors(python_binary):
             "--use-mirrors",
             "--mirrors",
             mirrors[0],
+            *TARGET,
             "pep8",
         ]
 
@@ -327,7 +336,7 @@ def test_install_with_multiple_find_links(python_binary):
     expected = [*python_binary, "install"]
     for item in find_links:
         expected.extend(["--find-links", item])
-    expected.append(pkg)
+    expected = [*expected, *TARGET, pkg]
 
     # Passing mirrors as a list
     mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
@@ -370,6 +379,7 @@ def test_install_with_multiple_find_links(python_binary):
         "install",
         "--find-links",
         find_links[0],
+        *TARGET,
         pkg,
     ]
 
@@ -435,6 +445,7 @@ def test_install_cached_requirements_used(python_binary):
                 "install",
                 "--requirement",
                 "my_cached_reqs",
+                *TARGET,
             ]
             mock.assert_called_with(
                 expected,
@@ -491,6 +502,7 @@ def test_install_log_argument_in_resulting_command(python_binary):
                 "install",
                 "--log",
                 log_path,
+                *TARGET,
                 pkg,
             ]
             mock.assert_called_with(
@@ -521,7 +533,7 @@ def test_install_timeout_argument_in_resulting_command(python_binary):
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         pip.install(pkg, timeout=10)
         mock.assert_called_with(
-            expected + [10, pkg],
+            expected + [10, *TARGET, pkg],
             saltenv="base",
             runas=None,
             use_vt=False,
@@ -533,7 +545,7 @@ def test_install_timeout_argument_in_resulting_command(python_binary):
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         pip.install(pkg, timeout="10")
         mock.assert_called_with(
-            expected + ["10", pkg],
+            expected + ["10", *TARGET, pkg],
             saltenv="base",
             runas=None,
             use_vt=False,
@@ -557,6 +569,7 @@ def test_install_index_url_argument_in_resulting_command(python_binary):
             "install",
             "--index-url",
             index_url,
+            *TARGET,
             pkg,
         ]
         mock.assert_called_with(
@@ -579,6 +592,7 @@ def test_install_extra_index_url_argument_in_resulting_command(python_binary):
             "install",
             "--extra-index-url",
             extra_index_url,
+            *TARGET,
             pkg,
         ]
         mock.assert_called_with(
@@ -595,7 +609,7 @@ def test_install_no_index_argument_in_resulting_command(python_binary):
     mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         pip.install(pkg, no_index=True)
-        expected = [*python_binary, "install", "--no-index", pkg]
+        expected = [*python_binary, "install", "--no-index", *TARGET, pkg]
         mock.assert_called_with(
             expected,
             saltenv="base",
@@ -611,7 +625,7 @@ def test_install_build_argument_in_resulting_command(python_binary):
     mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         pip.install(pkg, build=build)
-        expected = [*python_binary, "install", "--build", build, pkg]
+        expected = [*python_binary, "install", "--build", build, *TARGET, pkg]
         mock.assert_called_with(
             expected,
             saltenv="base",
@@ -646,6 +660,7 @@ def test_install_download_argument_in_resulting_command(python_binary):
         expected = [
             *python_binary,
             "install",
+            *TARGET,
             "--download",
             download,
             pkg,
@@ -664,7 +679,7 @@ def test_install_no_download_argument_in_resulting_command(python_binary):
     mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         pip.install(pkg, no_download=True)
-        expected = [*python_binary, "install", "--no-download", pkg]
+        expected = [*python_binary, "install", *TARGET, "--no-download", pkg]
         mock.assert_called_with(
             expected,
             saltenv="base",
@@ -691,6 +706,7 @@ def test_install_download_cache_dir_arguments_in_resulting_command(python_binary
                 expected = [
                     *python_binary,
                     "install",
+                    *TARGET,
                     cmd_arg,
                     download_cache,
                     pkg,
@@ -720,7 +736,7 @@ def test_install_source_argument_in_resulting_command(python_binary):
     mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         pip.install(pkg, source=source)
-        expected = [*python_binary, "install", "--source", source, pkg]
+        expected = [*python_binary, "install", *TARGET, "--source", source, pkg]
         mock.assert_called_with(
             expected,
             saltenv="base",
@@ -739,6 +755,7 @@ def test_install_exists_action_argument_in_resulting_command(python_binary):
             expected = [
                 *python_binary,
                 "install",
+                *TARGET,
                 "--exists-action",
                 action,
                 pkg,
@@ -761,7 +778,7 @@ def test_install_install_options_argument_in_resulting_command(python_binary):
     install_options = ["--exec-prefix=/foo/bar", "--install-scripts=/foo/bar/bin"]
     pkg = "pep8"
 
-    expected = [*python_binary, "install"]
+    expected = [*python_binary, "install", *TARGET]
     for item in install_options:
         expected.extend(["--install-option", item])
     expected.append(pkg)
@@ -797,6 +814,7 @@ def test_install_install_options_argument_in_resulting_command(python_binary):
         expected = [
             *python_binary,
             "install",
+            *TARGET,
             "--install-option",
             install_options[0],
             pkg,
@@ -814,7 +832,7 @@ def test_install_global_options_argument_in_resulting_command(python_binary):
     global_options = ["--quiet", "--no-user-cfg"]
     pkg = "pep8"
 
-    expected = [*python_binary, "install"]
+    expected = [*python_binary, "install", *TARGET]
     for item in global_options:
         expected.extend(["--global-option", item])
     expected.append(pkg)
@@ -850,6 +868,7 @@ def test_install_global_options_argument_in_resulting_command(python_binary):
         expected = [
             *python_binary,
             "install",
+            *TARGET,
             "--global-option",
             global_options[0],
             pkg,
@@ -868,7 +887,7 @@ def test_install_upgrade_argument_in_resulting_command(python_binary):
     mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         pip.install(pkg, upgrade=True)
-        expected = [*python_binary, "install", "--upgrade", pkg]
+        expected = [*python_binary, "install", *TARGET, "--upgrade", pkg]
         mock.assert_called_with(
             expected,
             saltenv="base",
@@ -886,6 +905,7 @@ def test_install_force_reinstall_argument_in_resulting_command(python_binary):
         expected = [
             *python_binary,
             "install",
+            *TARGET,
             "--force-reinstall",
             pkg,
         ]
@@ -906,6 +926,7 @@ def test_install_ignore_installed_argument_in_resulting_command(python_binary):
         expected = [
             *python_binary,
             "install",
+            *TARGET,
             "--ignore-installed",
             pkg,
         ]
@@ -923,7 +944,7 @@ def test_install_no_deps_argument_in_resulting_command(python_binary):
     mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         pip.install(pkg, no_deps=True)
-        expected = [*python_binary, "install", "--no-deps", pkg]
+        expected = [*python_binary, "install", *TARGET, "--no-deps", pkg]
         mock.assert_called_with(
             expected,
             saltenv="base",
@@ -938,7 +959,7 @@ def test_install_no_install_argument_in_resulting_command(python_binary):
     mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         pip.install(pkg, no_install=True)
-        expected = [*python_binary, "install", "--no-install", pkg]
+        expected = [*python_binary, "install", *TARGET, "--no-install", pkg]
         mock.assert_called_with(
             expected,
             saltenv="base",
@@ -954,7 +975,7 @@ def test_install_proxy_argument_in_resulting_command(python_binary):
     mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         pip.install(pkg, proxy=proxy)
-        expected = [*python_binary, "install", "--proxy", proxy, pkg]
+        expected = [*python_binary, "install", "--proxy", proxy, *TARGET, pkg]
         mock.assert_called_with(
             expected,
             saltenv="base",
@@ -981,7 +1002,7 @@ def test_install_proxy_false_argument_in_resulting_command(python_binary):
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         with patch.dict(pip.__opts__, config_mock):
             pip.install(pkg, proxy=proxy)
-            expected = [*python_binary, "install", pkg]
+            expected = [*python_binary, "install", *TARGET, pkg]
             mock.assert_called_with(
                 expected,
                 saltenv="base",
@@ -1012,6 +1033,7 @@ def test_install_global_proxy_in_resulting_command(python_binary):
                 "install",
                 "--proxy",
                 proxy,
+                *TARGET,
                 pkg,
             ]
             mock.assert_called_with(
@@ -1032,6 +1054,7 @@ def test_install_multiple_requirements_arguments_in_resulting_command(python_bin
         expected = [*python_binary, "install"]
         for item in cached_reqs:
             expected.extend(["--requirement", item])
+        expected.extend(TARGET)
 
         # Passing option as a list
         mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
@@ -1068,6 +1091,7 @@ def test_install_multiple_requirements_arguments_in_resulting_command(python_bin
                 "install",
                 "--requirement",
                 cached_reqs[0],
+                *TARGET,
             ]
             mock.assert_called_with(
                 expected,
@@ -1088,6 +1112,7 @@ def test_install_extra_args_arguments_in_resulting_command(python_binary):
         expected = [
             *python_binary,
             "install",
+            *TARGET,
             pkg,
             "--latest-pip-kwarg",
             "param",
@@ -1604,7 +1629,7 @@ def test_install_pre_argument_in_resulting_command(python_binary):
     with patch.dict(pip.__salt__, {"cmd.run_all": mock}):
         with patch("salt.modules.pip.version", MagicMock(return_value="1.3")):
             pip.install(pkg, pre_releases=True)
-            expected = [*python_binary, "install", pkg]
+            expected = [*python_binary, "install", *TARGET, pkg]
             mock.assert_called_with(
                 expected,
                 saltenv="base",
@@ -1620,7 +1645,7 @@ def test_install_pre_argument_in_resulting_command(python_binary):
     ):
         with patch("salt.modules.pip._get_pip_bin", MagicMock(return_value=["pip"])):
             pip.install(pkg, pre_releases=True)
-            expected = ["pip", "install", "--pre", pkg]
+            expected = ["pip", "install", *TARGET, "--pre", pkg]
             mock_run_all.assert_called_with(
                 expected,
                 saltenv="base",
diff --git a/tests/pytests/unit/modules/test_transactional_update.py b/tests/pytests/unit/modules/test_transactional_update.py
index dbd72fd74bf..e0ef2abd0f3 100644
--- a/tests/pytests/unit/modules/test_transactional_update.py
+++ b/tests/pytests/unit/modules/test_transactional_update.py
@@ -1,3 +1,4 @@
+import os
 import pytest
 
 import salt.loader.context
@@ -10,6 +11,10 @@ pytestmark = [
     pytest.mark.skip_on_windows(reason="Not supported on Windows"),
 ]
 
+SALT_CALL_BINARY = "salt-call"
+if os.environ.get('VIRTUAL_ENV'):
+    SALT_CALL_BINARY = f"{os.environ.get('VIRTUAL_ENV')}/bin/salt-call"
+
 
 @pytest.fixture
 def configure_loader_modules():
@@ -379,7 +384,7 @@ def test_call_fails_function():
                 "--continue",
                 "--quiet",
                 "run",
-                "salt-call",
+                SALT_CALL_BINARY,
                 "--out",
                 "json",
                 "-l",
@@ -411,7 +416,7 @@ def test_call_success_no_reboot():
                 "--continue",
                 "--quiet",
                 "run",
-                "salt-call",
+                SALT_CALL_BINARY,
                 "--out",
                 "json",
                 "-l",
@@ -454,7 +459,7 @@ def test_call_success_reboot():
                 "--continue",
                 "--quiet",
                 "run",
-                "salt-call",
+                SALT_CALL_BINARY,
                 "--out",
                 "json",
                 "-l",
@@ -488,7 +493,7 @@ def test_call_success_parameters():
                 "--continue",
                 "--quiet",
                 "run",
-                "salt-call",
+                SALT_CALL_BINARY,
                 "--out",
                 "json",
                 "-l",
diff --git a/tests/pytests/unit/states/test_pkgrepo.py b/tests/pytests/unit/states/test_pkgrepo.py
index 5f540bd2454..14d17ad3f9f 100644
--- a/tests/pytests/unit/states/test_pkgrepo.py
+++ b/tests/pytests/unit/states/test_pkgrepo.py
@@ -1,7 +1,6 @@
 """
     :codeauthor: Tyler Johnson <tjohnson@saltstack.com>
 """
-
 import pytest
 
 import salt.states.pkgrepo as pkgrepo
@@ -390,7 +389,7 @@ def test_migrated_wrong_method():
     with patch.dict(pkgrepo.__grains__, grains), patch.dict(
         pkgrepo.__salt__, salt_mock
     ):
-        assert pkgrepo.migrated("/mnt", method_="magic") == {
+        assert pkgrepo.migrated("/mnt", method="magic") == {
             "name": "/mnt",
             "result": False,
             "changes": {},
diff --git a/tests/pytests/unit/test_fileserver.py b/tests/pytests/unit/test_fileserver.py
index 8dd3ea0a27d..49be3967dc4 100644
--- a/tests/pytests/unit/test_fileserver.py
+++ b/tests/pytests/unit/test_fileserver.py
@@ -75,9 +75,7 @@ def test_file_server_url_escape(tmp_path):
     opts = {
         "fileserver_backend": ["roots"],
         "extension_modules": "",
-        "optimization_order": [
-            0,
-        ],
+        "optimization_order": [0, 1],
         "file_roots": {
             "base": [fileroot],
         },
@@ -102,9 +100,7 @@ def test_file_server_serve_url_escape(tmp_path):
     opts = {
         "fileserver_backend": ["roots"],
         "extension_modules": "",
-        "optimization_order": [
-            0,
-        ],
+        "optimization_order": [0, 1],
         "file_roots": {
             "base": [fileroot],
         },
diff --git a/tests/pytests/unit/utils/test_gitfs.py b/tests/pytests/unit/utils/test_gitfs.py
index 2bf627049f9..bd7d74cb2b2 100644
--- a/tests/pytests/unit/utils/test_gitfs.py
+++ b/tests/pytests/unit/utils/test_gitfs.py
@@ -3,6 +3,7 @@ import time
 
 import pytest
 
+import salt.config
 import salt.fileserver.gitfs
 import salt.utils.gitfs
 from salt.exceptions import FileserverConfigError
@@ -24,6 +25,23 @@ if HAS_PYGIT2:
     import pygit2
 
 
+@pytest.fixture
+def minion_opts(tmp_path):
+    """
+    Default minion configuration with relative temporary paths to not require root permissions.
+    """
+    root_dir = tmp_path / "minion"
+    opts = salt.config.DEFAULT_MINION_OPTS.copy()
+    opts["__role"] = "minion"
+    opts["root_dir"] = str(root_dir)
+    for name in ("cachedir", "pki_dir", "sock_dir", "conf_dir"):
+        dirpath = root_dir / name
+        dirpath.mkdir(parents=True)
+        opts[name] = str(dirpath)
+    opts["log_file"] = "logs/minion.log"
+    return opts
+
+
 @pytest.mark.parametrize(
     "role_name,role_class",
     (
diff --git a/tests/pytests/unit/utils/test_msgpack.py b/tests/pytests/unit/utils/test_msgpack.py
index a09b6e5b8b1..3d0b9d7fc8c 100644
--- a/tests/pytests/unit/utils/test_msgpack.py
+++ b/tests/pytests/unit/utils/test_msgpack.py
@@ -3,7 +3,7 @@ import pytest
 import salt.utils.msgpack
 from tests.support.mock import MagicMock, patch
 
-
+@pytest.mark.skipif(salt.utils.msgpack.version < (1, 0, 0), reason="Test requires msgpack version >= 1.0.0")
 def test_load_encoding(tmp_path):
     """
     test when using msgpack version >= 1.0.0 we
diff --git a/tests/pytests/unit/utils/test_pycrypto.py b/tests/pytests/unit/utils/test_pycrypto.py
index 693ad10e240..9e0b58d1b35 100644
--- a/tests/pytests/unit/utils/test_pycrypto.py
+++ b/tests/pytests/unit/utils/test_pycrypto.py
@@ -57,21 +57,20 @@ def test_gen_hash_crypt(algorithm, expected):
     """
     Test gen_hash with crypt library
     """
-    with patch("salt.utils.pycrypto.methods", {}):
-        ret = salt.utils.pycrypto.gen_hash(
-            crypt_salt=expected["salt"], password=passwd, algorithm=algorithm
-        )
-        assert ret == expected["hashed"]
+    ret = salt.utils.pycrypto.gen_hash(
+        crypt_salt=expected["salt"], password=passwd, algorithm=algorithm
+    )
+    assert ret == expected["hashed"]
 
-        ret = salt.utils.pycrypto.gen_hash(
-            crypt_salt=expected["badsalt"], password=passwd, algorithm=algorithm
-        )
-        assert ret != expected["hashed"]
+    ret = salt.utils.pycrypto.gen_hash(
+        crypt_salt=expected["badsalt"], password=passwd, algorithm=algorithm
+    )
+    assert ret != expected["hashed"]
 
-        ret = salt.utils.pycrypto.gen_hash(
-            crypt_salt=None, password=passwd, algorithm=algorithm
-        )
-        assert ret != expected["hashed"]
+    ret = salt.utils.pycrypto.gen_hash(
+        crypt_salt=None, password=passwd, algorithm=algorithm
+    )
+    assert ret != expected["hashed"]
 
 
 @pytest.mark.skipif(not salt.utils.pycrypto.HAS_CRYPT, reason="crypt not available")
diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py
index 5cc58c273d0..6995b01c892 100644
--- a/tests/unit/test_config.py
+++ b/tests/unit/test_config.py
@@ -83,9 +83,12 @@ class SampleConfTest(DefaultConfigsBase, TestCase):
         """
         master_config = SAMPLE_CONF_DIR + "master"
         ret = salt.config._read_conf_file(master_config)
+        # openSUSE modified the default config in
+        # https://github.com/opensuse/salt/commit/6ffbf7fcc178f32c670b177b25ed64658c59f1bf
+        expected_config = {"user": "salt", "syndic_user": "salt"}
         self.assertEqual(
             ret,
-            {},
+            expected_config,
             "Sample config file '{}' must be commented out.".format(master_config),
         )
 
@@ -347,7 +350,10 @@ class ConfigTestCase(TestCase, AdaptedConfigurationTestCaseMixin):
 
         with patched_environ(SALT_MINION_CONFIG=env_fpath):
             # Should load from env variable, not the default configuration file
-            config = salt.config.minion_config("{}/minion".format(CONFIG_DIR))
+            # Override defaults from venv-minion conf
+            defaults = salt.config.DEFAULT_MINION_OPTS.copy()
+            defaults["default_include"] = ""
+            config = salt.config.minion_config("{}/minion".format(CONFIG_DIR), defaults=defaults)
             self.assertEqual(config["log_file"], env_fpath)
 
         root_dir = os.path.join(tempdir, "foo", "bar")
@@ -1946,6 +1952,11 @@ class APIConfigTestCase(DefaultConfigsBase, TestCase):
             if salt.utils.platform.is_windows():
                 expected = "{}\\var\\log\\salt\\api".format(RUNTIME_VARS.TMP_ROOT_DIR)
 
+            if os.environ.get("VIRTUAL_ENV"):
+                # venv bundle configures --salt-logs-dir=%{_localstatedir}/log
+                # in the RPM spec file
+                expected = expected.replace("/salt/api", "/api")
+
             ret = salt.config.api_config("/some/fake/path")
             self.assertEqual(ret["log_file"], expected)
 
@@ -2017,6 +2028,11 @@ class APIConfigTestCase(DefaultConfigsBase, TestCase):
             mock_pid = "c:\\mock\\root\\var\\run\\salt-api.pid"
             mock_master_config["root_dir"] = "c:\\mock\\root"
 
+        if os.environ.get("VIRTUAL_ENV"):
+            # venv bundle configures --salt-logs-dir=%{_localstatedir}/log
+            # in the RPM spec file
+            mock_log = mock_log.replace("/salt", "")
+
         with patch(
             "salt.config.client_config", MagicMock(return_value=mock_master_config)
         ):
diff --git a/tests/unit/utils/test_sdb.py b/tests/unit/utils/test_sdb.py
index 87886cbc521..69cbda07beb 100644
--- a/tests/unit/utils/test_sdb.py
+++ b/tests/unit/utils/test_sdb.py
@@ -49,7 +49,7 @@ class SdbTestCase(TestCase, LoaderModuleMockMixin):
     # test with SQLite database write and read
 
     def test_sqlite_get_found(self):
-        expected = {b"name": b"testone", b"number": 46}
+        expected = {"name": "testone", "number": 46}
         sdb.sdb_set("sdb://test_sdb_data/test1", expected, self.sdb_opts)
         resp = sdb.sdb_get("sdb://test_sdb_data/test1", self.sdb_opts)
         self.assertEqual(resp, expected)
diff --git a/tests/unit/utils/test_templates.py b/tests/unit/utils/test_templates.py
index 264b4ae801d..604395f5e08 100644
--- a/tests/unit/utils/test_templates.py
+++ b/tests/unit/utils/test_templates.py
@@ -1,6 +1,7 @@
 """
 Unit tests for salt.utils.templates.py
 """
+
 import logging
 import os
 import sys
@@ -22,6 +23,20 @@ try:
 except ImportError:
     HAS_CHEETAH = False
 
+try:
+    import genshi as _
+
+    HAS_GENSHI = True
+except ImportError:
+    HAS_GENSHI = False
+
+try:
+    import mako as _
+
+    HAS_MAKO = True
+except ImportError:
+    HAS_MAKO = False
+
 log = logging.getLogger(__name__)
 
 
@@ -83,16 +98,19 @@ class RenderTestCase(TestCase):
         assert res == expected
 
     ### Tests for mako template
+    @pytest.mark.skipif(not HAS_MAKO, reason="Mako module not available for testing")
     def test_render_mako_sanity(self):
         tmpl = """OK"""
         res = salt.utils.templates.render_mako_tmpl(tmpl, dict(self.context))
         self.assertEqual(res, "OK")
 
+    @pytest.mark.skipif(not HAS_MAKO, reason="Mako module not available for testing")
     def test_render_mako_evaluate(self):
         tmpl = """${ "OK" }"""
         res = salt.utils.templates.render_mako_tmpl(tmpl, dict(self.context))
         self.assertEqual(res, "OK")
 
+    @pytest.mark.skipif(not HAS_MAKO, reason="Mako module not available for testing")
     def test_render_mako_evaluate_multi(self):
         tmpl = """
         % if 1:
@@ -103,6 +121,7 @@ class RenderTestCase(TestCase):
         stripped = res.strip()
         self.assertEqual(stripped, "OK")
 
+    @pytest.mark.skipif(not HAS_MAKO, reason="Mako module not available for testing")
     def test_render_mako_variable(self):
         tmpl = """${ var }"""
 
@@ -152,21 +171,33 @@ class RenderTestCase(TestCase):
         self.assertEqual(res, "OK")
 
     ### Tests for genshi template (xml-based)
+    @pytest.mark.skipif(
+        not HAS_GENSHI, reason="Genshi module not available for testing"
+    )
     def test_render_genshi_sanity(self):
         tmpl = """<RU>OK</RU>"""
         res = salt.utils.templates.render_genshi_tmpl(tmpl, dict(self.context))
         self.assertEqual(res, "<RU>OK</RU>")
 
+    @pytest.mark.skipif(
+        not HAS_GENSHI, reason="Genshi module not available for testing"
+    )
     def test_render_genshi_evaluate(self):
         tmpl = """<RU>${ "OK" }</RU>"""
         res = salt.utils.templates.render_genshi_tmpl(tmpl, dict(self.context))
         self.assertEqual(res, "<RU>OK</RU>")
 
+    @pytest.mark.skipif(
+        not HAS_GENSHI, reason="Genshi module not available for testing"
+    )
     def test_render_genshi_evaluate_condition(self):
         tmpl = """<RU xmlns:py="http://genshi.edgewall.org/" py:if="1">OK</RU>"""
         res = salt.utils.templates.render_genshi_tmpl(tmpl, dict(self.context))
         self.assertEqual(res, "<RU>OK</RU>")
 
+    @pytest.mark.skipif(
+        not HAS_GENSHI, reason="Genshi module not available for testing"
+    )
     def test_render_genshi_variable(self):
         tmpl = """<RU>$var</RU>"""
 
@@ -175,6 +206,9 @@ class RenderTestCase(TestCase):
         res = salt.utils.templates.render_genshi_tmpl(tmpl, ctx)
         self.assertEqual(res, "<RU>OK</RU>")
 
+    @pytest.mark.skipif(
+        not HAS_GENSHI, reason="Genshi module not available for testing"
+    )
     def test_render_genshi_variable_replace(self):
         tmpl = """<RU xmlns:py="http://genshi.edgewall.org/" py:content="var">not ok</RU>"""
 
-- 
2.46.0

openSUSE Build Service is sponsored by