def test_get_content_specific_content_type(self): from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem meeting = Meeting() meeting['ai1'] = AgendaItem() meeting['ai2'] = AgendaItem() meeting['b1'] = self._cut() res = meeting.get_content(content_type = 'AgendaItem') self.assertEqual(len(res), 2)
def test_change_states_proposals(self): from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem meeting = Meeting() ai = AgendaItem() meeting['a1'] = ai ai = AgendaItem() meeting['a2'] = ai self.assertEqual(meeting['a1'].get_field_value('order'), 0) self.assertEqual(meeting['a2'].get_field_value('order'), 1)
def test_get_content_states(self): """ To test content states we need to setup workflow and use real content types.""" from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem self.config.include('pyramid_zcml') self.config.load_zcml('voteit.core:configure.zcml') meeting = Meeting() meeting.title = 'Hello Meeting' ai1 = AgendaItem() ai1.title = 'Stuff to do' ai2 = AgendaItem() ai2.title = 'More important things' meeting['ai1'] = ai1 meeting['ai2'] = ai2 meeting['b1'] = self._cut() self.assertEqual( meeting.get_content(sort_on='title', states='private'), (ai2, ai1)) self.assertEqual( meeting.get_content(sort_on='title', states=('private', 'upcoming')), (ai2, ai1)) request = testing.DummyRequest() ai1.set_workflow_state(request, 'upcoming') self.assertEqual( meeting.get_content(sort_on='title', states='private'), (ai2, )) self.assertEqual( meeting.get_content(sort_on='title', states=('private', 'some_other')), (ai2, )) self.assertEqual( meeting.get_content(sort_on='title', states=( 'private', 'upcoming', )), (ai2, ai1))
def test_get_content_by_interface(self): from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.interfaces import IAgendaItem from voteit.core.models.interfaces import IBaseContent meeting = Meeting() meeting['ai1'] = AgendaItem() meeting['ai2'] = AgendaItem() meeting['b1'] = self._cut() res = meeting.get_content(iface = IAgendaItem) self.assertEqual(len(res), 2) #IAgendaItem subclasses IBaseContent res = meeting.get_content(iface = IBaseContent) self.assertEqual(len(res), 3)
def _setup_poll_fixture(config): # type: (Configurator) -> Poll config.testing_securitypolicy('admin', permissive=True) # config.include('pyramid_chameleon') # Register plugin config.include('voteit.stv') config.include('arche.testing') config.include('arche.testing.workflow') config.include('arche.testing.catalog') config.include('voteit.core.models.catalog') root = bootstrap_and_fixture(config) root['m'] = Meeting() unrestricted_wf_transition_to(root['m'], 'ongoing') root['m']['ai'] = ai = AgendaItem() unrestricted_wf_transition_to(ai, 'upcoming') unrestricted_wf_transition_to(ai, 'ongoing') #Setup poll ai['poll'] = Poll() poll = ai['poll'] #Add proposals p1 = Proposal(creators = ['dummy'], text = 'first proposal') p1.uid = 'p1uid' #To make it simpler to test against ai['p1'] = p1 p2 = Proposal(creators = ['dummy'], text = 'second proposal') p2.uid = 'p2uid' ai['p2'] = p2 p3 = Proposal(creators = ['dummy'], text = 'third proposal') p3.uid = 'p3uid' ai['p3'] = p3 #Select proposals for this poll poll.proposal_uids = (p1.uid, p2.uid, p3.uid) #Set poll as ongoing unrestricted_wf_transition_to(poll, 'upcoming') return poll
def test_add_form_add_poll(self): self.config.registry.settings[ 'default_timezone_name'] = "Europe/Stockholm" self.config.registry.settings['default_locale_name'] = 'sv' self.config.include('voteit.core.models.date_time_util') self.config.scan('voteit.core.models.poll') self.config.scan('voteit.core.schemas.poll') self.config.include('voteit.core.plugins.majority_poll') self.config.include('voteit.core.models.flash_messages') meeting = self._fixture() from voteit.core.models.agenda_item import AgendaItem meeting['ai'] = context = AgendaItem() request = testing.DummyRequest(params={'content_type': 'Poll'}, post=MultiDict([ ('add', 'add'), ('title', 'Dummy poll'), ('description', 'description'), ('poll_plugin', 'majority_poll'), ('__start__', 'proposals:sequence'), ('__end__', 'proposals:sequence'), ('reject_proposal_title', 'Reject all proposals'), ('start_time', '2012-05-15 12:00'), ('end_time', '2012-05-16 12:00') ])) obj = self._cut(context, request) response = obj.add_form() self.assertEqual( response.location.split('#')[0], 'http://example.com/m/ai/') #A redirect with an anchor
def _fixture(self): from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.meeting import Meeting root = bootstrap_and_fixture(self.config) root['m'] = meeting = Meeting() meeting['ai'] = ai = AgendaItem() return ai
def active_poll_fixture(config): """ This method sets up a site the way it will be when a poll is ready to start with admin as voter. You can use this if you want a fixture for your poll plugin tests """ from voteit.core.models.poll import Poll from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.proposal import Proposal root = bootstrap_and_fixture(config) request = testing.DummyRequest() config = testing.setUp(request = request, registry = config.registry) config.include('pyramid_mailer.testing') config.include('voteit.core.subscribers.poll') root['users']['admin'].set_field_value('email', '*****@*****.**') meeting = root['meeting'] = Meeting() meeting.add_groups('admin', [ROLE_VOTER]) meeting.set_workflow_state(request, 'ongoing') ai = meeting['ai'] = AgendaItem() ai['prop1'] = Proposal(text = u"Proposal 1") ai['prop2'] = Proposal(text = u"Proposal 2") ai.set_workflow_state(request, 'upcoming') ai.set_workflow_state(request, 'ongoing') ai['poll'] = Poll(title = 'A poll') poll = ai['poll'] poll.set_field_value('proposals', set([ai['prop1'].uid, ai['prop2'].uid])) poll.set_workflow_state(request, 'upcoming') return root
def test_other_context(self): from voteit.core.models.agenda_item import AgendaItem context = AgendaItem() self._reg_dummy_policy(context) request = testing.DummyRequest() obj = self._cut(context, request) self.assertRaises(colander.Invalid, obj, None, ['role:Admin'])
def test_order_agenda_items_save(self): self.config.scan('voteit.core.subscribers.agenda_item') self.config.include('voteit.core.models.flash_messages') self.config.testing_securitypolicy(userid='dummy', permissive=True) context = self._fixture() from voteit.core.models.agenda_item import AgendaItem context['a1'] = AgendaItem(title='Agenda Item 1') context['a2'] = AgendaItem(title='Agenda Item 2') context['a3'] = AgendaItem(title='Agenda Item 3') request = testing.DummyRequest(post=MultiDict((('save', 'save'), ('agenda_items', 'a1'), ('agenda_items', 'a2'), ('agenda_items', 'a3')))) obj = self._cut(context, request) response = obj.order_agenda_items() self.assertIn('title', response)
def _fixture(self): from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.meeting import Meeting root = bootstrap_and_fixture(self.config) root['users']['admin'].email = '*****@*****.**' root['m'] = meeting = Meeting() meeting['ai'] = ai = AgendaItem() return ai
def _agenda_item_with_proposals_fixture(self): """ Create an agenda item with a poll and two proposals. """ from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.proposal import Proposal agenda_item = AgendaItem() agenda_item['prop1'] = Proposal() agenda_item['prop2'] = Proposal() return agenda_item
def test_move_object(self): root = active_poll_fixture(self.config) from voteit.core.models.agenda_item import AgendaItem ai = root['meeting']['ai'] ai2 = root['meeting']['ai2'] = AgendaItem() self._fut(ai['prop1'], ai2) self.assertIn('prop1', root['meeting']['ai2']) self.assertNotIn('prop1', root['meeting']['ai'])
def _fixture(self): from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.user import User root = bootstrap_and_fixture(self.config) root.users['some_user'] = User() root['m'] = Meeting() root['m']['ai'] = AgendaItem() return root['m']['ai']
def _make_obj(self): from voteit.core.plugins.majority_poll import MajorityPollPlugin from voteit.core.models.poll import Poll from voteit.core.models.agenda_item import AgendaItem ai = AgendaItem() ai['poll'] = self.poll = Poll() return MajorityPollPlugin(ai['poll'])
def test_context_is_agenda_item(self): from voteit.core.models.agenda_item import AgendaItem context = AgendaItem() request = testing.DummyRequest() self.assertEqual( self._fut(None, { 'context': context, 'request': request }), u"")
def _make_obj(self): from voteit.core.plugins.majority_poll import MajorityPollPlugin from voteit.core.models.poll import Poll from voteit.core.models.agenda_item import AgendaItem self.config.include('arche.testing.catalog') self.root = bootstrap_and_fixture(self.config) self.root['ai'] = ai = AgendaItem() ai['poll'] = self.poll = Poll() return MajorityPollPlugin( ai['poll'] )
def test_delete_form(self): self.config.include('voteit.core.models.flash_messages') meeting = self._fixture() from voteit.core.models.agenda_item import AgendaItem meeting['ai'] = context = AgendaItem() request = testing.DummyRequest() obj = self._cut(context, request) response = obj.delete_form() self.assertIn('form', response)
def test_delete_form_cancel(self): self.config.include('voteit.core.models.flash_messages') meeting = self._fixture() from voteit.core.models.agenda_item import AgendaItem meeting['ai'] = context = AgendaItem() request = testing.DummyRequest(post={'cancel': 'cancel'}) obj = self._cut(context, request) response = obj.delete_form() self.assertEqual(response.location, 'http://example.com/m/ai/')
def test_edit_form_validation_error(self): self.config.scan('voteit.core.models.agenda_item') self.config.scan('voteit.core.schemas.agenda_item') meeting = self._fixture() from voteit.core.models.agenda_item import AgendaItem meeting['ai'] = context = AgendaItem() request = testing.DummyRequest(post={'update': 'update', 'title': ''}) obj = self._cut(context, request) response = obj.edit_form() self.assertIn('form', response)
def _fixture(self): self.config.include('pyramid_mailer.testing') from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.meeting import Meeting from voteit.core.models.proposal import Proposal root = bootstrap_and_fixture(self.config) root['users']['admin'].set_field_value('email', '*****@*****.**') root['m'] = meeting = Meeting() meeting['ai'] = ai = AgendaItem() return ai
def test_minutes(self): self.config.include('voteit.core.testing_helpers.register_catalog') self.config.scan('voteit.core.subscribers.agenda_item') self.config.include('voteit.core.models.flash_messages') self.config.testing_securitypolicy(userid='dummy', permissive=True) context = self._fixture() request = testing.DummyRequest() from voteit.core.models.agenda_item import AgendaItem context['a1'] = AgendaItem(title='Agenda Item 1') context['a1'].set_workflow_state(request, 'upcoming') context['a2'] = AgendaItem(title='Agenda Item 2') context['a2'].set_workflow_state(request, 'upcoming') context['a3'] = AgendaItem(title='Agenda Item 3') context['a3'].set_workflow_state(request, 'upcoming') obj = self._cut(context, request) response = obj.minutes() self.assertIn('agenda_items', response)
def test_get_type_count(self): meeting, request = self._fixture() from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.proposal import Proposal meeting['ai'] = ai = AgendaItem() obj = self._cut(ai, request) ai['p1'] = Proposal() self.assertEqual(obj.get_type_count('Proposal'), 1) ai['p2'] = Proposal() self.assertEqual(obj.get_type_count('Proposal'), 2)
def _make_obj(self): """ Poll object need to be in the context of an Agenda Item to work properly """ from voteit.core.models.proposal import Proposal from voteit.core.models.agenda_item import AgendaItem ai = AgendaItem() ai['poll'] = self._cut() proposal = Proposal() ai['poll'].set_field_value('proposals', set(proposal.uid)) return ai['poll']
def _fixture(self): """ DiscussionPosts check parents state and change their ACL depending on what state the meeting or agenda item is in. """ from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.discussion_post import DiscussionPost m = Meeting() m['ai'] = AgendaItem() m['ai']['d'] = DiscussionPost() return m
def test_get_read_type(self): meeting, request = self._fixture() from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.proposal import Proposal meeting['ai'] = ai = AgendaItem() obj = self._cut(ai, request) self.assertEqual(obj.get_read_type('Proposal', 'anders'), 0) ai['p1'] = Proposal() self.assertEqual(obj.get_read_type('Proposal', 'anders'), 0) obj.mark_read('p1', 'anders') self.assertEqual(obj.get_read_type('Proposal', 'anders'), 1)
def _context(self): register_catalog(self.config) self.config.testing_securitypolicy('admin', permissive=True) root = bootstrap_and_fixture(self.config) from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.discussion_post import DiscussionPost root['m'] = Meeting() ai = root['m']['ai'] = AgendaItem() ai['d1'] = dp = DiscussionPost() return dp
def _fixture_and_setup(self): root = bootstrap_and_fixture(self.config) from voteit.core.models.user import User from voteit.core.models.agenda_item import AgendaItem #from voteit.core.models.meeting import Meeting from voteit.core.models.proposal import Proposal for userid in ('fredrik', 'anders', 'hanna', 'robin'): root.users[userid] = User() root['ai'] = AgendaItem() security.unrestricted_wf_transition_to(root['ai'], 'upcoming') root['ai']['p'] = Proposal() return root['ai']['p']
def _fixture(self, num=10): root = bootstrap_voteit(echo=False) from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.discussion_post import DiscussionPost from voteit.core import security root['m'] = m = Meeting() m.local_roles.add('admin', [security.MODERATE_MEETING, security.VIEW]) m['ai'] = ai = AgendaItem() for i in range(num): ai['d%s' % i] = DiscussionPost() return root
def test_add_also_adds_to_proposal(self): from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.proposal import Proposal meeting = self._meeting() meeting['ai'] = ai = AgendaItem() obj = self._cut(meeting) ai['p1'] = prop = Proposal(creators=['BennyBoy']) obj.add(prop) self.assertIn('aid', prop.field_storage) self.assertIn('aid_int', prop.field_storage) self.assertEqual(prop.get_field_value('aid'), u"BennyBoy-1") self.assertEqual(prop.get_field_value('aid_int'), 1)
def test_get_content_states(self): """ To test content states we need to setup workflow and use real content types.""" from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem self.config.include('pyramid_zcml') self.config.load_zcml('voteit.core:configure.zcml') meeting = Meeting() meeting.title = 'Hello Meeting' ai1 = AgendaItem() ai1.title = 'Stuff to do' ai2 = AgendaItem() ai2.title = 'More important things' meeting['ai1'] = ai1 meeting['ai2'] = ai2 meeting['b1'] = self._cut() self.assertEqual(meeting.get_content(sort_on = 'title', states='private'), (ai2, ai1)) self.assertEqual(meeting.get_content(sort_on = 'title', states=('private', 'upcoming')), (ai2, ai1)) request = testing.DummyRequest() ai1.set_workflow_state(request, 'upcoming') self.assertEqual(meeting.get_content(sort_on = 'title', states='private'), (ai2,)) self.assertEqual(meeting.get_content(sort_on = 'title', states=('private', 'some_other')), (ai2,)) self.assertEqual(meeting.get_content(sort_on = 'title', states=('private', 'upcoming',)), (ai2, ai1))
def test_agenda_item_states(self): obj = AgendaItem() request = testing.DummyRequest() workflow = get_workflow(AgendaItem, AgendaItem.__name__, obj) obj.workflow.initialize(obj) self.assertEqual(obj.get_workflow_state(), u"private") obj.make_workflow_transition(request, "private_to_upcoming") self.assertEqual(obj.get_workflow_state(), u"upcoming") obj.make_workflow_transition(request, "upcoming_to_ongoing") self.assertEqual(obj.get_workflow_state(), u"ongoing") obj.workflow.initialize(obj) obj.make_workflow_transition(request, "private_to_upcoming") obj.make_workflow_transition(request, "upcoming_to_closed") self.assertEqual(obj.get_workflow_state(), u"closed") obj.workflow.initialize(obj) obj.make_workflow_transition(request, "private_to_upcoming") obj.make_workflow_transition(request, "upcoming_to_ongoing") obj.make_workflow_transition(request, "ongoing_to_upcoming") self.assertEqual(obj.get_workflow_state(), u"upcoming") obj.workflow.initialize(obj) obj.make_workflow_transition(request, "private_to_upcoming") obj.make_workflow_transition(request, "upcoming_to_ongoing") obj.make_workflow_transition(request, "ongoing_to_closed") self.assertEqual(obj.get_workflow_state(), u"closed") obj.workflow.initialize(obj) obj.make_workflow_transition(request, "private_to_upcoming") obj.make_workflow_transition(request, "upcoming_to_closed") obj.make_workflow_transition(request, "closed_to_ongoing") self.assertEqual(obj.get_workflow_state(), u"ongoing")