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

from misago.conf import settings


UserModel = get_user_model()


class AvatarServerTests(TestCase):
    def setUp(self):
        self.user = UserModel.objects.create_user('Bob', 'bob@bob.com', 'Pass123')

        self.user.avatars = [
            {
                'size': 200,
                'url': '/media/avatars/avatar-200.png',
            },
            {
                'size': 100,
                'url': '/media/avatars/avatar-100.png',
            },
            {
                'size': 50,
                'url': '/media/avatars/avatar-50.png',
            },
        ]

        self.user.save()

    def test_get_user_avatar_exact_size(self):
        """avatar server resolved valid avatar url for user"""
        avatar_url = reverse(
            'misago:user-avatar',
            kwargs={
                'pk': self.user.pk,
                'size': 100,
            },
        )

        response = self.client.get(avatar_url)

        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['location'], self.user.avatars[1]['url'])

    def test_get_user_avatar_inexact_size(self):
        """avatar server resolved valid avatar fallback for user"""
        avatar_url = reverse(
            'misago:user-avatar',
            kwargs={
                'pk': self.user.pk,
                'size': 150,
            },
        )

        response = self.client.get(avatar_url)

        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['location'], self.user.avatars[0]['url'])

    def test_get_notfound_user_avatar(self):
        """avatar server handles deleted user avatar requests"""
        avatar_url = reverse(
            'misago:user-avatar',
            kwargs={
                'pk': self.user.pk + 1,
                'size': 150,
            },
        )
        response = self.client.get(avatar_url)

        self.assertEqual(response.status_code, 302)
        self.assertTrue(response['location'].endswith(settings.MISAGO_BLANK_AVATAR))

    def test_blank_avatar_serving(self):
        """avatar server handles blank avatar requests"""
        response = self.client.get(reverse('misago:blank-avatar'))

        self.assertEqual(response.status_code, 302)
        self.assertTrue(response['location'].endswith(settings.MISAGO_BLANK_AVATAR))