# -*- coding: utf-8 -*-
"""
integration tests for mac_pkgutil
"""
from __future__ import absolute_import, print_function, unicode_literals

import os

from tests.support.case import ModuleCase
from tests.support.helpers import (
    destructiveTest,
    requires_system_grains,
    runs_on,
    skip_if_binaries_missing,
    skip_if_not_root,
    slowTest,
)
from tests.support.runtests import RUNTIME_VARS

TEST_PKG_URL = (
    "https://distfiles.macports.org/MacPorts/MacPorts-2.3.4-10.11-ElCapitan.pkg"
)
TEST_PKG_NAME = "org.macports.MacPorts"


@runs_on(kernel="Darwin")
@skip_if_not_root
@skip_if_binaries_missing("pkgutil")
class MacPkgutilModuleTest(ModuleCase):
    """
    Validate the mac_pkgutil module
    """

    @classmethod
    def setUpClass(cls):
        cls.test_pkg = os.path.join(
            RUNTIME_VARS.TMP, "MacPorts-2.3.4-10.11-ElCapitan.pkg"
        )

    @requires_system_grains
    def setUp(self, grains):  # pylint: disable=arguments-differ
        """
        Get current settings
        """
        os_release = grains["osrelease"]
        self.pkg_name = "com.apple.pkg.BaseSystemResources"
        if int(os_release.split(".")[1]) >= 13:
            self.pkg_name = "com.apple.pkg.iTunesX"

    def tearDown(self):
        """
        Reset to original settings
        """
        self.run_function("pkgutil.forget", [TEST_PKG_NAME])
        self.run_function("file.remove", ["/opt/local"])

    @slowTest
    def test_list(self):
        """
        Test pkgutil.list
        """
        self.assertIsInstance(self.run_function("pkgutil.list"), list)
        self.assertIn(self.pkg_name, self.run_function("pkgutil.list"))

    @slowTest
    def test_is_installed(self):
        """
        Test pkgutil.is_installed
        """
        # Test Package is installed
        self.assertTrue(self.run_function("pkgutil.is_installed", [self.pkg_name]))

        # Test Package is not installed
        self.assertFalse(self.run_function("pkgutil.is_installed", ["spongebob"]))

    @destructiveTest
    @slowTest
    def test_install_forget(self):
        """
        Test pkgutil.install
        Test pkgutil.forget
        """
        # Test if installed
        self.assertFalse(self.run_function("pkgutil.is_installed", [TEST_PKG_NAME]))

        # Download the package
        self.run_function("cp.get_url", [TEST_PKG_URL, self.test_pkg])

        # Test install
        self.assertTrue(
            self.run_function("pkgutil.install", [self.test_pkg, TEST_PKG_NAME])
        )
        self.assertIn(
            "Unsupported scheme",
            self.run_function("pkgutil.install", ["ftp://test", "spongebob"]),
        )

        # Test forget
        self.assertTrue(self.run_function("pkgutil.forget", [TEST_PKG_NAME]))
