# -*- coding: utf-8 -*- from unittest import skip from django.contrib.auth import get_user_model from django.core import mail as django_mail from django.utils.translation import gettext from dav_base.tests.generic import FormDataSet, FormsTestCase from ..forms import LoginForm, SetPasswordForm, CreateAndSendPasswordForm TEST_USERNAME = 'root@localhost' TEST_PASSWORD = 'me||ön 21ABll' TEST_EMAIL = TEST_USERNAME class LoginFormTestCase(FormsTestCase): form_class = LoginForm def setUp(self): # Need a test user self.test_username = TEST_USERNAME self.test_password = TEST_PASSWORD model = get_user_model() self.user = model.objects.create_user(username=TEST_USERNAME, password=TEST_PASSWORD, email=TEST_EMAIL) def test_labels(self): form = self.form_class() self.assertEqual(form.fields['username'].label, gettext('E-Mail-Adresse')) self.assertEqual(form.fields['password'].label, gettext('Password')) def test_required(self): form = self.form_class() self.assertTrue(form.fields['username'].required) self.assertTrue(form.fields['password'].required) def test_username_empty(self): data_sets = [ FormDataSet({'username': '', 'password': self.test_password}, expected_errors=[('username', 'required')]), ] super().test_invalid_data(data_sets=data_sets) def test_password_empty(self): data_sets = [ FormDataSet({'username': self.test_username, 'password': ''}, expected_errors=[('password', 'required')]), ] super().test_invalid_data(data_sets=data_sets) def test_invalid_username(self): data_sets = [ FormDataSet({'username': self.test_username[::-1], 'password': self.test_password}, expected_errors=[('__all__', 'invalid_login')]), ] super().test_invalid_data(data_sets=data_sets) def test_invalid_password(self): data_sets = [ FormDataSet({'username': self.test_username, 'password': self.test_password[::-1]}, expected_errors=[('__all__', 'invalid_login')]), ] super().test_invalid_data(data_sets=data_sets) def test_inactive_user(self): self.user.is_active = False self.user.save() data_sets = [ FormDataSet({'username': self.test_username, 'password': self.test_password}, expected_errors=[('__all__', 'invalid_login')]), ] super().test_invalid_data(data_sets=data_sets) def test_valid_credentials(self): data_sets = [ FormDataSet({'username': self.test_username, 'password': self.test_password}), ] super().test_valid_data(data_sets=data_sets) class SetPasswordFormTestCase(FormsTestCase): form_class = SetPasswordForm def setUp(self): # Need a test user self.test_username = TEST_USERNAME self.test_password = TEST_PASSWORD model = get_user_model() self.user = model.objects.create_user(username=TEST_USERNAME, password=TEST_PASSWORD, email=TEST_EMAIL) def test_required(self): form = self.form_class(user=self.user) self.assertTrue(form.fields['new_password'].required) self.assertTrue(form.fields['new_password_repeat'].required) self.assertFalse(form.fields['send_password_mail'].required) def test_mismatch(self): data_sets = [ FormDataSet({'new_password': 'mellonAB12+-', 'new_password_repeat': 'mellonAB13+-'}, [('new_password_repeat', 'password_mismatch')]), ] super().test_invalid_data(data_sets=data_sets, form_kwargs={'user': self.user}) def test_empty(self): data_sets = [ FormDataSet({'new_password': '', 'new_password_repeat': ''}, [('new_password', 'required')]), ] super().test_invalid_data(data_sets=data_sets, form_kwargs={'user': self.user}) def test_too_short(self): data_sets = [ FormDataSet({'new_password': 'mellon', 'new_password_repeat': 'mellon'}, [('new_password', 'password_too_short')]), ] super().test_invalid_data(data_sets=data_sets, form_kwargs={'user': self.user}) def test_entirely_numeric(self): data_sets = [ FormDataSet({'new_password': '1357924680', 'new_password_repeat': '1357924680'}, [('new_password', 'password_entirely_numeric')]), ] super().test_invalid_data(data_sets=data_sets, form_kwargs={'user': self.user}) def test_too_similar(self): data_sets = [ FormDataSet({'new_password': self.test_username, 'new_password_repeat': self.test_username}, [('new_password', 'password_too_similar')]), ] super().test_invalid_data(data_sets=data_sets, form_kwargs={'user': self.user}) def test_too_common(self): data_sets = [ FormDataSet({'new_password': 'password', 'new_password_repeat': 'password'}, [('new_password', 'password_too_common')]), ] super().test_invalid_data(data_sets=data_sets, form_kwargs={'user': self.user}) def test_valid(self): data_sets = [ FormDataSet({'new_password': 'mellonAB12+-', 'new_password_repeat': 'mellonAB12+-'}), FormDataSet({'new_password': 'mellonAB12+-', 'new_password_repeat': 'mellonAB12+-', 'send_password_mail': True}), FormDataSet({'new_password': '"ä§ MellonAB12+-', 'new_password_repeat': '"ä§ MellonAB12+-'}), FormDataSet({'new_password': 'mellon12' * 128, 'new_password_repeat': 'mellon12' * 128}), ] super().test_valid_data(data_sets=data_sets, form_kwargs={'user': self.user}) def test_save(self): new_passwords = [ '"ä§ Mellon12' 'mellon12' * 128, ] for new_password in new_passwords: data = {'new_password': new_password, 'new_password_repeat': new_password} form = SetPasswordForm(data=data, user=self.user) self.assertTrue(form.is_valid()) form.save() self.assertEqual(len(django_mail.outbox), 0) self.assertTrue(self.client.login(username=self.test_username, password=new_password)) @skip('Function is implemented in SetPasswordView instead of SetPasswordForm') def test_save_with_mail(self): # pragma: no cover new_passwords = [ '"ä§ Mellon12' 'mellon12' * 128, ] for new_password in new_passwords: data = {'new_password': new_password, 'new_password_repeat': new_password, 'send_password_mail': True} form = SetPasswordForm(data=data, user=self.user) self.assertTrue(form.is_valid()) form.save() self.assertEqual(len(django_mail.outbox), 1) mail = django_mail.outbox[0] recipient = '%s <%s>' % (self.user.get_full_name(), self.user.email) recipients = mail.recipients() self.assertIn(recipient, recipients) self.assertEqual(len(recipients), 1) self.assertIn(new_password, mail.body) self.assertTrue(self.client.login(username=self.test_username, password=new_password)) class CreateAndSendPasswordFormTestCase(FormsTestCase): form_class = CreateAndSendPasswordForm valid_data_sets = ( FormDataSet({'username': 'unittest@example.com'}), ) invalid_data_sets = ( FormDataSet({'username': ''}, expected_errors=[('username', 'required')]), ) def test_labels(self): form = self.form_class() self.assertEqual(form.fields['username'].label, gettext('E-Mail-Adresse')) def test_required(self): form = self.form_class() self.assertTrue(form.fields['username'].required)