# -*- coding: utf-8 -*-
"""
    :codeauthor: Rupesh Tare <rupesht@saltstack.com>
"""
# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals

import os

# Import Salt Libs
import salt.modules.debconfmod as debconfmod

# Import Salt Testing Libs
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.mock import MagicMock, patch
from tests.support.unit import TestCase


class DebconfmodTestCase(TestCase, LoaderModuleMockMixin):
    """
    Test cases for salt.modules.DebconfmodTestCase
    """

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

    def test_get_selections(self):
        """
        Test for Answers to debconf questions for all packages
        """
        mock = MagicMock(return_value=[])
        with patch.dict(debconfmod.__salt__, {"cmd.run_stdout": mock}):
            with patch.object(debconfmod, "_unpack_lines", mock):
                self.assertEqual(debconfmod.get_selections(False), {})

    def test_show(self):
        """
        Test for Answers to debconf questions for a package
        """
        mock = MagicMock(return_value={})
        with patch.object(debconfmod, "get_selections", mock):
            self.assertEqual(debconfmod.show("name"), None)

    def test_set_(self):
        """
        Test for Set answers to debconf questions for a package.
        """
        mock = MagicMock(return_value=None)
        with patch.object(os, "write", mock):
            with patch.object(os, "close", mock):
                with patch.object(debconfmod, "_set_file", mock):
                    with patch.object(os, "unlink", mock):
                        self.assertTrue(
                            debconfmod.set_("package", "question", "type", "value")
                        )

    def test_set_template(self):
        """
        Test for Set answers to debconf questions from a template.
        """
        mock = MagicMock(return_value="A")
        with patch.dict(debconfmod.__salt__, {"cp.get_template": mock}):
            with patch.object(debconfmod, "set_file", mock):
                self.assertEqual(
                    debconfmod.set_template(
                        "path", "template", "context", "defaults", "saltenv"
                    ),
                    "A",
                )

    def test_set_file(self):
        """
        Test for Set answers to debconf questions from a file.
        """
        mock = MagicMock(return_value="A")
        with patch.dict(debconfmod.__salt__, {"cp.cache_file": mock}):
            mock = MagicMock(return_value=None)
            with patch.object(debconfmod, "_set_file", mock):
                self.assertTrue(debconfmod.set_file("path"))

        mock = MagicMock(return_value=False)
        with patch.dict(debconfmod.__salt__, {"cp.cache_file": mock}):
            mock = MagicMock(return_value=None)
            with patch.object(debconfmod, "_set_file", mock):
                self.assertFalse(debconfmod.set_file("path"))
