# -*- coding: utf-8 -*-

# (c) 2019, Ansible by Red Hat, inc
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

# Make coding more python3-ish
from __future__ import absolute_import, division, print_function

__metaclass__ = type

from ansible_collections.cisco.asa.tests.unit.compat.mock import patch
from ansible_collections.cisco.asa.plugins.modules import asa_og
from ansible_collections.cisco.asa.tests.unit.modules.utils import (
    set_module_args,
)
from .asa_module import TestAsaModule, load_fixture


class TestAsaOgModule(TestAsaModule):

    module = asa_og

    def setUp(self):
        super(TestAsaOgModule, self).setUp()

        self.mock_get_config = patch(
            "ansible_collections.cisco.asa.plugins.modules.asa_og.get_config"
        )
        self.get_config = self.mock_get_config.start()

        self.mock_load_config = patch(
            "ansible_collections.cisco.asa.plugins.modules.asa_og.load_config"
        )
        self.load_config = self.mock_load_config.start()

        self.mock_get_connection = patch(
            "ansible_collections.cisco.asa.plugins.module_utils.network.asa.asa.get_connection"
        )
        self.get_connection = self.mock_get_connection.start()

    def tearDown(self):
        super(TestAsaOgModule, self).tearDown()
        self.mock_get_config.stop()
        self.mock_load_config.stop()

    def load_fixtures(self, commands=None):
        self.get_config.return_value = load_fixture(
            "asa_og_config.cfg"
        ).strip()
        self.load_config.return_value = dict(diff=None, session="session")

    def test_asa_og_idempotent(self):
        set_module_args(
            dict(
                name="test_nets",
                group_type="network-object",
                host_ip=["8.8.8.8"],
                ip_mask=["192.168.0.0 255.255.0.0"],
                group_object=["awx_lon"],
                description="ansible_test object-group description",
                state="present",
            )
        )
        commands = []
        self.execute_module(changed=False, commands=commands)

    def test_asa_og_add(self):
        set_module_args(
            dict(
                name="test_nets",
                group_type="network-object",
                host_ip=["8.8.8.8", "8.8.4.4"],
                ip_mask=["192.168.0.0 255.255.0.0", "10.0.0.0 255.255.255.0"],
                group_object=["awx_lon", "awx_ams"],
                description="ansible_test object-group description",
                state="present",
            )
        )
        commands = [
            "object-group network test_nets",
            "network-object host 8.8.4.4",
            "network-object 10.0.0.0 255.255.255.0",
            "group-object awx_ams",
        ]
        self.execute_module(changed=True, commands=commands)

    def test_asa_og_replace(self):
        set_module_args(
            dict(
                name="test_nets",
                group_type="network-object",
                host_ip=["8.8.4.4"],
                ip_mask=["10.0.0.0 255.255.255.0"],
                group_object=["awx_ams"],
                description="ansible_test custom description",
                state="replace",
            )
        )
        commands = [
            "object-group network test_nets",
            "description ansible_test custom description",
            "no network-object host 8.8.8.8",
            "network-object host 8.8.4.4",
            "no network-object 192.168.0.0 255.255.0.0",
            "network-object 10.0.0.0 255.255.255.0",
            "no group-object awx_lon",
            "group-object awx_ams",
        ]
        self.execute_module(changed=True, commands=commands)

    def test_asa_og_remove(self):
        set_module_args(
            dict(
                name="test_nets",
                group_type="network-object",
                host_ip=["8.8.8.8"],
                group_object=["awx_lon"],
                state="absent",
            )
        )
        commands = [
            "object-group network test_nets",
            "no network-object host 8.8.8.8",
            "no group-object awx_lon",
        ]
        self.execute_module(changed=True, commands=commands)
