123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- # -*- coding: utf-8 -*-
- """
- :codeauthor: Pedro Algarvio (pedro@algarvio.me)
- tests.unit.modules.virtualenv_test
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- """
- # Import python libraries
- from __future__ import absolute_import, print_function, unicode_literals
- import sys
- # Import salt libs
- import salt.modules.virtualenv_mod as virtualenv_mod
- from salt.exceptions import CommandExecutionError
- from tests.support.helpers import ForceImportErrorOn, TstSuiteLoggingHandler
- # Import Salt Testing libs
- from tests.support.mixins import LoaderModuleMockMixin
- from tests.support.mock import MagicMock, patch
- from tests.support.unit import TestCase
- class VirtualenvTestCase(TestCase, LoaderModuleMockMixin):
- def setup_loader_modules(self):
- base_virtualenv_mock = MagicMock()
- base_virtualenv_mock.__version__ = "1.9.1"
- patcher = patch("salt.utils.path.which", lambda exe: exe)
- patcher.start()
- self.addCleanup(patcher.stop)
- return {
- virtualenv_mod: {
- "__opts__": {"venv_bin": "virtualenv"},
- "_install_script": MagicMock(
- return_value={
- "retcode": 0,
- "stdout": "Installed script!",
- "stderr": "",
- }
- ),
- "sys.modules": {"virtualenv": base_virtualenv_mock},
- }
- }
- def test_issue_6029_deprecated_distribute(self):
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create(
- "/tmp/foo", system_site_packages=True, distribute=True
- )
- mock.assert_called_once_with(
- ["virtualenv", "--distribute", "--system-site-packages", "/tmp/foo"],
- runas=None,
- python_shell=False,
- )
- with TstSuiteLoggingHandler() as handler:
- # Let's fake a higher virtualenv version
- virtualenv_mock = MagicMock()
- virtualenv_mock.__version__ = "1.10rc1"
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- with patch.dict("sys.modules", {"virtualenv": virtualenv_mock}):
- virtualenv_mod.create(
- "/tmp/foo", system_site_packages=True, distribute=True
- )
- mock.assert_called_once_with(
- ["virtualenv", "--system-site-packages", "/tmp/foo"],
- runas=None,
- python_shell=False,
- )
- # Are we logging the deprecation information?
- self.assertIn(
- "INFO:The virtualenv '--distribute' option has been "
- "deprecated in virtualenv(>=1.10), as such, the "
- "'distribute' option to `virtualenv.create()` has "
- "also been deprecated and it's not necessary anymore.",
- handler.messages,
- )
- def test_issue_6030_deprecated_never_download(self):
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create("/tmp/foo", never_download=True)
- mock.assert_called_once_with(
- ["virtualenv", "--never-download", "/tmp/foo"],
- runas=None,
- python_shell=False,
- )
- with TstSuiteLoggingHandler() as handler:
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- # Let's fake a higher virtualenv version
- virtualenv_mock = MagicMock()
- virtualenv_mock.__version__ = "1.10rc1"
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- with patch.dict("sys.modules", {"virtualenv": virtualenv_mock}):
- virtualenv_mod.create("/tmp/foo", never_download=True)
- mock.assert_called_once_with(
- ["virtualenv", "/tmp/foo"], runas=None, python_shell=False
- )
- # Are we logging the deprecation information?
- self.assertIn(
- "INFO:--never-download was deprecated in 1.10.0, "
- "but reimplemented in 14.0.0. If this feature is needed, "
- "please install a supported virtualenv version.",
- handler.messages,
- )
- def test_issue_6031_multiple_extra_search_dirs(self):
- extra_search_dirs = ["/tmp/bar-1", "/tmp/bar-2", "/tmp/bar-3"]
- # Passing extra_search_dirs as a list
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create("/tmp/foo", extra_search_dir=extra_search_dirs)
- mock.assert_called_once_with(
- [
- "virtualenv",
- "--extra-search-dir=/tmp/bar-1",
- "--extra-search-dir=/tmp/bar-2",
- "--extra-search-dir=/tmp/bar-3",
- "/tmp/foo",
- ],
- runas=None,
- python_shell=False,
- )
- # Passing extra_search_dirs as comma separated list
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create(
- "/tmp/foo", extra_search_dir=",".join(extra_search_dirs)
- )
- mock.assert_called_once_with(
- [
- "virtualenv",
- "--extra-search-dir=/tmp/bar-1",
- "--extra-search-dir=/tmp/bar-2",
- "--extra-search-dir=/tmp/bar-3",
- "/tmp/foo",
- ],
- runas=None,
- python_shell=False,
- )
- def test_unapplicable_options(self):
- # ----- Virtualenv using pyvenv options ----------------------------->
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- self.assertRaises(
- CommandExecutionError,
- virtualenv_mod.create,
- "/tmp/foo",
- venv_bin="virtualenv",
- upgrade=True,
- )
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- self.assertRaises(
- CommandExecutionError,
- virtualenv_mod.create,
- "/tmp/foo",
- venv_bin="virtualenv",
- symlinks=True,
- )
- # <---- Virtualenv using pyvenv options ------------------------------
- # ----- pyvenv using virtualenv options ----------------------------->
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(
- virtualenv_mod.__salt__,
- {"cmd.run_all": mock, "cmd.which_bin": lambda _: "pyvenv"},
- ):
- self.assertRaises(
- CommandExecutionError,
- virtualenv_mod.create,
- "/tmp/foo",
- venv_bin="pyvenv",
- python="python2.7",
- )
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- self.assertRaises(
- CommandExecutionError,
- virtualenv_mod.create,
- "/tmp/foo",
- venv_bin="pyvenv",
- prompt="PY Prompt",
- )
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- self.assertRaises(
- CommandExecutionError,
- virtualenv_mod.create,
- "/tmp/foo",
- venv_bin="pyvenv",
- never_download=True,
- )
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- self.assertRaises(
- CommandExecutionError,
- virtualenv_mod.create,
- "/tmp/foo",
- venv_bin="pyvenv",
- extra_search_dir="/tmp/bar",
- )
- # <---- pyvenv using virtualenv options ------------------------------
- def test_get_virtualenv_version_from_shell(self):
- with ForceImportErrorOn("virtualenv"):
- # ----- virtualenv binary not available ------------------------->
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- self.assertRaises(
- CommandExecutionError, virtualenv_mod.create, "/tmp/foo",
- )
- # <---- virtualenv binary not available --------------------------
- # ----- virtualenv binary present but > 0 exit code ------------->
- mock = MagicMock(
- side_effect=[
- {"retcode": 1, "stdout": "", "stderr": "This is an error"},
- {"retcode": 0, "stdout": ""},
- ]
- )
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- self.assertRaises(
- CommandExecutionError,
- virtualenv_mod.create,
- "/tmp/foo",
- venv_bin="virtualenv",
- )
- # <---- virtualenv binary present but > 0 exit code --------------
- # ----- virtualenv binary returns 1.9.1 as its version --------->
- mock = MagicMock(
- side_effect=[
- {"retcode": 0, "stdout": "1.9.1"},
- {"retcode": 0, "stdout": ""},
- ]
- )
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create("/tmp/foo", never_download=True)
- mock.assert_called_with(
- ["virtualenv", "--never-download", "/tmp/foo"],
- runas=None,
- python_shell=False,
- )
- # <---- virtualenv binary returns 1.9.1 as its version ----------
- # ----- virtualenv binary returns 1.10rc1 as its version ------->
- mock = MagicMock(
- side_effect=[
- {"retcode": 0, "stdout": "1.10rc1"},
- {"retcode": 0, "stdout": ""},
- ]
- )
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create("/tmp/foo", never_download=True)
- mock.assert_called_with(
- ["virtualenv", "/tmp/foo"], runas=None, python_shell=False
- )
- # <---- virtualenv binary returns 1.10rc1 as its version --------
- def test_python_argument(self):
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create(
- "/tmp/foo", python=sys.executable,
- )
- mock.assert_called_once_with(
- ["virtualenv", "--python={0}".format(sys.executable), "/tmp/foo"],
- runas=None,
- python_shell=False,
- )
- def test_prompt_argument(self):
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create("/tmp/foo", prompt="PY Prompt")
- mock.assert_called_once_with(
- ["virtualenv", "--prompt='PY Prompt'", "/tmp/foo"],
- runas=None,
- python_shell=False,
- )
- # Now with some quotes on the mix
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create("/tmp/foo", prompt="'PY' Prompt")
- mock.assert_called_once_with(
- ["virtualenv", "--prompt=''PY' Prompt'", "/tmp/foo"],
- runas=None,
- python_shell=False,
- )
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create("/tmp/foo", prompt='"PY" Prompt')
- mock.assert_called_once_with(
- ["virtualenv", "--prompt='\"PY\" Prompt'", "/tmp/foo"],
- runas=None,
- python_shell=False,
- )
- def test_clear_argument(self):
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create("/tmp/foo", clear=True)
- mock.assert_called_once_with(
- ["virtualenv", "--clear", "/tmp/foo"], runas=None, python_shell=False
- )
- def test_upgrade_argument(self):
- # We test for pyvenv only because with virtualenv this is un
- # unsupported option.
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create("/tmp/foo", venv_bin="pyvenv", upgrade=True)
- mock.assert_called_once_with(
- ["pyvenv", "--upgrade", "/tmp/foo"], runas=None, python_shell=False
- )
- def test_symlinks_argument(self):
- # We test for pyvenv only because with virtualenv this is un
- # unsupported option.
- mock = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock}):
- virtualenv_mod.create("/tmp/foo", venv_bin="pyvenv", symlinks=True)
- mock.assert_called_once_with(
- ["pyvenv", "--symlinks", "/tmp/foo"], runas=None, python_shell=False
- )
- def test_virtualenv_ver(self):
- """
- test virtualenv_ver when there is no ImportError
- """
- ret = virtualenv_mod.virtualenv_ver(venv_bin="pyvenv")
- assert ret == (1, 9, 1)
- def test_virtualenv_ver_importerror(self):
- """
- test virtualenv_ver when there is an ImportError
- """
- with ForceImportErrorOn("virtualenv"):
- mock_ver = MagicMock(return_value={"retcode": 0, "stdout": "1.9.1"})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock_ver}):
- ret = virtualenv_mod.virtualenv_ver(venv_bin="pyenv")
- assert ret == (1, 9, 1)
- def test_virtualenv_ver_importerror_cmd_error(self):
- """
- test virtualenv_ver when there is an ImportError
- and virtualenv --version does not return anything
- """
- with ForceImportErrorOn("virtualenv"):
- mock_ver = MagicMock(return_value={"retcode": 0, "stdout": ""})
- with patch.dict(virtualenv_mod.__salt__, {"cmd.run_all": mock_ver}):
- with self.assertRaises(CommandExecutionError):
- virtualenv_mod.virtualenv_ver(venv_bin="pyenv")
|