import os
import unittest

from osc._private.package import ApiPackage
from osc._private.package import LocalPackage
from osc._private.package import PackageBase

from .common import GET
from .common import OscTestCase


FIXTURES_DIR = os.path.join(os.path.dirname(__file__), "fixtures", "packages")


class PackageBaseMock(PackageBase):
    def _get_directory_node(self):
        pass

    def _load_from_directory_node(self, directory_node):
        pass


class TestPackageBase(unittest.TestCase):
    def setUp(self):
        self.p1 = PackageBaseMock("http://urlA", "projA", "pkgA")

    def test_str(self):
        self.assertEqual(str(self.p1), "projA/pkgA")

    def test_repr(self):
        self.assertTrue(repr(self.p1).endswith("(projA/pkgA)"))

    def test_eq(self):
        # the same
        p2 = PackageBaseMock(self.p1.apiurl, self.p1.project, self.p1.name)
        self.assertEqual(self.p1, p2)

        # package name differs
        p2 = PackageBaseMock(self.p1.apiurl, self.p1.project, "pkgB")
        self.assertNotEqual(self.p1, p2)

        # project name differs
        p2 = PackageBaseMock(self.p1.apiurl, "projB", self.p1.name)
        self.assertNotEqual(self.p1, p2)

        # baseurl differs
        p2 = PackageBaseMock("http://urlB", self.p1.project, self.p1.name)
        self.assertNotEqual(self.p1, p2)

    def test_lt(self):
        # the same
        p2 = PackageBaseMock(self.p1.apiurl, self.p1.project, self.p1.name)
        self.assertFalse(self.p1 < p2)

        # package name differs
        p2 = PackageBaseMock(self.p1.apiurl, self.p1.project, "pkgB")
        self.assertTrue(self.p1 < p2)

        # project name differs
        p2 = PackageBaseMock(self.p1.apiurl, "projB", self.p1.name)
        self.assertTrue(self.p1 < p2)

        # baseurl differs
        p2 = PackageBaseMock("http://urlB", self.p1.project, self.p1.name)
        self.assertTrue(self.p1 < p2)

    def test_hash(self):
        p2 = PackageBaseMock(self.p1.apiurl, self.p1.project, self.p1.name)
        self.assertEqual(hash(self.p1), hash(p2))

        packages = set()
        packages.add(self.p1)
        # the second instance appears to be there because it has the same hash
        # it is ok, because we consider such packages equal
        self.assertIn(p2, packages)


class TestLocalPackage(OscTestCase):
    def _get_fixtures_dir(self):
        return FIXTURES_DIR

    def test_load(self):
        path = os.path.join(self.tmpdir, "osctest", "openSUSE:Tools", "osc")
        p = LocalPackage(path)

        self.assertEqual(p.name, "osc")
        self.assertEqual(p.project, "openSUSE:Tools")
        self.assertEqual(p.apiurl, "http://localhost")
        self.assertEqual(p.rev, "373")
        self.assertEqual(p.vrev, "339")
        self.assertEqual(p.srcmd5, "30ccce6c3a1a4322e79c2935a52af18b")

        self.assertEqual(p.linkinfo.project, "openSUSE:Factory")
        self.assertEqual(p.linkinfo.package, "osc")
        self.assertEqual(p.linkinfo.srcmd5, "1ccbcd1b0b531a37ad75b34b5a1e2e3e")
        self.assertEqual(p.linkinfo.baserev, "2c3ae65909d69e0f63113ccfe0e5f3f8")
        self.assertEqual(p.linkinfo.xsrcmd5, "6a31b956f9431b0644ad6cf8e845c4e5")
        self.assertEqual(p.linkinfo.lsrcmd5, "30ccce6c3a1a4322e79c2935a52af18b")

        self.assertEqual(len(p.files), 3)

        f = p.files[0]
        self.assertEqual(f.name, "osc-0.182.0.tar.gz")
        self.assertEqual(f.md5, "87f040c76f3da86fd7218c972b9df1dc")
        self.assertEqual(f.size, 381596)
        self.assertEqual(f.mtime, 1662638726)


class TestApiPackage(OscTestCase):
    def _get_fixtures_dir(self):
        return FIXTURES_DIR

    @GET("http://localhost/source/openSUSE:Tools/osc", file="osctest/openSUSE:Tools/osc/.osc/_files")
    def test_load(self):
        p = ApiPackage("http://localhost", "openSUSE:Tools", "osc")

        self.assertEqual(p.name, "osc")
        self.assertEqual(p.project, "openSUSE:Tools")
        self.assertEqual(p.apiurl, "http://localhost")
        self.assertEqual(p.rev, "373")
        self.assertEqual(p.vrev, "339")
        self.assertEqual(p.srcmd5, "30ccce6c3a1a4322e79c2935a52af18b")

        self.assertEqual(p.linkinfo.project, "openSUSE:Factory")
        self.assertEqual(p.linkinfo.package, "osc")
        self.assertEqual(p.linkinfo.srcmd5, "1ccbcd1b0b531a37ad75b34b5a1e2e3e")
        self.assertEqual(p.linkinfo.baserev, "2c3ae65909d69e0f63113ccfe0e5f3f8")
        self.assertEqual(p.linkinfo.xsrcmd5, "6a31b956f9431b0644ad6cf8e845c4e5")
        self.assertEqual(p.linkinfo.lsrcmd5, "30ccce6c3a1a4322e79c2935a52af18b")

        self.assertEqual(len(p.files), 3)

        f = p.files[0]
        self.assertEqual(f.name, "osc-0.182.0.tar.gz")
        self.assertEqual(f.md5, "87f040c76f3da86fd7218c972b9df1dc")
        self.assertEqual(f.size, 381596)
        self.assertEqual(f.mtime, 1662638726)


if __name__ == "__main__":
    unittest.main()