def test_send_confirmation_message(self, send_mail): from email.message import Message from nuorisovaalitadmin.models import PasswordReset from nuorisovaalitadmin.models import School from nuorisovaalitadmin.models import User self.config.add_settings(DUMMY_SETTINGS) session = DBSession() populate_testing_db() school = session.query(School).first() self.assertTrue(school is not None) user = User(u'john.doe', u'secret', u'Jöhn Döe', u'*****@*****.**', school_or_id=school) session.add(user) session.flush() userid = user.id view = self._makeView(post={'username': u'john.doe'}) response = view.send_confirmation_message() self.assertEquals(1, session.query(PasswordReset).filter_by(user_id=userid).count()) self.assertEquals(response.location, 'http://example.com') self.assertEquals(view.request.session.pop_flash(), [u'Ohjeet salasanan vaihtamiseen on lähetetty sähköpostissa.']) self.assertEquals(send_mail.call_args[0][0], u'*****@*****.**') self.assertEquals(send_mail.call_args[0][1], [u'*****@*****.**']) self.failUnless(isinstance(send_mail.call_args[0][2], Message))
def test_create_message(self): from nuorisovaalitadmin.models import PasswordReset from nuorisovaalitadmin.models import School from nuorisovaalitadmin.models import User session = DBSession() populate_testing_db() self.config.add_settings(DUMMY_SETTINGS) school = session.query(School).first() self.assertTrue(school is not None) user = User(u'john.doe', u'secret', u'Jöhn Döe', u'*****@*****.**', school_or_id=school) session.add(user) session.flush() reset = PasswordReset(user.id, datetime(2010, 11, 15, 17, 20), u'uniquetoken') view = self._makeView() message = view.create_message(user, reset) self.assertEquals(unicode(message['Subject']), u'john.doe') self.assertEquals(unicode(message['From']), u'*****@*****.**') self.assertEquals(unicode(message['To']), u'john.doe <*****@*****.**>') message_str = message.as_string() # Check that the relevant bits of information are included in the message self.failUnless('john.doe' in message_str) self.failUnless('15.11.2010 17:20' in message_str) self.failUnless('http://example.com/reset-password/uniquetoken' in message_str)
def test_login__form_submission__invalid_password(self): from nuorisovaalitadmin.models import School from nuorisovaalitadmin.models import User from nuorisovaalitadmin.views.login import login session = DBSession() populate_testing_db() school = session.query(School).first() self.assertTrue(school is not None) session.add(User(u'john.doe', u'secret', u'Jöhn Döe', u'*****@*****.**', school_or_id=school)) session.flush() self.assertEquals( session.query(User).filter_by(username=u'john.doe').first().email, u'*****@*****.**') request = testing.DummyRequest() token = request.session.new_csrf_token() request.POST = { 'form.submitted': u'1', 'username': u'john.doe', 'password': u'thisiswrong', 'csrf_token': token, } options = login(request) self.assertEquals(options, { 'title': u'Kirjaudu sisään', 'action_url': 'http://example.com/login', 'username': u'john.doe', 'reset_url': 'http://example.com/reset-password', 'csrf_token': token})
def test_password_change_form(self): from nuorisovaalitadmin.models import PasswordReset from nuorisovaalitadmin.models import School from nuorisovaalitadmin.models import User view = self._makeView() session = DBSession() populate_testing_db() school = session.query(School).first() self.assertTrue(school is not None) user = User(u'john.doe', u'secret', u'Jöhn Döe', u'*****@*****.**', school_or_id=school) session.add(user) session.flush() reset = PasswordReset(user.id, datetime.now() + timedelta(days=7), u'uniquetoken') session.add(reset) self.assertEquals(1, session.query(PasswordReset).filter_by(token=reset.token).count()) self.assertEquals(u'john.doe', session.query(User).get(user.id).username) view.request.matchdict['token'] = reset.token self.assertEquals(view.password_change_form(), { 'username': u'john.doe', 'action_url': 'http://example.com/reset-password/process', 'token': u'uniquetoken', 'title': u'Vaihda salasana'})
def test_login__form_submission__success_with_full_identity(self, remember): from nuorisovaalitadmin.models import School from nuorisovaalitadmin.models import User from nuorisovaalitadmin.views.login import login session = DBSession() populate_testing_db() school = session.query(School).first() self.assertTrue(school is not None) session.add(User(u'john.doe', u'secret', u'Jöhn Döe', u'*****@*****.**', school_or_id=school)) self.assertEquals( session.query(User).filter_by(username=u'john.doe').first().email, u'*****@*****.**') remember.return_value = [('X-Login', 'john.doe')] request = testing.DummyRequest() token = request.session.new_csrf_token() request.POST = { 'form.submitted': u'1', 'username': u'john.doe', 'password': u'secret', 'csrf_token': token, } response = login(request) self.assertEquals(dict(response.headers), { 'Content-Length': '0', 'Content-Type': 'text/html; charset=UTF-8', 'Location': 'http://example.com', 'X-Login': u'john.doe'}) self.assertEquals(request.session.pop_flash(), [u'Olet kirjautunut sisään.'])
def test_voter_submission_stats__submissions(self): from nuorisovaalit.models import School from nuorisovaalitadmin.models import CSVSubmission from nuorisovaalitadmin.models import User from nuorisovaalitadmin.views.allianssi import voter_submission_stats session = DBSession() populate_testing_db() eschools = session.query(School)\ .join(User)\ .filter(User.eparticipation == True)\ .all() self.assertTrue(len(eschools) > 0) school = eschools[0] # Check that there is no submission to begin with. self.assertEquals(0, session.query(CSVSubmission).count()) # Add a submission for the school. session.add(CSVSubmission({}, school, CSVSubmission.VOTER)) session.flush() school_count = len(eschools) school_names_not_submitted = [s.name for s in eschools if s.name != school.name] options = voter_submission_stats(DummyRequest()) options_not_submitted = [s.name for s in options['schools_not_submitted']] self.assertEquals(school_count - 1, len(options_not_submitted)) self.assertEquals(school_names_not_submitted, options_not_submitted)
def test_results_total_xls__no_votes(self): from nuorisovaalit.models import District from nuorisovaalit.models import Vote from nuorisovaalitadmin.views.allianssi import results_total_xls session = DBSession() populate_testing_db() # Add a district with code 0. self.assertEquals(0, session.query(District).filter_by(code=0).count()) session.add(District(u'Tyhjä piiri åäö', 0)) session.flush() self.assertEquals(0, session.query(Vote).count()) response = results_total_xls(DummyRequest()) self.assertTrue(isinstance(response, Response)) self.assertEquals('application/vnd.ms-excel', response.headers['content-type']) self.assertEquals('attachment; filename=nuorisovaalit2011-valtakunnalliset-tulokset.xls', response.headers['content-disposition']) wb = xlrd.open_workbook(file_contents=response.body) district_names = [n[0] for n in session.query(District.name)] self.assertTrue(len(district_names) > 1) district_names.remove(u'Tyhjä piiri åäö') # Cut long names. district_names = sorted(d[:31] for d in district_names) # Assert that there is a sheet in the Xls file for every # district except the one with code 0. sheet_names = sorted(wb.sheet_by_index(i).name for i in xrange(len(district_names))) self.assertEquals(district_names, sheet_names)
def test_results_index__with_votes(self): from nuorisovaalit.models import Candidate from nuorisovaalit.models import School from nuorisovaalit.models import Vote from nuorisovaalitadmin.views.allianssi import results_index self.config.add_route('results_total_xls', '/results-total.xls') session = DBSession() populate_testing_db() candidate = session.query(Candidate).first() school = session.query(School)\ .filter_by(district_id=candidate.district_id)\ .first() self.assertTrue(candidate is not None) self.assertTrue(school is not None) self.assertEquals(0, session.query(Vote).count()) session.add(Vote(candidate, school, Vote.PAPER, 15)) session.add(Vote(candidate, school, Vote.ELECTRONIC)) session.add(Vote(candidate, school, Vote.ELECTRONIC)) options = results_index(DummyRequest()) options.pop('voted') options.pop('not_voted') self.assertEquals({ 'title': u'Tulokset', 'vote_count_total': 17, 'vote_count_electronic': 2, 'results_total_xls': 'http://example.com/results-total.xls', }, options)
def test_index__authenticated(self): from nuorisovaalitadmin.views.login import index from nuorisovaalitadmin.models import User session = DBSession() populate_testing_db() user = session.query(User).first() self.config.testing_securitypolicy(userid=user.username) self.assertEquals({}, index(DummyRequest()))
def test_results_index__no_votes(self): from nuorisovaalit.models import Vote from nuorisovaalitadmin.views.allianssi import results_index self.config.add_route('results_total_xls', '/results-total.xls') session = DBSession() populate_testing_db() self.assertEquals(0, session.query(Vote).count()) self.assertEquals({ 'title': u'Tulokset', 'vote_count_total': 0, 'vote_count_electronic': 0, 'voted': '0.00', 'not_voted': '100.00', 'results_total_xls': 'http://example.com/results-total.xls', }, results_index(DummyRequest()))
def test_voter_submission_stats__no_submissions(self): from nuorisovaalit.models import School from nuorisovaalitadmin.models import User from nuorisovaalitadmin.views.allianssi import voter_submission_stats session = DBSession() populate_testing_db() school_names = session.query(School.name)\ .join(User)\ .filter(User.eparticipation == True)\ .order_by(School.name)\ .all() self.assertTrue(len(school_names) > 0) options = voter_submission_stats(DummyRequest()) # Check that all schools have not submitted by default. self.assertEquals(school_names, [(s.name,) for s in options['schools_not_submitted']])
def test_change_password(self, remember): from nuorisovaalitadmin.models import PasswordReset from nuorisovaalitadmin.models import School from nuorisovaalitadmin.models import User session = DBSession() populate_testing_db() school = session.query(School).first() self.assertTrue(school is not None) remember.return_value = [('X-Login', 'john.doe')] user = User(u'john.doe', u'secret', u'Jöhn Döe', u'*****@*****.**', school_or_id=school) session.add(user) session.flush() reset = PasswordReset(user.id, datetime.now() + timedelta(days=7), u'uniquetoken') session.add(reset) session.flush() self.assertEquals(1, session.query(PasswordReset)\ .filter(PasswordReset.user_id == user.id)\ .filter(PasswordReset.token == u'uniquetoken')\ .filter(PasswordReset.expires >= datetime.now())\ .count()) view = self._makeView(post={ 'token': 'uniquetoken', 'password': '******', 'confirm_password': '******'}) response = view.change_password() self.assertEquals(dict(response.headers), { 'Content-Length': '0', 'X-Login': '******', 'Content-Type': 'text/html; charset=UTF-8', 'Location': 'http://example.com'}) # Check that the password was changed self.failUnless(session.query(User).filter_by(id=user.id).first().check_password('abc123')) # Check that the reset request was deleted self.assertEquals(0, session.query(PasswordReset).count())
def test_voter_submission_stats__submission_with_wrong_kind(self): from nuorisovaalit.models import School from nuorisovaalitadmin.models import CSVSubmission from nuorisovaalitadmin.models import User from nuorisovaalitadmin.views.allianssi import voter_submission_stats session = DBSession() populate_testing_db() eschools = session.query(School)\ .join(User)\ .filter(User.eparticipation == True)\ .all() self.assertTrue(len(eschools) > 0) school = eschools[0] # Add a submission for the school. session.add(CSVSubmission({}, school, CSVSubmission.RESULT)) session.flush() options = voter_submission_stats(DummyRequest()) self.assertEquals(len(eschools), len(list(options['schools_not_submitted'])))
def test_result_submission_stats__with_submission(self): from nuorisovaalit.models import School from nuorisovaalitadmin.models import CSVSubmission from nuorisovaalitadmin.views.allianssi import result_submission_stats session = DBSession() populate_testing_db() school_count = session.query(School).count() school = session.query(School).first() self.assertTrue(school is not None) session.add(CSVSubmission({}, school, CSVSubmission.RESULT)) session.flush() options = result_submission_stats(DummyRequest()) self.assertEquals(u'Tuloslista-info', options['title']) self.assertEquals(school_count, options['school_count']) self.assertEquals(1, options['school_count_submitted']) self.assertEquals(school_count - 1, options['school_count_not_submitted']) self.assertEquals('{0:.2f}'.format(100 * 1 / float(school_count)), options['submitted']) self.assertEquals('{0:.2f}'.format(100 * (school_count - 1) / float(school_count)), options['not_submitted'])