1from __future__ import absolute_import, division, print_function
2__metaclass__ = type
3
4import sys
5
6import pytest
7
8from ansible_collections.sensu.sensu_go.plugins.module_utils import (
9    errors, utils,
10)
11from ansible_collections.sensu.sensu_go.plugins.modules import cluster_role_binding
12
13from .common.utils import (
14    AnsibleExitJson, AnsibleFailJson, ModuleTestCase, set_module_args,
15)
16
17pytestmark = pytest.mark.skipif(
18    sys.version_info < (2, 7), reason="requires python2.7 or higher"
19)
20
21
22class TestClusterRoleBinding(ModuleTestCase):
23    def test_minimal_cluster_role_binding_parameters_users(self, mocker):
24        sync_mock = mocker.patch.object(utils, 'sync')
25        sync_mock.return_value = True, {}
26        set_module_args(
27            name='test_cluster_role_binding',
28            cluster_role='test_cluster_role',
29            users=['test_user'],
30        )
31
32        with pytest.raises(AnsibleExitJson):
33            cluster_role_binding.main()
34
35        state, _client, path, payload, check_mode, _compare = sync_mock.call_args[0]
36        assert state == 'present'
37        assert path == '/api/core/v2/clusterrolebindings/test_cluster_role_binding'
38        assert payload == dict(
39            role_ref=dict(
40                name='test_cluster_role',
41                type='ClusterRole',
42            ),
43            subjects=[
44                dict(
45                    name='test_user',
46                    type='User',
47                ),
48            ],
49            metadata=dict(
50                name='test_cluster_role_binding',
51            ),
52        )
53        assert check_mode is False
54
55    def test_minimal_cluster_role_binding_parameters_groups(self, mocker):
56        sync_mock = mocker.patch.object(utils, 'sync')
57        sync_mock.return_value = True, {}
58        set_module_args(
59            name='test_cluster_role_binding',
60            cluster_role='test_cluster_role',
61            groups=['test_group'],
62        )
63
64        with pytest.raises(AnsibleExitJson):
65            cluster_role_binding.main()
66
67        state, _client, path, payload, check_mode, _compare = sync_mock.call_args[0]
68        assert state == 'present'
69        assert path == '/api/core/v2/clusterrolebindings/test_cluster_role_binding'
70        assert payload == dict(
71            role_ref=dict(
72                name='test_cluster_role',
73                type='ClusterRole',
74            ),
75            subjects=[
76                dict(
77                    name='test_group',
78                    type='Group',
79                ),
80            ],
81            metadata=dict(
82                name='test_cluster_role_binding',
83            ),
84        )
85        assert check_mode is False
86
87    def test_all_cluster_role_binding_parameters(self, mocker):
88        sync_mock = mocker.patch.object(utils, 'sync')
89        sync_mock.return_value = True, {}
90        set_module_args(
91            name='test_cluster_role_binding',
92            cluster_role='test_cluster_role',
93            users=['user_1', 'user_2'],
94            groups=['group_1', 'group_2'],
95        )
96
97        with pytest.raises(AnsibleExitJson):
98            cluster_role_binding.main()
99
100        state, _client, path, payload, check_mode, _compare = sync_mock.call_args[0]
101        assert state == 'present'
102        assert path == '/api/core/v2/clusterrolebindings/test_cluster_role_binding'
103        assert payload == dict(
104            metadata=dict(
105                name='test_cluster_role_binding',
106            ),
107            role_ref=dict(
108                name='test_cluster_role',
109                type='ClusterRole',
110            ),
111            subjects=[
112                dict(
113                    name='group_1',
114                    type='Group',
115                ),
116                dict(
117                    name='group_2',
118                    type='Group',
119                ),
120                dict(
121                    name='user_1',
122                    type='User',
123                ),
124                dict(
125                    name='user_2',
126                    type='User',
127                ),
128            ]
129        )
130        assert check_mode is False
131
132    def test_failure(self, mocker):
133        sync_mock = mocker.patch.object(utils, 'sync')
134        sync_mock.side_effect = errors.Error('Bad error')
135        set_module_args(
136            name='test_cluster_role_binding',
137            cluster_role='test_cluster_role',
138            users=['test_user'],
139        )
140        with pytest.raises(AnsibleFailJson):
141            cluster_role_binding.main()
142
143    def test_failure_missing_groups_or_users(self, mocker):
144        sync_mock = mocker.patch.object(utils, 'sync')
145        sync_mock.side_effect = Exception("Validation should fail but didn't")
146        set_module_args(
147            name='test_cluster_role_binding',
148            cluster_role='test_cluster_role',
149        )
150
151        with pytest.raises(AnsibleFailJson):
152            cluster_role_binding.main()
153