# -*- coding: utf-8 -*-
"""
Integration tests for the alternatives state module
"""

# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals

import os

# Import Salt Testing libs
from tests.support.case import ModuleCase
from tests.support.helpers import destructiveTest, slowTest
from tests.support.mixins import SaltReturnAssertsMixin
from tests.support.runtests import RUNTIME_VARS
from tests.support.unit import skipIf

NO_ALTERNATIVES = False
if not os.path.exists("/etc/alternatives"):
    NO_ALTERNATIVES = True


@skipIf(NO_ALTERNATIVES, "/etc/alternatives does not exist on the system")
class AlterantivesStateTest(ModuleCase, SaltReturnAssertsMixin):
    @destructiveTest
    @slowTest
    def test_install_set_and_remove(self):
        ret = self.run_state(
            "alternatives.set", name="alt-test", path=RUNTIME_VARS.SHELL_TRUE_PATH
        )
        self.assertSaltFalseReturn(ret)

        ret = self.run_state(
            "alternatives.install",
            name="alt-test",
            link="/usr/local/bin/alt-test",
            path=RUNTIME_VARS.SHELL_TRUE_PATH,
            priority=50,
        )
        self.assertSaltTrueReturn(ret)
        self.assertSaltStateChangesEqual(
            ret, RUNTIME_VARS.SHELL_TRUE_PATH, keys=["path"]
        )

        ret = self.run_state(
            "alternatives.install",
            name="alt-test",
            link="/usr/local/bin/alt-test",
            path=RUNTIME_VARS.SHELL_TRUE_PATH,
            priority=50,
        )
        self.assertSaltTrueReturn(ret)
        self.assertSaltStateChangesEqual(ret, {})

        ret = self.run_state(
            "alternatives.install",
            name="alt-test",
            link="/usr/local/bin/alt-test",
            path=RUNTIME_VARS.SHELL_FALSE_PATH,
            priority=90,
        )
        self.assertSaltTrueReturn(ret)
        self.assertSaltStateChangesEqual(
            ret, RUNTIME_VARS.SHELL_FALSE_PATH, keys=["path"]
        )

        ret = self.run_state(
            "alternatives.set", name="alt-test", path=RUNTIME_VARS.SHELL_FALSE_PATH
        )
        self.assertSaltTrueReturn(ret)
        self.assertSaltStateChangesEqual(ret, {})

        ret = self.run_state(
            "alternatives.set", name="alt-test", path=RUNTIME_VARS.SHELL_TRUE_PATH
        )
        self.assertSaltTrueReturn(ret)
        self.assertSaltStateChangesEqual(
            ret, RUNTIME_VARS.SHELL_TRUE_PATH, keys=["path"]
        )

        ret = self.run_state(
            "alternatives.set", name="alt-test", path=RUNTIME_VARS.SHELL_TRUE_PATH
        )
        self.assertSaltTrueReturn(ret)
        self.assertSaltStateChangesEqual(ret, {})

        ret = self.run_state(
            "alternatives.remove", name="alt-test", path=RUNTIME_VARS.SHELL_TRUE_PATH
        )
        self.assertSaltTrueReturn(ret)

        ret = self.run_state(
            "alternatives.remove", name="alt-test", path=RUNTIME_VARS.SHELL_FALSE_PATH
        )
        self.assertSaltTrueReturn(ret)
