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

from misago.users import credentialchange


UserModel = get_user_model()


class MockRequest(object):
    def __init__(self, user):
        self.session = {}
        self.user = user


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

    def test_valid_token_generation(self):
        """credentialchange module allows for store and read of change token"""
        request = MockRequest(self.user)
        token = credentialchange.store_new_credential(request, 'email', 'newbob@test.com')

        email = credentialchange.read_new_credential(request, 'email', token)
        self.assertEqual(email, 'newbob@test.com')

    def test_email_change_invalidated_token(self):
        """token is invalidated by email change"""
        request = MockRequest(self.user)
        token = credentialchange.store_new_credential(request, 'email', 'newbob@test.com')

        self.user.set_email('egebege@test.com')
        self.user.save()

        email = credentialchange.read_new_credential(request, 'email', token)
        self.assertIsNone(email)

    def test_password_change_invalidated_token(self):
        """token is invalidated by password change"""
        request = MockRequest(self.user)
        token = credentialchange.store_new_credential(request, 'email', 'newbob@test.com')

        self.user.set_password('Egebeg!123')
        self.user.save()

        email = credentialchange.read_new_credential(request, 'email', token)
        self.assertIsNone(email)

    def test_invalid_token_is_handled(self):
        """there are no explosions in invalid tokens handling"""
        request = MockRequest(self.user)
        token = credentialchange.store_new_credential(request, 'email', 'newbob@test.com')

        email = credentialchange.read_new_credential(request, 'em4il', token)
        self.assertIsNone(email)