# -*- coding: utf-8 -*-
"""
    :codeauthor: Rahul Handay <rahulha@saltstack.com>
"""

# Import Python Libs
from __future__ import absolute_import, print_function, unicode_literals

# Import Salt Libs
import salt.states.win_servermanager as win_servermanager

# Import Salt Testing Libs
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.mock import MagicMock, patch
from tests.support.unit import TestCase


class WinServermanagerTestCase(TestCase, LoaderModuleMockMixin):
    """
        Validate the win_servermanager state
    """

    def setup_loader_modules(self):
        return {win_servermanager: {}}

    def test_installed(self):
        """
            Test to install the windows feature
        """
        mock_list = MagicMock(
            side_effect=[
                {"spongebob": "squarepants"},
                {"squidward": "patrick"},
                {"spongebob": "squarepants"},
                {"spongebob": "squarepants", "squidward": "patrick"},
            ]
        )
        mock_install = MagicMock(
            return_value={
                "Success": True,
                "Restarted": False,
                "RestartNeeded": False,
                "ExitCode": 1234,
                "Features": {
                    "squidward": {
                        "DisplayName": "Squidward",
                        "Message": "",
                        "RestartNeeded": True,
                        "SkipReason": 0,
                        "Success": True,
                    }
                },
            }
        )
        with patch.dict(
            win_servermanager.__salt__,
            {
                "win_servermanager.list_installed": mock_list,
                "win_servermanager.install": mock_install,
            },
        ):
            ret = {
                "name": "spongebob",
                "changes": {},
                "result": True,
                "comment": "The following features are already installed:\n"
                "- spongebob",
            }
            self.assertDictEqual(win_servermanager.installed("spongebob"), ret)

            with patch.dict(win_servermanager.__opts__, {"test": True}):
                ret = {
                    "name": "spongebob",
                    "result": None,
                    "comment": "",
                    "changes": {"spongebob": "Will be installed recurse=False"},
                }
                self.assertDictEqual(win_servermanager.installed("spongebob"), ret)

            with patch.dict(win_servermanager.__opts__, {"test": False}):
                ret = {
                    "name": "squidward",
                    "result": True,
                    "comment": "Installed the following:\n- squidward",
                    "changes": {"squidward": {"new": "patrick", "old": ""}},
                }
                self.assertDictEqual(win_servermanager.installed("squidward"), ret)

    def test_removed(self):
        """
            Test to remove the windows feature
        """
        mock_list = MagicMock(
            side_effect=[
                {"spongebob": "squarepants"},
                {"squidward": "patrick"},
                {"spongebob": "squarepants", "squidward": "patrick"},
                {"spongebob": "squarepants"},
            ]
        )
        mock_remove = MagicMock(
            return_value={
                "Success": True,
                "RestartNeeded": False,
                "Restarted": False,
                "ExitCode": 1234,
                "Features": {
                    "squidward": {
                        "DisplayName": "Squidward",
                        "Message": "",
                        "RestartNeeded": True,
                        "SkipReason": 0,
                        "Success": True,
                    }
                },
            }
        )
        with patch.dict(
            win_servermanager.__salt__,
            {
                "win_servermanager.list_installed": mock_list,
                "win_servermanager.remove": mock_remove,
            },
        ):
            ret = {
                "name": "squidward",
                "changes": {},
                "result": True,
                "comment": "The following features are not installed:\n" "- squidward",
            }
            self.assertDictEqual(win_servermanager.removed("squidward"), ret)

            with patch.dict(win_servermanager.__opts__, {"test": True}):
                ret = {
                    "name": "squidward",
                    "result": None,
                    "comment": "",
                    "changes": {"squidward": "Will be removed"},
                }
                self.assertDictEqual(win_servermanager.removed("squidward"), ret)

            with patch.dict(win_servermanager.__opts__, {"test": False}):
                ret = {
                    "name": "squidward",
                    "result": True,
                    "comment": "Removed the following:\n- squidward",
                    "changes": {"squidward": {"new": "", "old": "patrick"}},
                }
                self.assertDictEqual(win_servermanager.removed("squidward"), ret)
