# -*- coding: utf-8 -*-
'''
unittests for terraform roster
'''
# Import Python libs
from __future__ import absolute_import, unicode_literals
import os.path

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

# Import Salt Libs
import salt.config
import salt.loader
from salt.roster import terraform


@skipIf(NO_MOCK, NO_MOCK_REASON)
class TerraformTestCase(TestCase, LoaderModuleMockMixin):
    '''
    Test cases for salt.roster.terraform
    '''
    def setup_loader_modules(self):
        opts = salt.config.master_config(os.path.join(RUNTIME_VARS.TMP_CONF_DIR, 'master'))
        utils = salt.loader.utils(opts, whitelist=['roster_matcher'])
        return {
            terraform: {
                '__utils__': utils,
                '__opts__': {},
            }
        }

    def test_default_output(self):
        '''
        Test the output of a fixture tfstate file wich contains libvirt
        resources.
        '''
        tfstate = os.path.join(os.path.dirname(__file__), 'terraform.data', 'terraform.tfstate')
        pki_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'terraform.data'))

        with patch.dict(terraform.__opts__, {'roster_file': tfstate, 'pki_dir': pki_dir}):
            expected_result = {
                'db0': {
                    'host': '192.168.122.174',
                    'user': 'root',
                    'passwd': 'dbpw',
                    'tty': True,
                    'priv': os.path.join(pki_dir, 'ssh', 'salt-ssh.rsa')},
                'db1': {
                    'host': '192.168.122.190',
                    'user': 'root',
                    'passwd': 'dbpw',
                    'tty': True,
                    'priv': os.path.join(pki_dir, 'ssh', 'salt-ssh.rsa')},
                'web0': {
                    'host': '192.168.122.106',
                    'user': 'root',
                    'passwd': 'linux',
                    'timeout': 22,
                    'priv': os.path.join(pki_dir, 'ssh', 'salt-ssh.rsa')},
                'web1': {
                    'host': '192.168.122.235',
                    'user': 'root',
                    'passwd': 'linux',
                    'timeout': 22,
                    'priv': os.path.join(pki_dir, 'ssh', 'salt-ssh.rsa')}
            }

            ret = terraform.targets('*')
            self.assertDictEqual(expected_result, ret)

    def test_default_matching(self):
        '''
        Test the output of a fixture tfstate file wich contains libvirt
        resources using matching
        '''
        tfstate = os.path.join(os.path.dirname(__file__), 'terraform.data', 'terraform.tfstate')
        pki_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'terraform.data'))

        with patch.dict(terraform.__opts__, {'roster_file': tfstate, 'pki_dir': pki_dir}):
            expected_result = {
                'web0': {
                    'host': '192.168.122.106',
                    'user': 'root',
                    'passwd': 'linux',
                    'timeout': 22,
                    'priv': os.path.join(pki_dir, 'ssh', 'salt-ssh.rsa')},
                'web1': {
                    'host': '192.168.122.235',
                    'user': 'root',
                    'passwd': 'linux',
                    'timeout': 22,
                    'priv': os.path.join(pki_dir, 'ssh', 'salt-ssh.rsa')}
            }

            ret = terraform.targets('*web*')
            self.assertDictEqual(expected_result, ret)
