123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 |
- # -*- 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 Testing libs
- from tests.support.mixins import LoaderModuleMockMixin
- from tests.support.unit import TestCase
- from tests.support.helpers import TstSuiteLoggingHandler, ForceImportErrorOn
- from tests.support.mock import MagicMock, patch
- # Import salt libs
- import salt.modules.virtualenv_mod as virtualenv_mod
- from salt.exceptions import CommandExecutionError
- 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
- )
|