"""
    :codeauthor: Jayesh Kariya <jayeshk@saltstack.com>
"""

import salt.modules.varnish as varnish
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.mock import MagicMock, patch
from tests.support.unit import TestCase


class VarnishTestCase(TestCase, LoaderModuleMockMixin):
    """
    Test cases for salt.modules.varnish
    """

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

    def test_version(self):
        """
        Test to return server version from varnishd -V
        """
        with patch.dict(
            varnish.__salt__, {"cmd.run": MagicMock(return_value="(varnish-2.0)")}
        ):
            self.assertEqual(varnish.version(), "2.0")

    def test_ban(self):
        """
        Test to add ban to the varnish cache
        """
        with patch.object(varnish, "_run_varnishadm", return_value={"retcode": 0}):
            self.assertTrue(varnish.ban("ban_expression"))

    def test_ban_list(self):
        """
        Test to list varnish cache current bans
        """
        with patch.object(varnish, "_run_varnishadm", return_value={"retcode": True}):
            self.assertFalse(varnish.ban_list())

        with patch.object(
            varnish,
            "_run_varnishadm",
            return_value={"retcode": False, "stdout": "A\nB\nC"},
        ):
            self.assertEqual(varnish.ban_list(), ["B", "C"])

    def test_purge(self):
        """
        Test to purge the varnish cache
        """
        with patch.object(varnish, "ban", return_value=True):
            self.assertTrue(varnish.purge())

    def test_param_set(self):
        """
        Test to set a param in varnish cache
        """
        with patch.object(varnish, "_run_varnishadm", return_value={"retcode": 0}):
            self.assertTrue(varnish.param_set("param", "value"))

    def test_param_show(self):
        """
        Test to show params of varnish cache
        """
        with patch.object(
            varnish,
            "_run_varnishadm",
            return_value={"retcode": True, "stdout": "A\nB\nC"},
        ):
            self.assertFalse(varnish.param_show("param"))

        with patch.object(
            varnish,
            "_run_varnishadm",
            return_value={"retcode": False, "stdout": "A .1\nB .2\n"},
        ):
            self.assertEqual(varnish.param_show("param"), {"A": ".1"})
