def test_select__already_voted(self):
        from nuorisovaalit.models import Voter
        from nuorisovaalit.models import VotingLog
        from nuorisovaalit.views.voting import select
        from pyramid.url import route_url
        from webob.exc import HTTPFound

        session = DBSession()
        populate_testing_db()
        voter = session.query(Voter).first()
        self.config.testing_securitypolicy(userid=voter.openid)
        self.config.add_route('vote-finish', '/valmis')

        session = DBSession()
        session.add(VotingLog(voter.id))

        request = DummyRequest()
        response = select(request)
        self.assertTrue(isinstance(response, HTTPFound))
        self.assertEquals(route_url('vote-finish', request), response.location)
    def test_select__with_candidates(self):
        from itertools import cycle
        from nuorisovaalit.models import Voter
        from nuorisovaalit.views.voting import select

        session = DBSession()
        populate_testing_db()
        voter = session.query(Voter).first()

        self.config.testing_securitypolicy(userid=voter.openid)

        self.config.add_route('vote', '/aanesta/{number}')
        options = select(DummyRequest())

        for party in options['parties']:
            self.assertTrue(isinstance(party.pop('positions'), cycle))
            party['candidates'] = list(party['candidates'])

        self.assertEquals({
            'coalitions': [],
            'columns': 3,
            'district': u'Ahvenanmaan maakunnan vaalipiiri',
            'empty_vote_url': 'http://example.com/aanesta/0',
            'parties': [{
                'candidates': [[{'name': u'Turhapuro, Uuno',
                                 'number': 1,
                                 'url': 'http://example.com/aanesta/1'}]],
                'title': u'Köyhien asialla'
                }, {
                'candidates': [[{'name': u'Hartikainen, Härski',
                                 'number': 2,
                                 'url': 'http://example.com/aanesta/2'}]],
                'title': u'Piraattipuolue'
                }, {
                'candidates': [[{'name': u'Sörsselssön, Sami',
                                 'number': 3,
                                 'url': 'http://example.com/aanesta/3'}]],
                'title': u'Suomen työväenpuolue'}
            ]
        }, options)
    def test_select_party_grouping_with_coalitions(self):
        from datetime import datetime
        from itertools import cycle
        from nuorisovaalit.models import Candidate
        from nuorisovaalit.models import Coalition
        from nuorisovaalit.models import District
        from nuorisovaalit.models import Party
        from nuorisovaalit.models import School
        from nuorisovaalit.models import Voter
        from nuorisovaalit.views.voting import select

        session = DBSession()

        # Populate the db.
        district = District(u'Distrïct', 1)
        session.add(district)
        session.flush()
        school = School(u'Schööl', district)
        session.add(school)
        session.flush()
        voter = Voter(u'http://[email protected]', u'test', u'user', datetime(2011, 1, 1),
                      gsm=None, email=None, address=None, school_or_id=school)
        session.add(voter)
        session.flush()

        party1 = Party(u'Först party')
        party2 = Party(u'Secönd party')
        session.add(party1)
        session.add(party2)
        session.flush()

        coalition = Coalition(u'Red coalition', district)
        coalition.parties.append(party1)
        coalition.parties.append(party2)
        session.add(coalition)

        party1.candidates.append(Candidate(2, u'Mätti2', u'Meikäläinen', datetime(2011, 1, 1),
                                           u'', u'', party1, district))
        party1.candidates.append(Candidate(3, u'Mätti3', u'Meikäläinen', datetime(2011, 1, 1),
                                           u'', u'', party1, district))
        party1.candidates.append(Candidate(4, u'Mätti4', u'Meikäläinen', datetime(2011, 1, 1),
                                           u'', u'', party1, district))
        party1.candidates.append(Candidate(5, u'Mätti5', u'Meikäläinen', datetime(2011, 1, 1),
                                           u'', u'', party1, district))
        party2.candidates.append(Candidate(2, u'Mäijä2', u'Meikäläinen', datetime(2011, 1, 1),
                                           u'', u'', party2, district))
        session.flush()

        self.config.testing_securitypolicy(userid=voter.openid)
        self.config.add_route('vote', '/aanesta/{number}')
        options = select(DummyRequest())

        # Remove the cycle generators and serialize the candidate generators
        # for easiear comparison.
        for party in options['parties']:
            self.assertTrue(isinstance(party.pop('positions'), cycle))
            party['candidates'] = list(party['candidates'])

        self.assertEquals(options, {
            'empty_vote_url': 'http://example.com/aanesta/0',
            'district': u'Distrïct',
            'coalitions': [u'Först party, Secönd party'],
            'columns': 3,
            'parties': [
                {'candidates': [
                    [{'url': 'http://example.com/aanesta/2',
                      'number': 2,
                      'name': u'Meikäläinen, Mätti2'},
                     {'url': 'http://example.com/aanesta/3',
                      'number': 3,
                      'name': u'Meikäläinen, Mätti3'}],
                    [{'url': 'http://example.com/aanesta/4',
                      'number': 4,
                      'name': u'Meikäläinen, Mätti4'}],
                    [{'url': 'http://example.com/aanesta/5',
                      'number': 5,
                      'name': u'Meikäläinen, Mätti5'}]],
                 'title': u'Först party'},
                {'candidates': [
                    [{'url': 'http://example.com/aanesta/2',
                      'number': 2,
                      'name': u'Meikäläinen, Mäijä2'}]],
                 'title': u'Secönd party'}]})
    def test_select__unauthenticated(self):
        from nuorisovaalit.views.voting import select

        self.assertRaises(Forbidden, lambda: select(DummyRequest()))