"""
unittests for terraform roster
"""
import os.path

import salt.config
import salt.loader
from salt.roster import terraform
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.mock import patch
from tests.support.runtests import RUNTIME_VARS
from tests.support.unit import TestCase


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 which 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 which 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)
