"""
tests for models
"""

from datetime import datetime

from django.test import TestCase
from django.db import IntegrityError
from django.core.exceptions import ValidationError
from django.utils.timezone import utc

from djeuscan.models import Package, EuscanResult
from djeuscan.tests.euscan_factory import VersionFactory, PackageFactory, \
    EuscanResultFactory, setup_maintainers, setup_herds, setup_categories, \
    setup_overlays


class VersionModelTests(TestCase):
    def test_creation(self):
        package = PackageFactory.build()
        version = VersionFactory.build(package=package)
        self.assertEqual(version.package, package)

    def test_not_allowed_creation(self):
        package = PackageFactory.create()
        VersionFactory.create(package=package)

        with self.assertRaises((IntegrityError, ValidationError)):
            VersionFactory.create(package=package)


class PackageModelTests(TestCase):
    def test_homepages(self):
        homepage = "http://gentoo.org http://mypackage.com"
        package = PackageFactory.build(homepage=homepage)
        self.assertEqual(package.homepages,
                         ["http://gentoo.org", "http://mypackage.com"])

    def test_for_maintainer(self):
        maintainers, packages = setup_maintainers()
        maintainer = maintainers[0]
        self.assertEqual(
            list(Package.objects.for_maintainer(maintainer)),
            packages[:1]
        )

    def test_for_herd(self):
        herds, packages = setup_herds()
        herd = herds[0]
        self.assertEqual(
            list(Package.objects.for_herd(herd)),
            packages[:1]
        )

    def test_for_category(self):
        categories, packages = setup_categories()
        category = categories[0]
        self.assertEqual(
            list(Package.objects.for_category(category)),
            packages[:1]
        )

    def test_for_overlay(self):
        overlays, packages = setup_overlays()
        overlay = overlays[0]

        package_ids = [p.pk for p in packages[overlay]]
        for package in Package.objects.for_overlay(overlay):
            self.assertTrue(package["id"] in package_ids)

    def test_maintainers(self):
        maintainers, packages = setup_maintainers()
        maintainer_ids = [m.pk for m in maintainers]
        for maintainer in Package.objects.maintainers():
            self.assertTrue(maintainer["maintainers__id"] in maintainer_ids)

    def test_herds(self):
        herds, packages = setup_herds()
        herd_names = [h.herd for h in herds]
        for herd in Package.objects.herds():
            self.assertTrue(herd["herds__herd"] in herd_names)

    def test_categories(self):
        categories, packages = setup_categories()
        cat_names = [c["category"] for c in Package.objects.categories()]
        for category in categories:
            self.assertTrue(category in cat_names)

    def test_overlays(self):
        overlays, packages = setup_overlays()
        overlay_names = Package.objects.overlays()
        for overlay in overlays:
            self.assertTrue(overlay in overlay_names)


class EuscanResultModelTests(TestCase):
    def test_lastest(self):
        result1 = EuscanResultFactory.create(
            datetime=datetime(2012, 04, 01, 12, 0, 0, 0, utc)
        )
        result2 = EuscanResultFactory.create(
            datetime=datetime(2012, 01, 01, 12, 0, 0, 0, utc)
        )
        self.assertEqual(result1, EuscanResult.objects.latest())
        self.assertNotEqual(result2, EuscanResult.objects.latest())
