"""
Tests for :py:mod:`domains.models`.

"""
from __future__ import absolute_import, unicode_literals

from mock import Mock, MagicMock, patch

from django.test import TestCase
from django.contrib.auth import get_user_model

from domains.models import (
    DomainBase,
    MailDomain,
    HostingDomain,
)
from hostingpackages.models import (
    CustomerHostingPackage,
    HostingPackageTemplate,
)


User = get_user_model()

TEST_USER = 'test'


class DomainBaseTest(TestCase):

    def test__str__(self):
        db = DomainBase(domain='test')
        self.assertEqual(str(db), 'test')


class MailDomainTest(TestCase):

    def test__str__(self):
        md = MailDomain.objects.create(domain='example.org')
        self.assertEqual(str(md), 'example.org')

    def test_get_mailaddresses(self):
        md = MailDomain.objects.create(domain='example.org')
        from managemails.models import MailAddress
        addrmock = MailAddress(localpart='info')
        md.mailaddress_set.add(addrmock)
        self.assertIn(addrmock, md.get_mailaddresses())
        self.assertIn(addrmock, md.mailaddresses)


class HostingDomainManagerTest(TestCase):

    def _setup_hosting_package(self):
        template = HostingPackageTemplate.objects.create(
            name='testpackagetemplate', mailboxcount=0, diskspace=1,
            diskspace_unit=0)
        customer = User.objects.create_user(username=TEST_USER)
        package = CustomerHostingPackage.objects.create_from_template(
            customer, template, 'testpackage')
        with patch('hostingpackages.models.settings') as hmsettings:
            hmsettings.OSUSER_DEFAULT_GROUPS = []
            package.save()
        return package

    def test_create_for_hosting_package_with_commit(self):
        package = self._setup_hosting_package()
        hostingdomain = HostingDomain.objects.create_for_hosting_package(
            package, 'example.org', True)

        self.assertIsNotNone(hostingdomain)
        self.assertTrue(hostingdomain.customer, package.customer)

    def test_create_for_hosting_package_no_commit(self):
        package = self._setup_hosting_package()
        hostingdomain = HostingDomain.objects.create_for_hosting_package(
            package, 'example.org', False)

        self.assertIsNotNone(hostingdomain)
        self.assertTrue(hostingdomain.customer, package.customer)

class HostingDomainTest(TestCase):

    def test__str__(self):
        hostingdomain = HostingDomain(domain='test')
        self.assertEqual(str(hostingdomain), 'test')