1# Copyright 2019 Fortinet, Inc.
2#
3# This program is free software: you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation, either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with Ansible.  If not, see <https://www.gnu.org/licenses/>.
15
16# Make coding more python3-ish
17from __future__ import (absolute_import, division, print_function)
18__metaclass__ = type
19
20import os
21import json
22import pytest
23from mock import ANY
24from ansible.module_utils.network.fortios.fortios import FortiOSHandler
25
26try:
27    from ansible.modules.network.fortios import fortios_wireless_controller_hotspot20_h2qp_conn_capability
28except ImportError:
29    pytest.skip("Could not load required modules for testing", allow_module_level=True)
30
31
32@pytest.fixture(autouse=True)
33def connection_mock(mocker):
34    connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_wireless_controller_hotspot20_h2qp_conn_capability.Connection')
35    return connection_class_mock
36
37
38fos_instance = FortiOSHandler(connection_mock)
39
40
41def test_wireless_controller_hotspot20_h2qp_conn_capability_creation(mocker):
42    schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
43
44    set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
45    set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
46
47    input_data = {
48        'username': 'admin',
49        'state': 'present',
50        'wireless_controller_hotspot20_h2qp_conn_capability': {
51            'esp_port': 'closed',
52            'ftp_port': 'closed',
53            'http_port': 'closed',
54            'icmp_port': 'closed',
55            'ikev2_port': 'closed',
56            'ikev2_xx_port': 'closed',
57            'name': 'default_name_9',
58            'pptp_vpn_port': 'closed',
59            'ssh_port': 'closed',
60            'tls_port': 'closed',
61            'voip_tcp_port': 'closed',
62            'voip_udp_port': 'closed'
63        },
64        'vdom': 'root'}
65
66    is_error, changed, response = fortios_wireless_controller_hotspot20_h2qp_conn_capability.fortios_wireless_controller_hotspot20(input_data, fos_instance)
67
68    expected_data = {
69        'esp-port': 'closed',
70        'ftp-port': 'closed',
71        'http-port': 'closed',
72        'icmp-port': 'closed',
73        'ikev2-port': 'closed',
74        'ikev2-xx-port': 'closed',
75        'name': 'default_name_9',
76                'pptp-vpn-port': 'closed',
77                'ssh-port': 'closed',
78                'tls-port': 'closed',
79                'voip-tcp-port': 'closed',
80                'voip-udp-port': 'closed'
81    }
82
83    set_method_mock.assert_called_with('wireless-controller.hotspot20', 'h2qp-conn-capability', data=expected_data, vdom='root')
84    schema_method_mock.assert_not_called()
85    assert not is_error
86    assert changed
87    assert response['status'] == 'success'
88    assert response['http_status'] == 200
89
90
91def test_wireless_controller_hotspot20_h2qp_conn_capability_creation_fails(mocker):
92    schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
93
94    set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
95    set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
96
97    input_data = {
98        'username': 'admin',
99        'state': 'present',
100        'wireless_controller_hotspot20_h2qp_conn_capability': {
101            'esp_port': 'closed',
102            'ftp_port': 'closed',
103            'http_port': 'closed',
104            'icmp_port': 'closed',
105            'ikev2_port': 'closed',
106            'ikev2_xx_port': 'closed',
107            'name': 'default_name_9',
108            'pptp_vpn_port': 'closed',
109            'ssh_port': 'closed',
110            'tls_port': 'closed',
111            'voip_tcp_port': 'closed',
112            'voip_udp_port': 'closed'
113        },
114        'vdom': 'root'}
115
116    is_error, changed, response = fortios_wireless_controller_hotspot20_h2qp_conn_capability.fortios_wireless_controller_hotspot20(input_data, fos_instance)
117
118    expected_data = {
119        'esp-port': 'closed',
120        'ftp-port': 'closed',
121        'http-port': 'closed',
122        'icmp-port': 'closed',
123        'ikev2-port': 'closed',
124        'ikev2-xx-port': 'closed',
125        'name': 'default_name_9',
126                'pptp-vpn-port': 'closed',
127                'ssh-port': 'closed',
128                'tls-port': 'closed',
129                'voip-tcp-port': 'closed',
130                'voip-udp-port': 'closed'
131    }
132
133    set_method_mock.assert_called_with('wireless-controller.hotspot20', 'h2qp-conn-capability', data=expected_data, vdom='root')
134    schema_method_mock.assert_not_called()
135    assert is_error
136    assert not changed
137    assert response['status'] == 'error'
138    assert response['http_status'] == 500
139
140
141def test_wireless_controller_hotspot20_h2qp_conn_capability_removal(mocker):
142    schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
143
144    delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
145    delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
146
147    input_data = {
148        'username': 'admin',
149        'state': 'absent',
150        'wireless_controller_hotspot20_h2qp_conn_capability': {
151            'esp_port': 'closed',
152            'ftp_port': 'closed',
153            'http_port': 'closed',
154            'icmp_port': 'closed',
155            'ikev2_port': 'closed',
156            'ikev2_xx_port': 'closed',
157            'name': 'default_name_9',
158            'pptp_vpn_port': 'closed',
159            'ssh_port': 'closed',
160            'tls_port': 'closed',
161            'voip_tcp_port': 'closed',
162            'voip_udp_port': 'closed'
163        },
164        'vdom': 'root'}
165
166    is_error, changed, response = fortios_wireless_controller_hotspot20_h2qp_conn_capability.fortios_wireless_controller_hotspot20(input_data, fos_instance)
167
168    delete_method_mock.assert_called_with('wireless-controller.hotspot20', 'h2qp-conn-capability', mkey=ANY, vdom='root')
169    schema_method_mock.assert_not_called()
170    assert not is_error
171    assert changed
172    assert response['status'] == 'success'
173    assert response['http_status'] == 200
174
175
176def test_wireless_controller_hotspot20_h2qp_conn_capability_deletion_fails(mocker):
177    schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
178
179    delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
180    delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
181
182    input_data = {
183        'username': 'admin',
184        'state': 'absent',
185        'wireless_controller_hotspot20_h2qp_conn_capability': {
186            'esp_port': 'closed',
187            'ftp_port': 'closed',
188            'http_port': 'closed',
189            'icmp_port': 'closed',
190            'ikev2_port': 'closed',
191            'ikev2_xx_port': 'closed',
192            'name': 'default_name_9',
193            'pptp_vpn_port': 'closed',
194            'ssh_port': 'closed',
195            'tls_port': 'closed',
196            'voip_tcp_port': 'closed',
197            'voip_udp_port': 'closed'
198        },
199        'vdom': 'root'}
200
201    is_error, changed, response = fortios_wireless_controller_hotspot20_h2qp_conn_capability.fortios_wireless_controller_hotspot20(input_data, fos_instance)
202
203    delete_method_mock.assert_called_with('wireless-controller.hotspot20', 'h2qp-conn-capability', mkey=ANY, vdom='root')
204    schema_method_mock.assert_not_called()
205    assert is_error
206    assert not changed
207    assert response['status'] == 'error'
208    assert response['http_status'] == 500
209
210
211def test_wireless_controller_hotspot20_h2qp_conn_capability_idempotent(mocker):
212    schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
213
214    set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
215    set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
216
217    input_data = {
218        'username': 'admin',
219        'state': 'present',
220        'wireless_controller_hotspot20_h2qp_conn_capability': {
221            'esp_port': 'closed',
222            'ftp_port': 'closed',
223            'http_port': 'closed',
224            'icmp_port': 'closed',
225            'ikev2_port': 'closed',
226            'ikev2_xx_port': 'closed',
227            'name': 'default_name_9',
228            'pptp_vpn_port': 'closed',
229            'ssh_port': 'closed',
230            'tls_port': 'closed',
231            'voip_tcp_port': 'closed',
232            'voip_udp_port': 'closed'
233        },
234        'vdom': 'root'}
235
236    is_error, changed, response = fortios_wireless_controller_hotspot20_h2qp_conn_capability.fortios_wireless_controller_hotspot20(input_data, fos_instance)
237
238    expected_data = {
239        'esp-port': 'closed',
240        'ftp-port': 'closed',
241        'http-port': 'closed',
242        'icmp-port': 'closed',
243        'ikev2-port': 'closed',
244        'ikev2-xx-port': 'closed',
245        'name': 'default_name_9',
246                'pptp-vpn-port': 'closed',
247                'ssh-port': 'closed',
248                'tls-port': 'closed',
249                'voip-tcp-port': 'closed',
250                'voip-udp-port': 'closed'
251    }
252
253    set_method_mock.assert_called_with('wireless-controller.hotspot20', 'h2qp-conn-capability', data=expected_data, vdom='root')
254    schema_method_mock.assert_not_called()
255    assert not is_error
256    assert not changed
257    assert response['status'] == 'error'
258    assert response['http_status'] == 404
259
260
261def test_wireless_controller_hotspot20_h2qp_conn_capability_filter_foreign_attributes(mocker):
262    schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
263
264    set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
265    set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
266
267    input_data = {
268        'username': 'admin',
269        'state': 'present',
270        'wireless_controller_hotspot20_h2qp_conn_capability': {
271            'random_attribute_not_valid': 'tag',
272            'esp_port': 'closed',
273            'ftp_port': 'closed',
274            'http_port': 'closed',
275            'icmp_port': 'closed',
276            'ikev2_port': 'closed',
277            'ikev2_xx_port': 'closed',
278            'name': 'default_name_9',
279            'pptp_vpn_port': 'closed',
280            'ssh_port': 'closed',
281            'tls_port': 'closed',
282            'voip_tcp_port': 'closed',
283            'voip_udp_port': 'closed'
284        },
285        'vdom': 'root'}
286
287    is_error, changed, response = fortios_wireless_controller_hotspot20_h2qp_conn_capability.fortios_wireless_controller_hotspot20(input_data, fos_instance)
288
289    expected_data = {
290        'esp-port': 'closed',
291        'ftp-port': 'closed',
292        'http-port': 'closed',
293        'icmp-port': 'closed',
294        'ikev2-port': 'closed',
295        'ikev2-xx-port': 'closed',
296        'name': 'default_name_9',
297                'pptp-vpn-port': 'closed',
298                'ssh-port': 'closed',
299                'tls-port': 'closed',
300                'voip-tcp-port': 'closed',
301                'voip-udp-port': 'closed'
302    }
303
304    set_method_mock.assert_called_with('wireless-controller.hotspot20', 'h2qp-conn-capability', data=expected_data, vdom='root')
305    schema_method_mock.assert_not_called()
306    assert not is_error
307    assert changed
308    assert response['status'] == 'success'
309    assert response['http_status'] == 200
310