1"""
2    :codeauthor: Rahul Handay <rahulha@saltstack.com>
3"""
4
5
6import os
7
8import salt.states.virtualenv_mod as virtualenv_mod
9from tests.support.mixins import LoaderModuleMockMixin
10from tests.support.mock import MagicMock, patch
11from tests.support.unit import TestCase
12
13
14class VirtualenvModTestCase(TestCase, LoaderModuleMockMixin):
15    """
16    Validate the virtualenv_mod state
17    """
18
19    def setup_loader_modules(self):
20        return {virtualenv_mod: {"__env__": "base"}}
21
22    def test_managed(self):
23        """
24        Test to create a virtualenv and optionally manage it with pip
25        """
26        ret = {"name": "salt", "changes": {}, "result": False, "comment": ""}
27        ret.update({"comment": "Virtualenv was not detected on this system"})
28        self.assertDictEqual(virtualenv_mod.managed("salt"), ret)
29
30        mock1 = MagicMock(return_value="True")
31        mock = MagicMock(return_value=False)
32        mock2 = MagicMock(return_value="1.1")
33        with patch.dict(
34            virtualenv_mod.__salt__,
35            {
36                "virtualenv.create": True,
37                "cp.is_cached": mock,
38                "cp.cache_file": mock,
39                "cp.hash_file": mock,
40                "pip.freeze": mock1,
41                "cmd.run_stderr": mock1,
42                "pip.version": mock2,
43            },
44        ):
45            mock = MagicMock(side_effect=[True, True, True, False, True, True])
46            with patch.object(os.path, "exists", mock):
47                ret.update({"comment": "pip requirements file 'salt://a' not found"})
48                self.assertDictEqual(
49                    virtualenv_mod.managed("salt", None, "salt://a"), ret
50                )
51
52                with patch.dict(virtualenv_mod.__opts__, {"test": True}):
53                    ret.update(
54                        {
55                            "changes": {"cleared_packages": "True", "old": "True"},
56                            "comment": "Virtualenv salt is set to be cleared",
57                            "result": None,
58                        }
59                    )
60                    self.assertDictEqual(virtualenv_mod.managed("salt", clear=1), ret)
61                    ret.update(
62                        {
63                            "comment": "Virtualenv salt is already created",
64                            "changes": {},
65                            "result": True,
66                        }
67                    )
68                    self.assertDictEqual(virtualenv_mod.managed("salt"), ret)
69
70                    ret.update(
71                        {
72                            "comment": "Virtualenv salt is set to be created",
73                            "result": None,
74                        }
75                    )
76                    self.assertDictEqual(virtualenv_mod.managed("salt"), ret)
77
78                with patch.dict(virtualenv_mod.__opts__, {"test": False}):
79                    ret.update(
80                        {
81                            "comment": (
82                                "The 'use_wheel' option is"
83                                " only supported in pip between 1.4 and 9.0.3."
84                                " The version of pip detected was 1.1."
85                            ),
86                            "result": False,
87                        }
88                    )
89                    self.assertDictEqual(
90                        virtualenv_mod.managed("salt", use_wheel=1), ret
91                    )
92
93                    ret.update({"comment": "virtualenv exists", "result": True})
94                    self.assertDictEqual(virtualenv_mod.managed("salt"), ret)
95