# -*- coding: utf-8 -*-
'''
Tests for the Chocolatey State
'''
# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals
import logging

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

# Import Salt libs
import salt.utils.platform

log = logging.getLogger(__name__)

__testcontext__ = {}


@destructiveTest
@skipIf(not salt.utils.platform.is_windows(), 'Windows Specific Test')
class ChocolateyTest(ModuleCase, SaltReturnAssertsMixin):
    '''
    Chocolatey State Tests
    These tests are destructive as the install and remove software
    '''

    def setUp(self):
        '''
        Ensure that Chocolatey is installed
        '''
        super(ChocolateyTest, self).setUp()
        if 'chocolatey' not in __testcontext__:
            self.run_function('chocolatey.bootstrap')
            __testcontext__['chocolatey'] = True

    def test_chocolatey(self):
        '''
        Test the following:
        - `chocolatey.installed`
        - `chocolatey.upgraded`
        - `chocolatey.uninstalled`
        '''
        # If this assert fails, we need to find new targets, this test needs to
        # be able to test successful installation of packages, so this package
        # needs to NOT be installed before we run the states below
        target = 'firefox'
        pre_version = '52.0.2'
        upg_version = '57.0.2'
        log.debug('Making sure %s is not installed', target)
        self.assertFalse(
            self.run_function('chocolatey.version', [target]))

        try:
            ####################################################
            # Test `chocolatey.installed`
            ####################################################
            # Install the package
            log.debug('Testing chocolatey.installed')
            ret = self.run_state(
                'chocolatey.installed',
                name=target,
                version=pre_version)
            self.assertSaltTrueReturn(ret)

            # Verify the package is installed
            log.debug('Verifying install success')
            ret = self.run_function('chocolatey.version', [target])
            self.assertEqual(ret, {'Firefox': [pre_version]})

            ####################################################
            # Test `chocolatey.upgraded`
            ####################################################
            # Upgrade the package
            log.debug('Testing chocolatey.upgraded')
            ret = self.run_state(
                'chocolatey.upgraded',
                name=target,
                version=upg_version)
            self.assertSaltTrueReturn(ret)

            # Verify the package is upgraded
            log.debug('Verifying upgrade success')
            ret = self.run_function('chocolatey.version', [target])
            self.assertEqual(ret, {'Firefox': [upg_version]})

            ####################################################
            # Test `chocolatey.uninstalled`
            ####################################################
            # uninstall the package
            log.debug('Testing chocolatey.uninstalled')
            ret = self.run_state('chocolatey.uninstalled', name=target)
            self.assertSaltTrueReturn(ret)

            # Verify the package is uninstalled
            log.debug('Verifying uninstall success')
            ret = self.run_function('chocolatey.version', [target])
            self.assertEqual(ret, {})

        finally:
            # Always uninstall
            log.debug('Uninstalling %s', target)
            self.run_function('chocolatey.uninstall', [target])
