1import json
2
3import pytest
4from units.compat import mock
5from ansible.modules.remote_management.lxca import lxca_nodes
6from ansible.module_utils.remote_management.lxca.common import setup_conn
7from ansible.module_utils.remote_management.lxca.common import close_conn
8
9
10@pytest.fixture(scope='module')
11@mock.patch("ansible.module_utils.remote_management.lxca.common.close_conn", autospec=True)
12def setup_module(close_conn):
13    close_conn.return_value = True
14
15
16class TestMyModule():
17    @pytest.mark.parametrize('patch_ansible_module',
18                             [
19                                 {},
20                                 {
21                                     "auth_url": "https://10.240.14.195",
22                                     "login_user": "USERID",
23                                 },
24                                 {
25                                     "auth_url": "https://10.240.14.195",
26                                     "login_password": "Password",
27                                 },
28                                 {
29                                     "login_user": "USERID",
30                                     "login_password": "Password",
31                                 },
32                             ],
33                             indirect=['patch_ansible_module'])
34    @pytest.mark.usefixtures('patch_ansible_module')
35    @mock.patch("ansible.module_utils.remote_management.lxca.common.setup_conn", autospec=True)
36    @mock.patch("ansible.modules.remote_management.lxca.lxca_nodes.execute_module", autospec=True)
37    def test_without_required_parameters(self, _setup_conn, _execute_module,
38                                         mocker, capfd, setup_module):
39        """Failure must occurs when all parameters are missing"""
40        with pytest.raises(SystemExit):
41            _setup_conn.return_value = "Fake connection"
42            _execute_module.return_value = "Fake execution"
43            lxca_nodes.main()
44        out, err = capfd.readouterr()
45        results = json.loads(out)
46        assert results['failed']
47        assert 'missing required arguments' in results['msg']
48
49    @mock.patch("ansible.module_utils.remote_management.lxca.common.setup_conn", autospec=True)
50    @mock.patch("ansible.modules.remote_management.lxca.lxca_nodes.execute_module", autospec=True)
51    @mock.patch("ansible.modules.remote_management.lxca.lxca_nodes.AnsibleModule", autospec=True)
52    def test__argument_spec(self, ansible_mod_cls, _execute_module, _setup_conn, setup_module):
53        expected_arguments_spec = dict(
54            login_user=dict(required=True),
55            login_password=dict(required=True, no_log=True),
56            command_options=dict(default='nodes', choices=['nodes', 'nodes_by_uuid',
57                                                           'nodes_by_chassis_uuid',
58                                                           'nodes_status_managed',
59                                                           'nodes_status_unmanaged']),
60            auth_url=dict(required=True),
61            uuid=dict(default=None),
62            chassis=dict(default=None),
63        )
64        _setup_conn.return_value = "Fake connection"
65        _execute_module.return_value = []
66        mod_obj = ansible_mod_cls.return_value
67        args = {
68            "auth_url": "https://10.243.30.195",
69            "login_user": "USERID",
70            "login_password": "password",
71            "command_options": "nodes",
72        }
73        mod_obj.params = args
74        lxca_nodes.main()
75        assert(mock.call(argument_spec=expected_arguments_spec,
76                         supports_check_mode=False) == ansible_mod_cls.call_args)
77
78    @mock.patch("ansible.module_utils.remote_management.lxca.common.setup_conn", autospec=True)
79    @mock.patch("ansible.modules.remote_management.lxca.lxca_nodes._nodes_by_uuid",
80                autospec=True)
81    @mock.patch("ansible.modules.remote_management.lxca.lxca_nodes.AnsibleModule",
82                autospec=True)
83    def test__nodes_empty_list(self, ansible_mod_cls, _get_nodes, _setup_conn, setup_module):
84        mod_obj = ansible_mod_cls.return_value
85        args = {
86            "auth_url": "https://10.243.30.195",
87            "login_user": "USERID",
88            "login_password": "password",
89            "uuid": "3C737AA5E31640CE949B10C129A8B01F",
90            "command_options": "nodes_by_uuid",
91        }
92        mod_obj.params = args
93        _setup_conn.return_value = "Fake connection"
94        empty_nodes_list = []
95        _get_nodes.return_value = empty_nodes_list
96        ret_nodes = _get_nodes(mod_obj, args)
97        assert mock.call(mod_obj, mod_obj.params) == _get_nodes.call_args
98        assert _get_nodes.return_value == ret_nodes
99