from hashlib import md5
from urllib.parse import urlencode

from django.test import TestCase
from mixer.backend.django import mixer

from contacts.core.models import Contact


class TestContactModel(TestCase):

    def setUp(self):
        self.contact = mixer.blend(Contact)

    def test_create(self):
        self.assertEqual(1, Contact.objects.count())

    def test_phone_is_optional(self):
        Contact.objects.create(name='Fulano', email='fulano@server.org')
        self.assertEqual(2, Contact.objects.count())

    def test_email_is_required(self):
        with  self.assertRaises(TypeError):
            Contact.objects.create(name='Fulano', phone='011 1406')
        self.assertEqual(1, Contact.objects.count())

    def test_avatar(self):
        email = self.contact.email.lower()
        hash = md5(email.encode()).hexdigest()
        params = urlencode({
            'd': f'https://api.adorable.io/avatars/256/{email}.png',
            's': 512
        })
        expected = f'https://www.gravatar.com/avatar/{hash}?{params}'
        self.assertEqual(expected, self.contact.avatar())