# -*- coding: utf-8 -*-
'''
    :codeauthor: :email:`Jayesh Kariya <jayeshk@saltstack.com>`
'''
# Import Python libs
from __future__ import absolute_import

# Import Salt Testing Libs
from salttesting import skipIf, TestCase
from salttesting.mock import (
    NO_MOCK,
    NO_MOCK_REASON,
    MagicMock,
    patch)

from salttesting.helpers import ensure_in_syspath

ensure_in_syspath('../../')

# Import Salt Libs
from salt.modules import varnish

# Globals
varnish.__salt__ = {}


@skipIf(NO_MOCK, NO_MOCK_REASON)
class VarnishTestCase(TestCase):
    '''
    Test cases for salt.modules.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'})


if __name__ == '__main__':
    from integration import run_tests
    run_tests(VarnishTestCase, needs_daemon=False)
