from django.conf import settings
from django.core import mail
from django.contrib.auth import get_user_model
from django.test import TestCase
from django.urls import reverse


User = get_user_model()


class LoginViewTest(TestCase):
    def _create_user(self, username, email, password=None):
        return User.objects.create_user(
            username=username,
            email=email,
            password=password,
        )

    def test_show_page(self):
        r = self.client.get(reverse('accounts:login'))
        self.assertEqual(r.status_code, 200)

    def test_redirect_to_index_after_login(self):
        username = 'taro'
        email = 'taro@example.com'
        password = 'testpassword'
        self._create_user(
            username=username,
            email=email,
            password=password,
        )
        data = {
            'username': username,
            'password': password,
        }
        r = self.client.post(reverse('accounts:login'), data)
        self.assertRedirects(
            r,
            settings.LOGIN_REDIRECT_URL,
            fetch_redirect_response=False,
        )


class ProfileViewTest(TestCase):
    def _create_user(self, username, email, password=None):
        return User.objects.create_user(
            username=username,
            email=email,
            password=password,
        )

    def test_show_page(self):
        user = self._create_user(
            username='taro',
            email='taro@example.com',
            password='testpassword',
        )
        self.client.force_login(user)
        r = self.client.get(reverse('accounts:profile'))
        self.assertEqual(r.status_code, 200)


class PasswordResetViewTest(TestCase):
    def _create_user(self, username, email, password=None):
        return User.objects.create_user(
            username=username,
            email=email,
            password=password,
        )

    def test_show_page(self):
        r = self.client.get(reverse('accounts:password_reset'))
        self.assertEqual(r.status_code, 200)

    def test_send_reset_mail(self):
        email = 'taro@example.com'
        self._create_user(
            username='taro',
            email=email,
            password='testpassword',
        )

        data = {'email': email}
        r = self.client.post(reverse('accounts:password_reset'), data)
        self.assertRedirects(r, reverse('accounts:password_reset_done'))

        self.assertEqual(len(mail.outbox), 1)
        self.assertListEqual(mail.outbox[0].to, [email])