# -*- coding: utf-8 -*-
'''
unit tests for the slack engine
'''
# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals

# Import Salt Testing Libs
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.unit import skipIf, TestCase
from tests.support.mock import (
    NO_MOCK,
    NO_MOCK_REASON,
    MagicMock,
    patch)

# Import Salt Libs
import salt.engines.slack as slack
import salt.config


@skipIf(slack.HAS_SLACKCLIENT is False, 'The SlackClient is not installed')
@skipIf(NO_MOCK, NO_MOCK_REASON)
class EngineSlackTestCase(TestCase, LoaderModuleMockMixin):
    '''
    Test cases for salt.engine.sqs_events
    '''

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

    def setUp(self):
        mock_opts = salt.config.DEFAULT_MINION_OPTS
        token = 'xoxb-xxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx'

        with patch.dict(slack.__opts__, mock_opts):
            with patch('slackclient.SlackClient.rtm_connect', MagicMock(return_value=True)):
                self.client = slack.SlackClient(token)

    def test_control_message_target(self):
        '''
        Test slack engine: control_message_target
        '''
        trigger_string = '!'

        loaded_groups = {'default': {'targets': {},
                                     'commands': set(['cmd.run', 'test.ping']),
                                     'default_target': {'tgt_type': 'glob', 'target': '*'},
                                     'users': set(['gareth']),
                                     'aliases': {'whoami': {'cmd': 'cmd.run whoami'},
                                                 'list_pillar': {'cmd': 'pillar.items'}}
                                     }}

        slack_user_name = 'gareth'

        # Check for correct cmdline
        _expected = (True,
                     {'tgt_type': 'glob', 'target': '*'},
                     ['cmd.run', 'whoami'])
        text = '!cmd.run whoami'
        target_commandline = self.client.control_message_target(slack_user_name,
                                                                text,
                                                                loaded_groups,
                                                                trigger_string)

        self.assertEqual(target_commandline, _expected)

        # Check aliases result in correct cmdline
        text = '!whoami'
        target_commandline = self.client.control_message_target(slack_user_name,
                                                                text,
                                                                loaded_groups,
                                                                trigger_string)

        self.assertEqual(target_commandline, _expected)

        # Check pillar is overrided
        _expected = (True,
                     {'tgt_type': 'glob', 'target': '*'},
                     ['pillar.items', 'pillar={"hello": "world"}'])
        text = r"""!list_pillar pillar='{"hello": "world"}'"""
        target_commandline = self.client.control_message_target(slack_user_name,
                                                                text,
                                                                loaded_groups,
                                                                trigger_string)

        self.assertEqual(target_commandline, _expected)

        # Check target is overrided
        _expected = (True,
                     {'tgt_type': 'glob', 'target': 'localhost'},
                     ['cmd.run', 'whoami'])
        text = "!cmd.run whoami target='localhost'"
        target_commandline = self.client.control_message_target(slack_user_name,
                                                                text,
                                                                loaded_groups,
                                                                trigger_string)

        self.assertEqual(target_commandline, _expected)
