from django.core.exceptions import ValidationError
from django.core.management import call_command
from django.test import TestCase
from misago.models import User
from misago.monitor import monitor, refresh_monitor, UpdatingMonitor

class UserManagerCreateUserTestCase(TestCase):
    def setUp(self):
        call_command('startmisago', quiet=True)

    def test_create_user(self):
        """Test User.objects.create_user"""
        with UpdatingMonitor() as cm:
            user_a = User.objects.create_user('Lemmiwinks', 'lemm@sp.com', '123pass')
            try:
                user_from_db = User.objects.get(username=user_a.username)
                user_from_db = User.objects.get(email=user_a.email)
            except User.DoesNotExist:
                raise AssertionError("User A was not saved in database!")

        refresh_monitor()
        self.assertEqual(int(monitor['users']), 1)
        self.assertEqual(int(monitor['users_inactive']), 0)
        self.assertEqual(int(monitor['last_user']), user_a.pk)
        self.assertEqual(monitor['last_user_name'], user_a.username)
        self.assertEqual(monitor['last_user_slug'], user_a.username_slug)

        with UpdatingMonitor() as cm:
            user_b = User.objects.create_user('InactiveTest', 'lemsm@sp.com', '123pass', activation=User.ACTIVATION_USER)
            try:
                user_from_db = User.objects.get(username=user_b.username)
                user_from_db = User.objects.get(email=user_b.email)
                self.assertEqual(user_from_db.activation, User.ACTIVATION_USER)
            except User.DoesNotExist:
                raise AssertionError("User B was not saved in database!")

        refresh_monitor()
        self.assertEqual(int(monitor['users']), 1)
        self.assertEqual(int(monitor['users_inactive']), 1)
        self.assertEqual(int(monitor['last_user']), user_a.pk)
        self.assertEqual(monitor['last_user_name'], user_a.username)
        self.assertEqual(monitor['last_user_slug'], user_a.username_slug)

        with UpdatingMonitor() as cm:
            try:
                user_c = User.objects.create_user('UsedMail', 'lemsm@sp.com', '123pass')
                raise AssertionError("Created user account with taken e-mail address!")
            except ValidationError:
                pass

        refresh_monitor()
        self.assertEqual(int(monitor['users']), 1)
        self.assertEqual(int(monitor['users_inactive']), 1)
        self.assertEqual(int(monitor['last_user']), user_a.pk)
        self.assertEqual(monitor['last_user_name'], user_a.username)
        self.assertEqual(monitor['last_user_slug'], user_a.username_slug)

        with UpdatingMonitor() as cm:
            try:
                user_d = User.objects.create_user('InactiveTest', 'user@name.com', '123pass')
                raise AssertionError("Created user account with taken username!")
            except ValidationError:
                pass

        refresh_monitor()
        self.assertEqual(int(monitor['users']), 1)
        self.assertEqual(int(monitor['users_inactive']), 1)
        self.assertEqual(int(monitor['last_user']), user_a.pk)
        self.assertEqual(monitor['last_user_name'], user_a.username)
        self.assertEqual(monitor['last_user_slug'], user_a.username_slug)