# -*- coding: utf-8 -*-

try:
    import unittest2 as unittest
except ImportError:
    import unittest

from unittest import mock
import six

from pungi.phases.gather.sources.source_module import GatherSourceModule
from tests import helpers
from pungi.module_util import Modulemd


@unittest.skipUnless(Modulemd is not None, "Skipped test, no module support.")
class TestGatherSourceModule(helpers.PungiTestCase):
    def setUp(self):
        super(TestGatherSourceModule, self).setUp()
        self.compose = helpers.DummyCompose(self.topdir, {})

    def _add_pkg(self, arch):
        mock_rpm = mock.Mock(
            version="1.0.0",
            release="1",
            epoch=0,
            excludearch=None,
            exclusivearch=None,
            sourcerpm="pkg-1.0.0-1",
            nevra="pkg-0:1.0.0-1.%s" % arch,
            arch=arch,
        )
        mock_rpm.name = "pkg"
        self.compose.variants["Server"].nsvc_to_pkgset[
            "testmodule:master:1:2017"
        ].rpms_by_arch[arch] = [mock_rpm]

    def test_without_modules(self):
        source = GatherSourceModule(self.compose)
        packages, groups = source("x86_64", self.compose.variants["Server"])
        self.assertEqual(packages, set())
        self.assertEqual(groups, set())

    def test_include_two_packages(self):
        self.compose.variants["Server"].add_fake_module(
            "testmodule:master:1:2017",
            rpm_nvrs=["pkg-0:1.0.0-1.x86_64", "pkg-0:1.0.0-1.i686"],
            with_artifacts=True,
            mmd_arch="x86_64",
        )

        self._add_pkg("x86_64")
        self._add_pkg("i686")

        source = GatherSourceModule(self.compose)
        packages, groups = source("x86_64", self.compose.variants["Server"])
        six.assertCountEqual(
            self,
            [(rpm[0].nevra, rpm[1]) for rpm in packages],
            [("pkg-0:1.0.0-1.x86_64", None), ("pkg-0:1.0.0-1.i686", None)],
        )
        self.assertEqual(groups, set())

    def test_does_not_include_unlisted(self):
        self.compose.variants["Server"].add_fake_module(
            "testmodule:master:1:2017",
            rpm_nvrs=[],
            with_artifacts=True,
            mmd_arch="x86_64",
        )

        self._add_pkg("x86_64")

        source = GatherSourceModule(self.compose)
        packages, groups = source("x86_64", self.compose.variants["Server"])
        self.assertEqual(packages, set())
        self.assertEqual(groups, set())