# vim:fileencoding=utf8:et:ts=4:sts=4:sw=4:ft=python from django.conf import settings from django.core import mail from django.core.urlresolvers import resolve from django.template import RequestContext from mockldap import MockLdap from passlib.hash import ldap_md5_crypt from okupy.accounts.forms import SignupForm from okupy.accounts.models import Queue from okupy.accounts.views import signup, activate from okupy.common.test_helpers import (OkupyTestCase, set_request, ldap_users, no_database) from okupy.tests import vars class SignupUnitTests(OkupyTestCase): @classmethod def setUpClass(cls): cls.mockldap = MockLdap(vars.DIRECTORY) def setUp(self): self.mockldap.start() self.ldapobject = self.mockldap[settings.AUTH_LDAP_SERVER_URI] def tearDown(self): self.mockldap.stop() def test_username_already_exists_in_ldap(self): _form = vars.SIGNUP_TESTUSER.copy() _form['username'] = 'alice' request = set_request(uri='/signup', post=_form, messages=True) response = signup(request) response.context = RequestContext(request) self.assertMessage(response, 'Username already exists', 40) def test_email_already_exists_in_ldap(self): _form = vars.SIGNUP_TESTUSER.copy() _form['email'] = 'alice@test.com' request = set_request(uri='/signup', post=_form, messages=True) response = signup(request) response.context = RequestContext(request) self.assertMessage(response, 'Email already exists', 40) def test_username_already_pending_activation(self): _form = vars.SIGNUP_TESTUSER.copy() _form['username'] = 'queueduser' vars.QUEUEDUSER.save() request = set_request(uri='/signup', post=_form, messages=True) response = signup(request) response.context = RequestContext(request) self.assertMessage(response, 'Account is already pending activation', 40) def test_email_already_pending_activation(self): _form = vars.SIGNUP_TESTUSER.copy() _form['email'] = 'queued_user@test.com' vars.QUEUEDUSER.save() request = set_request(uri='/signup', post=_form, messages=True) response = signup(request) response.context = RequestContext(request) self.assertMessage(response, 'Account is already pending activation', 40) def test_add_queued_account_to_ldap_prints_success_message(self): vars.QUEUEDUSER.save() activate_url = '/activate/%s/' % vars.QUEUEDUSER.encrypted_id request = set_request(uri=activate_url, messages=True) response = activate(request, vars.QUEUEDUSER.encrypted_id) response.context = RequestContext(request) self.assertMessage(response, 'Your account has been activated successfully', 25) def test_queued_account_gets_added_to_ldap(self): vars.QUEUEDUSER.save() activate_url = '/activate/%s/' % vars.QUEUEDUSER.encrypted_id request = set_request(activate_url, messages=True) activate(request, vars.QUEUEDUSER.encrypted_id) self.assertTrue(ldap_users(vars.QUEUEDUSER.username, directory=self.ldapobject.directory)) ldap_account = ldap_users(vars.QUEUEDUSER.username, directory=self.ldapobject.directory)[1] self.assertEqual(ldap_account['objectClass'], settings.AUTH_LDAP_USER_OBJECTCLASS) self.assertEqual(ldap_account['sn'][0], vars.QUEUEDUSER.last_name) self.assertEqual(ldap_account['cn'][0], '%s %s' % ( vars.QUEUEDUSER.first_name, vars.QUEUEDUSER.last_name)) self.assertTrue(ldap_md5_crypt.verify(vars.QUEUEDUSER.password, ldap_account['userPassword'][0])) self.assertEqual(ldap_account['givenName'][0], vars.QUEUEDUSER.first_name) self.assertEqual(ldap_account['mail'][0], vars.QUEUEDUSER.email) self.assertEqual(ldap_account['uid'][0], vars.QUEUEDUSER.username) self.assertEqual(ldap_account['uidNumber'][0], '1002') self.assertEqual(ldap_account['gidNumber'][0], '100') self.assertEqual(ldap_account['gecos'][0], '%s %s' % ( vars.QUEUEDUSER.first_name, vars.QUEUEDUSER.last_name)) self.assertEqual(ldap_account['homeDirectory'][0], '/home/%s' % vars.QUEUEDUSER.username) self.assertEqual(ldap_account['gentooACL'][0], 'user.group') def test_add_queued_account_remove_from_queue(self): vars.QUEUEDUSER.save() activate_url = '/activate/%s/' % vars.QUEUEDUSER.encrypted_id request = set_request(activate_url, messages=True) activate(request, vars.QUEUEDUSER.encrypted_id) self.assertEqual(Queue.objects.count(), 0) def test_valid_data_to_signup_form_prints_info_message(self): request = set_request(uri='/signup', post=vars.SIGNUP_TESTUSER, messages=True) response = signup(request) response.context = RequestContext(request) self.assertMessage(response, 'You will shortly receive an activation mail', 20) def test_valid_data_to_signup_form_sends_activation_mail(self): request = set_request(uri='/signup', post=vars.SIGNUP_TESTUSER, messages=True) response = signup(request) response.context = RequestContext(request) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, '%sAccount Activation' % settings.EMAIL_SUBJECT_PREFIX) def test_valid_data_to_signup_form_adds_user_to_queue(self): request = set_request(uri='/signup', post=vars.SIGNUP_TESTUSER, messages=True) response = signup(request) response.context = RequestContext(request) self.assertEqual(Queue.objects.count(), 1) vars.QUEUEDUSER = Queue.objects.get(pk=1) self.assertEqual(vars.QUEUEDUSER.username, vars.SIGNUP_TESTUSER['username']) self.assertEqual(vars.QUEUEDUSER.first_name, vars.SIGNUP_TESTUSER['first_name']) self.assertEqual(vars.QUEUEDUSER.last_name, vars.SIGNUP_TESTUSER['last_name']) self.assertEqual(vars.QUEUEDUSER.email, vars.SIGNUP_TESTUSER['email']) self.assertEqual(vars.QUEUEDUSER.password, vars.SIGNUP_TESTUSER['password_origin']) # note: this needs to be kept in line with used cipher self.assertRegexpMatches(vars.QUEUEDUSER.encrypted_id, '^[a-zA-Z0-9_-]{22}$') @no_database() def test_no_database_connection_raises_error_in_signup(self): request = set_request(uri='/signup', post=vars.SIGNUP_TESTUSER, messages=True) response = signup(request) response.context = RequestContext(request) self.assertMessage(response, "Can't contact the database", 40) @no_database() def test_no_database_connection_sends_notification_mail_in_signup(self): request = set_request(uri='/signup', post=vars.SIGNUP_TESTUSER, messages=True) response = signup(request) response.context = RequestContext(request) self.assertEqual(len(mail.outbox), 1) self.assertTrue(mail.outbox[0].subject.startswith('%sERROR:' % settings.EMAIL_SUBJECT_PREFIX)) @no_database() def test_no_database_connection_raises_error_in_activation(self): request = set_request('/activate/test', messages=True) response = activate(request, vars.QUEUEDUSER.encrypted_id) response.context = RequestContext(request) self.assertMessage(response, "Can't contact the database", 40) @no_database() def test_no_database_connection_sends_notificationmail_in_activation(self): request = set_request('/activate/test', messages=True) activate(request, vars.QUEUEDUSER.encrypted_id) self.assertEqual(len(mail.outbox), 1) self.assertTrue(mail.outbox[0].subject.startswith('%sERROR:' % settings.EMAIL_SUBJECT_PREFIX)) def test_add_first_user_in_empty_ldap_directory(self): vars.QUEUEDUSER.save() activate_url = '/activate/%s/' % vars.QUEUEDUSER.encrypted_id self.ldapobject.directory = ldap_users(clean=True) request = set_request(activate_url, messages=True) activate(request, vars.QUEUEDUSER.encrypted_id) self.assertTrue(ldap_users(vars.QUEUEDUSER.username, directory=self.ldapobject.directory)) self.assertEqual(ldap_users( vars.QUEUEDUSER.username, directory=self.ldapobject.directory)[1]['uidNumber'][0], '1') class SignupunitTestsNoLDAP(OkupyTestCase): def test_signup_url_resolves_to_signup_view(self): found = resolve('/signup/') self.assertEqual(found.func, signup) def test_signup_page_returns_200_for_anonymous(self): request = set_request(uri='/signup') response = signup(request) self.assertEqual(response.status_code, 200) def test_rendered_signup_form(self): request = set_request(uri='/signup') response = signup(request) signup_form_part = '' # noqa self.assertIn(signup_form_part, response.content) def test_empty_signup_form_raises_form_error_messages(self): request = set_request(uri='/signup') response = signup(request) response.context = RequestContext(request, {'signup_form': SignupForm(request.POST)}) self.assertFormError(response, 'signup_form', 'username', 'This field is required.') self.assertFormError(response, 'signup_form', 'first_name', 'This field is required.') self.assertFormError(response, 'signup_form', 'last_name', 'This field is required.') self.assertFormError(response, 'signup_form', 'email', 'This field is required.') self.assertFormError(response, 'signup_form', 'password_origin', 'This field is required.') self.assertFormError(response, 'signup_form', 'password_verify', 'This field is required.') def test_passwords_dont_match(self): _form = vars.SIGNUP_TESTUSER.copy() _form['password_verify'] = 'wrong' request = set_request(uri='/signup', post=_form) response = signup(request) response.context = RequestContext(request, {'signup_form': SignupForm(request.POST)}) self.assertFormError(response, 'signup_form', 'password_verify', "Passwords don't match") def test_wrong_activaltion_link_raises_invalid_url(self): request = set_request(uri='/activate/invalidurl', messages=True) response = activate(request, 'invalidurl') response.context = RequestContext(request) self.assertMessage(response, 'Invalid URL', 40) def test_no_ldap_connection_raises_error_in_signup(self): request = set_request(uri='/signup', post=vars.SIGNUP_TESTUSER, messages=True) response = signup(request) response.context = RequestContext(request) self.assertMessage(response, "Can't contact LDAP server", 40) def test_no_ldap_connection_sends_notification_mail_in_signup(self): request = set_request(uri='/signup', post=vars.SIGNUP_TESTUSER, messages=True) response = signup(request) response.context = RequestContext(request) self.assertEqual(len(mail.outbox), 1) self.assertEqual( mail.outbox[0].subject, '%sERROR: {\'desc\': "Can\'t contact LDAP server"}' % settings.EMAIL_SUBJECT_PREFIX) def test_no_ldap_connection_raises_error_in_activation(self): vars.QUEUEDUSER.save() activate_url = '/activate/%s/' % vars.QUEUEDUSER.encrypted_id request = set_request(activate_url, messages=True) response = activate(request, vars.QUEUEDUSER.encrypted_id) response.context = RequestContext(request) self.assertMessage(response, "Can't contact LDAP server", 40) def test_no_ldap_connection_sends_notification_mail_in_activation(self): vars.QUEUEDUSER.save() activate_url = '/activate/%s/' % vars.QUEUEDUSER.encrypted_id request = set_request(activate_url, messages=True) response = activate(request, vars.QUEUEDUSER.encrypted_id) response.context = RequestContext(request) self.assertEqual(len(mail.outbox), 1) self.assertEqual( mail.outbox[0].subject, '%sERROR: {\'desc\': "Can\'t contact LDAP server"}' % settings.EMAIL_SUBJECT_PREFIX)