1# -*- coding: utf-8 -*-
2#
3# Copyright: (c) 2018, F5 Networks Inc.
4# GNU General Public License v3.0 (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
6from __future__ import (absolute_import, division, print_function)
7__metaclass__ = type
8
9import os
10import json
11import pytest
12import sys
13
14if sys.version_info < (2, 7):
15    pytestmark = pytest.mark.skip("F5 Ansible modules require Python >= 2.7")
16
17from ansible.module_utils.basic import AnsibleModule
18
19from ansible_collections.f5networks.f5_modules.plugins.modules.bigip_firewall_rule import (
20    ModuleParameters, ModuleManager, ArgumentSpec
21)
22from ansible_collections.f5networks.f5_modules.tests.unit.compat import unittest
23from ansible_collections.f5networks.f5_modules.tests.unit.compat.mock import Mock, patch
24from ansible_collections.f5networks.f5_modules.tests.unit.modules.utils import set_module_args
25
26
27fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
28fixture_data = {}
29
30
31def load_fixture(name):
32    path = os.path.join(fixture_path, name)
33
34    if path in fixture_data:
35        return fixture_data[path]
36
37    with open(path) as f:
38        data = f.read()
39
40    try:
41        data = json.loads(data)
42    except Exception:
43        pass
44
45    fixture_data[path] = data
46    return data
47
48
49class TestParameters(unittest.TestCase):
50    def test_module_parameters(self):
51        args = dict(
52            name='foo',
53            parent_policy='policy1',
54            protocol='tcp',
55            source=[
56                dict(address='1.2.3.4'),
57                dict(address='::1'),
58                dict(address_list='foo-list1'),
59                dict(address_range='1.1.1.1-2.2.2.2.'),
60                dict(vlan='vlan1'),
61                dict(country='US'),
62                dict(port='22'),
63                dict(port_list='port-list1'),
64                dict(port_range='80-443'),
65            ],
66            destination=[
67                dict(address='1.2.3.4'),
68                dict(address='::1'),
69                dict(address_list='foo-list1'),
70                dict(address_range='1.1.1.1-2.2.2.2.'),
71                dict(country='US'),
72                dict(port='22'),
73                dict(port_list='port-list1'),
74                dict(port_range='80-443'),
75            ],
76            irule='irule1',
77            action='accept',
78            logging=True,
79        )
80
81        p = ModuleParameters(params=args)
82        assert p.irule == '/Common/irule1'
83        assert p.action == 'accept'
84        assert p.logging is True
85
86
87class TestManager(unittest.TestCase):
88
89    def setUp(self):
90        self.spec = ArgumentSpec()
91        self.p2 = patch('ansible_collections.f5networks.f5_modules.plugins.modules.bigip_firewall_rule.tmos_version')
92        self.p3 = patch('ansible_collections.f5networks.f5_modules.plugins.modules.bigip_firewall_rule.send_teem')
93        self.m2 = self.p2.start()
94        self.m2.return_value = '14.1.0'
95        self.m3 = self.p3.start()
96        self.m3.return_value = True
97
98    def tearDown(self):
99        self.p2.stop()
100        self.p3.stop()
101
102    def test_create_monitor(self, *args):
103        set_module_args(dict(
104            name='foo',
105            parent_policy='policy1',
106            protocol='tcp',
107            source=[
108                dict(address='1.2.3.4'),
109                dict(address='::1'),
110                dict(address_list='foo-list1'),
111                dict(address_range='1.1.1.1-2.2.2.2.'),
112                dict(vlan='vlan1'),
113                dict(country='US'),
114                dict(port='22'),
115                dict(port_list='port-list1'),
116                dict(port_range='80-443'),
117            ],
118            destination=[
119                dict(address='1.2.3.4'),
120                dict(address='::1'),
121                dict(address_list='foo-list1'),
122                dict(address_range='1.1.1.1-2.2.2.2.'),
123                dict(country='US'),
124                dict(port='22'),
125                dict(port_list='port-list1'),
126                dict(port_range='80-443'),
127            ],
128            irule='irule1',
129            action='accept',
130            logging='yes',
131            provider=dict(
132                server='localhost',
133                password='password',
134                user='admin'
135            )
136        ))
137
138        module = AnsibleModule(
139            argument_spec=self.spec.argument_spec,
140            supports_check_mode=self.spec.supports_check_mode,
141            mutually_exclusive=self.spec.mutually_exclusive,
142            required_one_of=self.spec.required_one_of
143        )
144
145        # Override methods in the specific type of manager
146        mm = ModuleManager(module=module)
147        mm.exists = Mock(side_effect=[False, True])
148        mm.create_on_device = Mock(return_value=True)
149
150        results = mm.exec_module()
151
152        assert results['changed'] is True
153