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

# Import Python libs
from __future__ import absolute_import
import collections

# Import Salt Testing Libs
from tests.support import mock
from tests.support import mixins
from tests.support.unit import skipIf, TestCase

# Import Salt Libs
import salt.roster.sshconfig as sshconfig

_SAMPLE_SSH_CONFIG = """
Host *
    User user.mcuserface

Host abc*
    IdentityFile ~/.ssh/id_rsa_abc

Host def*
    IdentityFile ~/.ssh/id_rsa_def

Host abc.asdfgfdhgjkl.com
    HostName 123.123.123.123

Host abc123.asdfgfdhgjkl.com
    HostName 123.123.123.124

Host def.asdfgfdhgjkl.com
    HostName 234.234.234.234
"""

_TARGET_ABC = collections.OrderedDict([
    ('user', 'user.mcuserface'),
    ('priv', '~/.ssh/id_rsa_abc'),
    ('host', 'abc.asdfgfdhgjkl.com')
])

_TARGET_ABC123 = collections.OrderedDict([
    ('user', 'user.mcuserface'),
    ('priv', '~/.ssh/id_rsa_abc'),
    ('host', 'abc123.asdfgfdhgjkl.com')
])

_TARGET_DEF = collections.OrderedDict([
    ('user', 'user.mcuserface'),
    ('priv', '~/.ssh/id_rsa_def'),
    ('host', 'def.asdfgfdhgjkl.com')
])

_ALL = {
    'abc.asdfgfdhgjkl.com': _TARGET_ABC,
    'abc123.asdfgfdhgjkl.com': _TARGET_ABC123,
    'def.asdfgfdhgjkl.com': _TARGET_DEF
}

_ABC_GLOB = {
    'abc.asdfgfdhgjkl.com': _TARGET_ABC,
    'abc123.asdfgfdhgjkl.com': _TARGET_ABC123
}


@skipIf(mock.NO_MOCK, mock.NO_MOCK_REASON)
class SSHConfigRosterTestCase(TestCase, mixins.LoaderModuleMockMixin):

    @classmethod
    def setUpClass(cls):
        cls.mock_fp = mock_fp = mock.mock_open(read_data=_SAMPLE_SSH_CONFIG)

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

    def test_all(self):
        with mock.patch('salt.utils.files.fopen', self.mock_fp):
            with mock.patch('salt.roster.sshconfig._get_ssh_config_file'):
                targets = sshconfig.targets('*')
        self.assertEqual(targets, _ALL)

    def test_abc_glob(self):
        with mock.patch('salt.utils.files.fopen', self.mock_fp):
            with mock.patch('salt.roster.sshconfig._get_ssh_config_file'):
                targets = sshconfig.targets('abc*')
        self.assertEqual(targets, _ABC_GLOB)
