from django.test import TestCase
from idhub.models import Event, Membership, Rol, UserRol, Service
from idhub_auth.models import User


class EventModelTest(TestCase):
    @classmethod
    def setUpTestData(cls):
        user = User.objects.create(email='testuser@example.org')
        Event.objects.create(message='Test Event', type=1, user=user)

    def test_event_creation(self):
        event = Event.objects.get(id=1)
        self.assertEqual(event.message, 'Test Event')
        self.assertEqual(event.get_type_name(), 'User registered')


class UserTest(TestCase):
    """
    Tests the very basic aspects of the User model,
    like field properties and methods behaving as expected.
    Further testing is recommended.
    """

    def setUp(self):
        self.user = User.objects.create(
            email="test@example.com",
            is_admin=True,
            first_name="Dummy",
            last_name="Dummyson"
        )

    def test_field_properties(self):
        user = User.objects.get(email="test@example.com")
        self.assertEqual(user._meta.get_field('email').max_length, 255)
        self.assertTrue(user._meta.get_field('email').unique)
        self.assertTrue(user._meta.get_field('is_active').default)
        self.assertFalse(user._meta.get_field('is_admin').default)

    def test_string_representation(self):
        self.assertEqual(str(self.user), "test@example.com")

    def test_has_perm(self):
        self.assertTrue(self.user.has_perm(None))

    def test_has_module_perms(self):
        self.assertTrue(self.user.has_module_perms(None))

    def test_is_staff_property(self):
        self.assertTrue(self.user.is_staff)

    def test_get_memberships(self):
        Membership.objects.create(user=self.user,
                                  type=Membership.Types.BENEFICIARY)
        Membership.objects.create(user=self.user,
                                  type=Membership.Types.EMPLOYEE)

        # We test for the length because the order in which the string
        # is given in get_memberships is non-deterministic
        self.assertEqual(len(self.user.get_memberships()),
                         len("Beneficiary, Employee"))

    def test_get_roles(self):
        user = User.objects.get(email="test@example.com")
        service = Service.objects.create(domain="Test Service")
        role1 = Rol.objects.create(name="Role 1")
        role2 = Rol.objects.create(name="Role 2")
        service.rol.add(role1, role2)
        UserRol.objects.create(user=user, service=service)

        # We test for the length because the order in which the string
        # is given in get_roles is non-deterministic
        self.assertEqual(len(user.get_roles()), len("Role 1, Role 2"))