コード例 #1
0
 def test_add_business_case_dossier(self, browser):
     self.login(self.regular_user, browser)
     browser.open(self.leaf_repofolder)
     factoriesmenu.add('Business Case Dossier')
     browser.fill({'Title': u'\xc4s Dossier'}).save()
     statusmessages.assert_no_error_messages()
     statusmessages.assert_message('Item created')
コード例 #2
0
    def test_destruction_confirmation_on_import(self, browser):
        self.use_spec('foo')
        specdetails.visit('Destructive Workflow (destructive-workflow)')
        specdetails.button_write_and_import().click()
        statusmessages.assert_message(
            'Workflow destructive-workflow successfully imported.')
        self.assert_current_states('Foo')

        self.use_spec('bar')
        specdetails.visit('Destructive Workflow (destructive-workflow)')
        specdetails.button_write_and_import().click()

        # not yet updated
        self.assert_current_states('Foo')

        # confirmation dialog displayed
        self.assertEquals(
            'Importing this workflow renames or removes states.'
            ' Changing states can reset the workflow status of affected'
            ' objects to the initial state.',
            browser.css('.confirmation-message').first.text,
        )

        # No changes on cancel
        browser.find('I am on production').click()
        self.assert_current_states('Foo')

        specdetails.button_write_and_import().click()
        browser.find('I know what I am doing').click()
        statusmessages.assert_message(
            'Workflow destructive-workflow successfully imported.')
        self.assert_current_states('Foo', 'Bar')
コード例 #3
0
    def test_inviting_a_user_by_userid(self, browser):
        self.portal.portal_properties.email_from_name = 'M\xc3\xa4i Site'
        user = create(Builder('user').named('H\xc3\xbcgo', 'Boss'))
        self.assertEquals([], self.get_invitations(user=user))

        browser.login().visit(self.folder, view='invite_participants')
        browser.fill({'Users': [user.getId()],
                      'Roles': ['Contributor'],
                      'Comment': u'Hi th\xf6re'})
        browser.find('Invite').click()
        statusmessages.assert_no_error_messages()
        statusmessages.assert_message(
            'The invitation mails were sent to [email protected].')

        self.assertEquals(1, len(self.get_invitations(email='*****@*****.**')),
                          'Expected one invitation to be available for [email protected]')
        invitation, = self.get_invitations(email='*****@*****.**')
        self.assertEquals(['Contributor'], invitation.roles)
        mail = Mailing(self.portal).pop()
        self.assertIn('From: =?utf-8?q?M=C3=A4i_Site?= <test@localhost>', mail)
        self.assertIn('To: [email protected]', mail)
        self.assertIn('Content-Type: text/plain; charset="utf-8"', mail)
        self.assertIn('Content-Type: text/html; charset="utf-8"', mail)
        self.assertIn('=?utf-8?q?Invitation_for_paticipating_in_F=C3=B6lder?=',
                      mail)
        self.assertIn('Hi th=C3=B6re', mail)
コード例 #4
0
 def step_4b(self, browser):
     """The system displays warnings, (Back to the step 3)."""
     heading = browser.css('.documentFirstHeading').first
     self.assertEqual(u'Importer des données depuis eComptes', heading.text)
     statusmessages.assert_message(
         u"Le document importé n'est pas reconnu comme une exportation eComptes valide."
     )
コード例 #5
0
    def test_delete_only_items_without_backrefs(self, browser):
        dossietemplate_without_backref = create(Builder('dossiertemplate').within(self.templatefolder))
        dossiertemplate_with_backref = create(Builder('dossiertemplate').within(self.templatefolder))

        repo_root = create(Builder('repository_root'))
        leaf_node = create(Builder('repository')
                           .having(addable_dossier_templates=[dossiertemplate_with_backref])
                           .within(repo_root))

        browser.login().visit(self.templatefolder,
                              view="folder_delete_confirmation",
                              data={'paths:list': [self.get_path(dossietemplate_without_backref),
                                                   self.get_path(dossiertemplate_with_backref)]})

        self.assertEqual([dossietemplate_without_backref.pretty_title_or_id()],
                         browser.css('#items-to-delete li').text)

        self.assertEqual([leaf_node.pretty_title_or_id()],
                         browser.css('#items-with-backlinks li').text)

        browser.css('form#folder_delete_confirmation').first.submit()

        statusmessages.assert_message('Items successfully deleted.')
        self.assertEqual([dossiertemplate_with_backref], self.templatefolder.listFolderContents())
        self.assertEqual(self.templatefolder.absolute_url(),
                         browser.url)
コード例 #6
0
    def test_warning_visible_when_quota_exceeded(self, browser):
        user_folder = create_members_folder(create(Builder('private_root')))
        settings = getUtility(IRegistry).forInterface(
            IPrivateFolderQuotaSettings)
        create(Builder('document').attach_file_containing('X' * 100)
               .within(user_folder))

        browser.login().open(user_folder)
        statusmessages.assert_no_messages()

        settings.size_soft_limit = 70
        transaction.commit()
        browser.reload()
        statusmessages.assert_message(
            u'The quota of your private folder will exceed soon.')

        settings.size_hard_limit = 80
        transaction.commit()
        browser.reload()
        statusmessages.assert_message(
            u'The quota of your private folder has exceeded,'
            ' you can not add any new files or mails.')

        settings.size_soft_limit = 0
        settings.size_hard_limit = 0
        transaction.commit()
        browser.reload()
        statusmessages.assert_no_messages()
コード例 #7
0
    def test_delete_only_items_without_backrefs(self, browser):
        self.login(self.administrator, browser=browser)

        dossiertemplate_with_backref = create(Builder('dossiertemplate')
                                              .within(self.templates))

        leaf_node = create(Builder('repository')
                           .having(addable_dossier_templates=[dossiertemplate_with_backref])
                           .within(self.repository_root))

        browser.visit(self.templates,
                      view="folder_delete_confirmation",
                      data=self.make_path_param(self.dossiertemplate,
                                                dossiertemplate_with_backref))

        self.assertEqual([self.dossiertemplate.pretty_title_or_id()],
                         browser.css('#items-to-delete li').text)

        self.assertEqual([leaf_node.pretty_title_or_id()],
                         browser.css('#items-with-backlinks li').text)

        browser.css('form#folder_delete_confirmation').first.submit()

        statusmessages.assert_message('Items successfully deleted.')
        self.assertIn(dossiertemplate_with_backref, self.templates.objectValues())
        with self.assertRaises(KeyError):
            self.dossiertemplate

        self.assertEqual(self.templates.absolute_url(), browser.url)
コード例 #8
0
    def test_restore_trashed_content(self, browser):
        self.grant('Site Administrator')

        folder = create(Builder('folder').titled(u'My Folder'))
        with freeze(datetime(2011, 1, 1)):
            Trasher(folder).trash()

        self.assert_provides(folder, IRestorable, ITrashed)

        transaction.commit()
        browser.login().open().click_on('Trash')

        self.assertEquals([{
            'Last modified': 'Jan 01, 2011 12:00 AM',
            'Type': self.type_label,
            'Title': 'My Folder http://nohost/plone/my-folder',
            '': ''
        }],
                          browser.css('.trash-table').first.dicts())

        browser.css('.trash-table').find('Restore').first.click()
        statusmessages.assert_message(
            'The content "My Folder" has been restored.')
        self.assertEqual(folder.absolute_url(), browser.url)

        transaction.begin()
        self.assert_provides(folder, None)
コード例 #9
0
    def test_proposal_can_be_edited_in_browser(self, browser):
        self.login(self.dossier_responsible, browser)
        browser.visit(self.draft_proposal)
        editbar.contentview('Edit').click()
        self.assertEqual(u'Antrag f\xfcr Kreiselbau',
                         browser.find('Title').value)

        browser.fill({
            'Title': u'Another pr\xf6posal',
            'Attachments': [self.document]
        }).save()
        statusmessages.assert_no_error_messages()
        statusmessages.assert_message('Changes saved')

        proposal = browser.context
        browser.open(proposal, view='tabbedview_view-overview')
        self.assertEquals(
            [['Title', u'Another pr\xf6posal'],
             ['Committee', u'Kommission f\xfcr Verkehr'], ['Meeting', ''],
             ['Proposal document', u'Antrag f\xfcr Kreiselbau'],
             ['State', 'Pending'], ['Decision number', ''],
             ['Attachments', u'Vertr\xe4gsentwurf']],
            browser.css('table.listing').first.lists())

        self.assertEqual(1, len(proposal.relatedItems))
        self.assertEqual(self.document, proposal.relatedItems[0].to_object)
        self.assertEqual(u'Another pr\xf6posal', proposal.title)

        model = proposal.load_model()
        self.assertIsNotNone(model)
        self.assertEqual(Oguid.for_object(proposal), model.oguid)
        self.assertEqual(u'Another pr\xf6posal', proposal.title)
コード例 #10
0
    def test_proposal_can_be_created_in_browser_and_strips_whitespace(
            self, browser):
        self.login(self.dossier_responsible, browser)
        browser.open(self.dossier)
        factoriesmenu.add('Proposal')
        browser.fill({
            'Title': u'A pr\xf6posal',
            'Committee': u'Rechnungspr\xfcfungskommission',
            'Proposal template': u'Geb\xfchren',
            'Attachments': [self.document],
        }).save()
        statusmessages.assert_no_error_messages()
        statusmessages.assert_message('Item created')

        proposal = browser.context
        self.assertEqual(1, len(proposal.relatedItems))
        self.assertEqual(self.document, proposal.relatedItems[0].to_object)
        self.assertEqual(u'A pr\xf6posal', proposal.title)

        model = proposal.load_model()
        self.assertIsNotNone(model)
        self.assertEqual(u'A pr\xf6posal', model.title)
        self.assertIsNone(model.submitted_title)
        self.assertEqual(Oguid.for_object(proposal), model.oguid)
        self.assertEqual('robert.ziegler', model.creator)
        self.assertEqual(u'Vertr\xe4ge und Vereinbarungen',
                         model.repository_folder_title)
        self.assertEqual(u'en', model.language)

        self.assertTrue(
            set(['a', 'proposal'
                 ]).issubset(set(index_data_for(proposal)['SearchableText'])))
        self.assertEqual(u'Client1 1.1 / 1', model.dossier_reference_number)
コード例 #11
0
    def test_word_protocols_with_suffix_template_in_committee_can_be_created_and_updated(self, browser):
        self.login(self.committee_responsible, browser)
        self.committee.protocol_suffix_template = self.committee.protocol_header_template
        self.schedule_paragraph(self.meeting, u'A-Gesch\xe4fte')
        self.schedule_proposal(self.meeting, self.submitted_word_proposal)
        meeting = self.meeting.model

        self.assertIsNone(meeting.protocol_document)

        browser.open(meeting.get_url())
        # generate first protocol
        browser.css('.meeting-document.protocol-doc .action.generate').first.click()

        statusmessages.assert_message(
            u'Protocol for meeting 9. Sitzung der '
            u'Rechnungspr\xfcfungskommission has been generated '
            u'successfully.')
        self.assertIsNotNone(meeting.protocol_document)
        self.assertEqual(0, meeting.protocol_document.generated_version)

        # update already generated protocol
        browser.css('.meeting-document.protocol-doc .action.generate').first.click()

        statusmessages.assert_message(
            u'Protocol for meeting 9. Sitzung der '
            u'Rechnungspr\xfcfungskommission has been updated successfully.')
        self.assertIsNotNone(meeting.protocol_document)
        self.assertEqual(1, meeting.protocol_document.generated_version)
コード例 #12
0
    def test_delete_only_items_without_backrefs(self, browser):
        self.login(self.administrator, browser=browser)

        dossiertemplate_with_backref = create(
            Builder('dossiertemplate').within(self.templates))

        leaf_node = create(
            Builder('repository').having(
                addable_dossier_templates=[dossiertemplate_with_backref
                                           ]).within(self.repository_root))

        browser.visit(self.templates,
                      view="folder_delete_confirmation",
                      data=self.make_path_param(self.dossiertemplate,
                                                dossiertemplate_with_backref))

        self.assertEqual([self.dossiertemplate.pretty_title_or_id()],
                         browser.css('#items-to-delete li').text)

        self.assertEqual([leaf_node.pretty_title_or_id()],
                         browser.css('#items-with-backlinks li').text)

        browser.css('form#folder_delete_confirmation').first.submit()

        statusmessages.assert_message('Items successfully deleted.')
        self.assertIn(dossiertemplate_with_backref,
                      self.templates.objectValues())
        with self.assertRaises(KeyError):
            self.dossiertemplate

        self.assertEqual(self.templates.absolute_url(), browser.url)
コード例 #13
0
    def test_manual_excerpt_can_be_generated(self, browser):
        self.login(self.committee_responsible, browser)
        self.schedule_proposal(self.meeting, self.submitted_word_proposal)
        browser.open(self.meeting.model.get_url())

        browser.css('.generate-manual-excerpt').first.click()
        browser.fill({
            'agenda_item-2.include:record': True,
            'Target dossier': self.dossier
        })
        browser.find('Save').click()

        statusmessages.assert_message(
            u'Excerpt for meeting 9. Sitzung der '
            u'Rechnungspr\xfcfungskommission has been generated successfully')

        self.assertEqual(1, len(self.meeting.model.excerpt_documents))
        document = self.meeting.model.excerpt_documents[0]
        self.assertEqual(0, document.generated_version)

        self.assertEqual(self.meeting.model.get_url(), browser.url,
                         'should be on meeting view')
        self.assertEqual(1, len(browser.css('.excerpts li a.document_link')),
                         'generated document should be linked')
        self.assertEqual([
            u'Protocol Excerpt-9. Sitzung der Rechnungspr\xfcfungskommission'
        ],
                         browser.css('.excerpts li a.document_link').text)
コード例 #14
0
    def test_slider_pane_cannot_have_link_and_external_url(self, browser):
        """
        This test makes sure that the slider pane cannot have a link
        and an external url at the same time.
        """
        folder = create(Builder('folder').titled(u'Folder'))

        container = create(Builder('slider container')
                           .within(folder)
                           .titled(u'Slider Container'))

        pane = create(Builder('slider pane')
                      .within(container)
                      .titled(u'Pane 1')
                      .with_dummy_image())

        my_folder = create(Builder('folder').titled(u'My Folder'))

        browser.login().visit(pane)
        browser.find('Edit').click()
        browser.fill({
            'Link': my_folder,
            'External URL': 'http://4teamwork.ch',
        })
        browser.find_button_by_label('Save').click()

        assert_message('There were some errors.')
コード例 #15
0
    def test_warning_visible_when_quota_exceeded(self, browser):
        self.login(self.regular_user, browser=browser)

        settings = getUtility(IRegistry).forInterface(IPrivateFolderQuotaSettings)
        create(Builder('document').attach_file_containing('X' * 100)
               .within(self.private_dossier))

        browser.open(self.private_folder)
        statusmessages.assert_no_messages()

        settings.size_soft_limit = 70
        browser.reload()
        statusmessages.assert_message(
            u'The quota of your private folder will exceed soon.')

        settings.size_hard_limit = 80
        transaction.commit()
        browser.reload()
        statusmessages.assert_message(
            u'The quota of your private folder has exceeded,'
            ' you can not add any new files or mails.')

        settings.size_soft_limit = 0
        settings.size_hard_limit = 0
        browser.reload()
        statusmessages.assert_no_messages()
コード例 #16
0
    def test_agendaitem_list_can_be_created_and_updated(self, browser):
        self.login(self.committee_responsible, browser)
        browser.open(self.meeting)

        meeting = self.meeting.model
        self.assertIsNone(meeting.agendaitem_list_document)

        browser.css('.document-actions .action.generate').first.click()

        statusmessages.assert_message(
            u'Agenda item list for meeting 9. Sitzung der '
            u'Rechnungspr\xfcfungskommission has been generated '
            u'successfully.')

        self.assertIsNotNone(meeting.agendaitem_list_document)
        self.assertEqual(u'Agendaitem list-9. Sitzung der Rechnungspruefungskommission.docx',
                         meeting.agendaitem_list_document.resolve_document().file.filename)
        self.assertEqual(0, meeting.agendaitem_list_document.generated_version)

        # update already generated agendaitem list
        browser.css('.document-actions .action.generate').first.click()
        statusmessages.assert_message(
            u'Agenda item list for meeting 9. Sitzung der '
            u'Rechnungspr\xfcfungskommission has been updated successfully.')
        self.assertIsNotNone(meeting.agendaitem_list_document)
        self.assertEqual(1, meeting.agendaitem_list_document.generated_version)
コード例 #17
0
    def test_proposal_can_be_submitted_without_permission_on_commitee(
            self, browser):
        self.login(self.dossier_responsible, browser)
        # https://github.com/4teamwork/opengever.ftw/issues/41
        self.assertFalse(getSecurityManager().checkPermission(
            'View', self.draft_proposal.get_committee()))
        self.assertEqual(Proposal.STATE_PENDING,
                         self.draft_proposal.get_state())
        browser.visit(self.draft_proposal, view='tabbedview_view-overview')
        browser.click_on("proposal-transition-submit")
        browser.click_on("Confirm")
        self.assertEqual(Proposal.STATE_SUBMITTED,
                         self.draft_proposal.get_state())
        statusmessages.assert_no_error_messages()
        statusmessages.assert_message('Review state changed successfully.')
        self.assertEqual('proposal-state-submitted',
                         api.content.get_state(self.draft_proposal))

        self.login(self.administrator)
        model = self.draft_proposal.load_model()
        submitted_proposal = model.resolve_submitted_proposal()
        proposal_file = self.draft_proposal.get_proposal_document().file
        submitted_proposal_file = submitted_proposal.get_proposal_document(
        ).file
        with proposal_file.open() as expected:
            with submitted_proposal_file.open() as got:
                self.assertEquals(expected.read(), got.read())
コード例 #18
0
 def test_doc_without_file_but_preserved_as_paper_is_valid(self, browser):
     browser.login().open(self.dossier.absolute_url())
     factoriesmenu.add('Document')
     # No file, but preserved as paper
     browser.fill({'Title': 'My Document',
                   'Preserved as paper': True}).save()
     assert_message('Item created')
コード例 #19
0
    def test_redirects_to_trash_tab_when_no_documents_selected(self, browser):
        self.login(self.manager, browser)
        browser.open(self.dossier, view='remove_confirmation')

        self.assertEqual('{}#trash'.format(self.dossier.absolute_url()),
                         browser.url)
        assert_message('You have not selected any items.')
コード例 #20
0
    def test_show_status_message_after_reviving(self, browser):
        self.login(self.administrator, browser)

        browser.visit(self.document)
        browser.css('.actionMenuContent li').find('Revive preview').first.click()

        statusmessages.assert_message('Preview revived and will be available soon')
コード例 #21
0
    def test_committee_can_be_edited_in_browser(self, browser):
        self.login(self.committee_responsible, browser)

        local_roles = dict(self.committee.get_local_roles())
        self.assertIn('committee_rpk_group', local_roles)
        self.assertNotIn('committee_ver_group', local_roles)

        browser.open(self.committee, view='edit')
        form = browser.forms['form']

        self.assertEqual(u'Rechnungspr\xfcfungskommission',
                         form.find_field('Title').value)

        browser.fill({'Title': u'A c\xf6mmittee',
                      self.group_field_name: u'committee_ver_group'})
        browser.css('#form-buttons-save').first.click()

        statusmessages.assert_message('Changes saved')

        committee = browser.context
        local_roles = dict(committee.get_local_roles())
        self.assertEqual('committee-1', committee.getId())
        self.assertNotIn('committee_rpk_group', local_roles,)
        self.assertEqual(('CommitteeResponsible',),
                         local_roles.get('committee_ver_group'))

        model = committee.load_model()
        self.assertIsNotNone(model)
        self.assertEqual(u'A c\xf6mmittee', model.title)

        browser.open(self.committee, view='edit')
        self.assertEqual(
            'committee_ver_group', browser.find('Committeeresponsible').value)
コード例 #22
0
    def test_word_protocols_with_suffix_template_in_committee_can_be_created_and_updated(self, browser):
        self.login(self.committee_responsible, browser)
        self.committee.protocol_suffix_template = self.committee.protocol_header_template
        self.schedule_paragraph(self.meeting, u'A-Gesch\xe4fte')
        self.schedule_proposal(self.meeting, self.submitted_proposal)
        meeting = self.meeting.model

        self.assertIsNone(meeting.protocol_document)

        browser.open(meeting.get_url())
        # generate first protocol
        browser.css('.meeting-document.protocol-doc .action.generate').first.click()

        statusmessages.assert_message(
            u'Protocol for meeting 9. Sitzung der '
            u'Rechnungspr\xfcfungskommission has been generated '
            u'successfully.')
        self.assertIsNotNone(meeting.protocol_document)
        self.assertEqual(0, meeting.protocol_document.generated_version)

        # update already generated protocol
        browser.css('.meeting-document.protocol-doc .action.generate').first.click()

        statusmessages.assert_message(
            u'Protocol for meeting 9. Sitzung der '
            u'Rechnungspr\xfcfungskommission has been updated successfully.')
        self.assertIsNotNone(meeting.protocol_document)
        self.assertEqual(1, meeting.protocol_document.generated_version)
コード例 #23
0
    def test_word_proposal_can_be_submitted(self, browser):
        self.login(self.dossier_responsible, browser)
        self.assertEqual(Proposal.STATE_PENDING,
                         self.draft_word_proposal.get_state())
        self.assertEqual('proposal-state-active',
                         api.content.get_state(self.draft_word_proposal))

        browser.open(self.draft_word_proposal, view='tabbedview_view-overview')
        browser.click_on('Submit')
        statusmessages.assert_no_error_messages()
        statusmessages.assert_message('Proposal successfully submitted.')
        self.assertEqual(Proposal.STATE_SUBMITTED,
                         self.draft_word_proposal.get_state())
        self.assertEqual('proposal-state-submitted',
                         api.content.get_state(self.draft_word_proposal))

        self.login(self.administrator)
        model = self.draft_word_proposal.load_model()
        submitted_proposal = model.resolve_submitted_proposal()
        proposal_file = self.draft_word_proposal.get_proposal_document().file
        submitted_proposal_file = submitted_proposal.get_proposal_document(
        ).file
        with proposal_file.open() as expected:
            with submitted_proposal_file.open() as got:
                self.assertEquals(expected.read(), got.read())
コード例 #24
0
 def step_4(self):
     """The system integrates analytics budgets.."""
     statusmessages.assert_message(
         u'Le document XML a été importé avec succès.')
     self.assertEqual(
         self.sa17.analytic_budget, [{
             'service': u'O',
             'title': u'Réaliser un audit énergétique du bâtiment',
             'btype': u'D',
             'amount': 500.0,
             'year': 2019,
             'article': u'xxx/wal-17.2019'
         }, {
             'service': u'O',
             'title': u'Réaliser un audit énergétique du bâtiment',
             'btype': u'D',
             'amount': 500.0,
             'year': 2020,
             'article': u'xxx/wal-17.2020'
         }, {
             'service': u'O',
             'title': u'Réaliser un audit énergétique du bâtiment',
             'btype': u'D',
             'amount': 500.0,
             'year': 2021,
             'article': u'xxx/wal-17.2021'
         }, {
             'service': u'O',
             'title': u'Réaliser un audit énergétique du bâtiment',
             'btype': u'D',
             'amount': 500.0,
             'year': 2022,
             'article': u'xxx/wal-17.2022'
         }])
コード例 #25
0
    def test_destruction_confirmation_on_import(self, browser):
        self.use_spec('foo')
        specdetails.visit('Destructive Workflow (destructive-workflow)')
        specdetails.button_write_and_import().click()
        statusmessages.assert_message(
            'Workflow destructive-workflow successfully imported.')
        self.assert_current_states('Foo')

        self.use_spec('bar')
        specdetails.visit('Destructive Workflow (destructive-workflow)')
        specdetails.button_write_and_import().click()

        # not yet updated
        self.assert_current_states('Foo')

        # confirmation dialog displayed
        self.assertEquals(
            'Importing this workflow renames or removes states.'
            ' Changing states can reset the workflow status of affected'
            ' objects to the initial state.',
            browser.css('.confirmation-message').first.text,)

        # No changes on cancel
        browser.find('I am on production').click()
        self.assert_current_states('Foo')

        specdetails.button_write_and_import().click()
        browser.find('I know what I am doing').click()
        statusmessages.assert_message(
            'Workflow destructive-workflow successfully imported.')
        self.assert_current_states('Foo', 'Bar')
コード例 #26
0
    def test_submitted_proposal_can_be_rejected(self, browser):
        self.login(self.committee_responsible, browser)
        model = self.proposal.load_model()
        self.assertEqual(
            'opengever-meeting-committeecontainer/committee-1/submitted-proposal-1',
            model.submitted_physical_path)
        self.assertEqual(Proposal.STATE_SUBMITTED, self.proposal.get_state())
        self.assert_workflow_state('proposal-state-submitted', self.proposal)
        self.assertIsNotNone(self.proposal.date_of_submission)

        browser.visit(self.submitted_proposal, view='tabbedview_view-overview')
        browser.click_on('Reject')
        browser.fill({'Comment': u'Bitte \xfcberarbeiten'}).submit()
        statusmessages.assert_no_error_messages()
        statusmessages.assert_message(u'The proposal has been rejected successfully')

        self.assertIsNone(model.submitted_physical_path)
        self.assertIsNone(model.submitted_int_id)
        self.assertIsNone(model.submitted_admin_unit_id)
        self.assertIsNone(model.date_of_submission)
        self.assertEqual(Proposal.STATE_PENDING, self.proposal.get_state())
        self.assertIsNone(self.proposal.date_of_submission)
        self.assert_workflow_state('proposal-state-active', self.proposal)
        with self.assertRaises(KeyError):
            self.submitted_proposal
コード例 #27
0
 def test_submit_redirects_to_parent(self, browser):
     self.login(self.administrator, browser)
     browser.open(self.empty_repofolder, view='delete_repository')
     browser.click_on('Delete')
     statusmessages.assert_message(
         'The repository have been successfully deleted.')
     self.assertEquals(self.repository_root, browser.context)
コード例 #28
0
    def test_warn_when_adding_repo_to_repo_with_dossier(self, browser):
        """A repository folder should not contain other repository folders AND
        dossiers at the same time.
        But in order to migrate from "contains dossiers" to "contains folders"
        we need to allow creating repositories within repositories which already
        contain dossiers.
        But a warning message should be displayed in this situation.
        """
        self.login(self.administrator, browser)

        warning = u'You are adding a repositoryfolder to a leafnode ' \
                  u'which already contains dossiers. This is only ' \
                  u'temporarily allowed and all dossiers must be moved into ' \
                  u'a new leafnode afterwards.'

        self.assertTrue(any(filter(IDossierMarker.providedBy,
                                   self.leaf_repofolder.objectValues())),
                        'Expected at least one dossier within leaf_repofolder.')
        browser.open(self.leaf_repofolder)
        factoriesmenu.add('RepositoryFolder')
        statusmessages.assert_message(warning)

        self.assertFalse(any(filter(IDossierMarker.providedBy,
                                    self.branch_repofolder.objectValues())),
                         'Expected no dossiers within branch_repofolder.')
        browser.open(self.branch_repofolder)
        factoriesmenu.add('RepositoryFolder')
        statusmessages.assert_no_messages()

        self.assertFalse(any(filter(IDossierMarker.providedBy,
                                    self.empty_repofolder.objectValues())),
                         'Expected no dossiers within empty_repofolder.')
        browser.open(self.empty_repofolder)
        factoriesmenu.add('RepositoryFolder')
        statusmessages.assert_no_messages()
コード例 #29
0
    def test_after_deletion_redirects_back_and_shows_statusmessage(self, browser):
        data = {'paths': self.obj2paths([self.doc1, self.doc3])}
        browser.login().open(self.dossier, data, view='remove_confirmation')
        browser.forms.get('remove_confirmation').submit()

        self.assertEquals('http://nohost/plone/dossier-1#trash', browser.url)
        assert_message('The documents have been successfully deleted')
コード例 #30
0
 def test_doc_with_both_file_and_preserved_as_paper_is_valid(self, browser):
     browser.login().open(self.dossier.absolute_url())
     factoriesmenu.add('Document')
     # File AND preserved as paper
     browser.fill({'File': ('File data', 'file.txt', 'text/plain'),
                   'Preserved as paper': True}).save()
     assert_message('Item created')
コード例 #31
0
    def test_slider_pane_cannot_have_link_and_external_url(self, browser):
        """
        This test makes sure that the slider pane cannot have a link
        and an external url at the same time.
        """
        folder = create(Builder('folder').titled(u'Folder'))

        container = create(
            Builder('slider container').within(folder).titled(
                u'Slider Container'))

        pane = create(
            Builder('slider pane').within(container).titled(
                u'Pane 1').with_dummy_image())

        my_folder = create(Builder('folder').titled(u'My Folder'))

        browser.login().visit(pane)
        browser.find('Edit').click()
        browser.fill({
            'Link': my_folder,
            'External URL': 'http://4teamwork.ch',
        })
        browser.find_button_by_label('Save').click()

        assert_message('There were some errors.')
コード例 #32
0
    def test_committee_can_be_edited_in_browser(self, browser):
        self.login(self.committee_responsible, browser)

        local_roles = dict(self.committee.get_local_roles())
        self.assertIn('committee_rpk_group', local_roles)
        self.assertNotIn('committee_ver_group', local_roles)

        browser.open(self.committee, view='edit')
        form = browser.forms['form']

        self.assertEqual(u'Rechnungspr\xfcfungskommission',
                         form.find_field('Title').value)

        browser.fill({'Title': u'A c\xf6mmittee',
                      self.group_field_name: u'committee_ver_group'})
        browser.css('#form-buttons-save').first.click()

        statusmessages.assert_message('Changes saved')

        committee = browser.context
        local_roles = dict(committee.get_local_roles())
        self.assertEqual('committee-1', committee.getId())
        self.assertNotIn('committee_rpk_group', local_roles,)
        self.assertEqual(('CommitteeResponsible', 'Editor', 'Reader'),
                         local_roles.get('committee_ver_group'))

        model = committee.load_model()
        self.assertIsNotNone(model)
        self.assertEqual(u'A c\xf6mmittee', model.title)
コード例 #33
0
 def test_submit_redirects_to_parent(self, browser):
     self.login(self.administrator, browser)
     browser.open(self.empty_repofolder, view='delete_repository')
     browser.click_on('Delete')
     statusmessages.assert_message(
         'The repository have been successfully deleted.')
     self.assertEquals(self.repository_root, browser.context)
コード例 #34
0
    def test_agendaitem_list_can_be_created_and_updated(self, browser):
        self.login(self.committee_responsible, browser)
        browser.open(self.meeting)

        meeting = self.meeting.model
        self.assertIsNone(meeting.agendaitem_list_document)

        browser.css('.document-actions .action.generate').first.click()

        statusmessages.assert_message(
            u'Agenda item list for meeting 9. Sitzung der '
            u'Rechnungspr\xfcfungskommission has been generated '
            u'successfully.')

        self.assertIsNotNone(meeting.agendaitem_list_document)
        self.assertEqual(
            u'Agendaitem list-9. Sitzung der Rechnungspruefungskommission.docx',
            meeting.agendaitem_list_document.resolve_document().file.filename)
        self.assertEqual(0, meeting.agendaitem_list_document.generated_version)

        # update already generated agendaitem list
        browser.css('.document-actions .action.generate').first.click()
        statusmessages.assert_message(
            u'Agenda item list for meeting 9. Sitzung der '
            u'Rechnungspr\xfcfungskommission has been updated successfully.')
        self.assertIsNotNone(meeting.agendaitem_list_document)
        self.assertEqual(1, meeting.agendaitem_list_document.generated_version)
コード例 #35
0
 def step_4(self, browser, context):
     """The system updates summarized fields and save changes with "Modify changes" info success."""
     heading = browser.css('.documentFirstHeading').first
     self.assertEqual('Titre (SA.17)', heading.text)
     statusmessages.assert_message(u'Modifications sauvegardées')
     self.assertEqual(get_global_budget_infos(context.aq_parent), {
         'europe': 500.0,
         'wallonie': 7000.0,
         'autres': 500.0,
         'federal': 500.0
     })
     self.assertEqual(get_global_budget_infos(context.aq_parent.aq_parent),
                      {
                          'europe': 500.0,
                          'wallonie': 7000.0,
                          'autres': 500.0,
                          'federal': 500.0
                      })
     self.assertEqual(
         get_global_budget_infos(context.aq_parent.aq_parent.aq_parent), {
             'europe': 5800.0,
             'wallonie': 7550.0,
             'ville': 5430.0,
             'federal': 500.0,
             'autres': 500.0,
             'federation-wallonie-bruxelles': 520.55
         })
コード例 #36
0
 def test_show_portal_message_if_non_existing_objects_where_selected(
         self, browser):
     self.login(self.administrator, browser=browser)
     browser.visit(
         self.templates,
         view="folder_delete_confirmation?paths:list=/not/existing")
     statusmessages.assert_message(
         'Please select one or more items to delete.')
コード例 #37
0
    def test_assert_message_failure(self, browser):
        browser.open(view='test-statusmessages?type=info')
        with self.assertRaises(AssertionError) as cm:
            statusmessages.assert_message('a message', browser=browser)

        self.assertEquals('No status message "a message". Current messages:'
                          ' "[INFO] An info message."',
                          str(cm.exception))
コード例 #38
0
 def step_4(self, browser):
     """The system creates and displays the element with "Saved changes" info success."""
     statusmessages.assert_message(u'Elément créé')
     # catalog check
     context = browser.context
     brain = api.content.find(context=context, depth=0)[0]
     self.assertIn(context.title, brain.Title)
     self.assertEqual(context.categories, brain.categories)
コード例 #39
0
    def test_after_deletion_redirects_back_and_shows_statusmessage(
            self, browser):
        data = {'paths': self.obj2paths([self.doc1, self.doc3])}
        browser.login().open(self.dossier, data, view='remove_confirmation')
        browser.forms.get('remove_confirmation').submit()

        self.assertEquals('http://nohost/plone/dossier-1#trash', browser.url)
        assert_message('The documents have been successfully deleted')
コード例 #40
0
    def test_mimetype_sent_by_browser_is_ignored_on_upload(self, browser):
        browser.login().open(self.dossier.absolute_url())
        factoriesmenu.add("Document")

        browser.fill({"File": ("File data", "file.txt", "application/i-dont-know")}).save()
        assert_message("Item created")
        doc = browser.context.restrictedTraverse("document-1")
        self.assertEquals("text/plain", doc.file.contentType)
コード例 #41
0
 def step_4b(self, browser):
     """The system displays warnings, (Back to the step 2)."""
     # write browser contents
     # with open('browser_contents', 'w') as f:
     #     f.write(browser.contents)
     heading = browser.css('.documentFirstHeading').first
     self.assertEqual(u'Ajouter Objectif stratégique', heading.text)
     self.assertTrue('Champ obligatoire' in browser.contents)
     statusmessages.assert_message(u"Il y a des erreurs.")
コード例 #42
0
    def test_active_committee_can_be_deactivated(self, browser):
        self.login(self.committee_responsible, browser)
        browser.open(self.empty_committee)

        editbar.menu_option('Actions', 'deactivate').click()

        self.assertEqual(Committee.STATE_INACTIVE,
                         self.empty_committee.load_model().get_state())
        statusmessages.assert_message('Committee deactivated successfully')
コード例 #43
0
    def test_mimetype_sent_by_browser_is_ignored_on_upload(self, browser):
        browser.login().open(self.dossier.absolute_url())
        factoriesmenu.add('Document')

        browser.fill({'File': (
            'File data', 'file.txt', 'application/i-dont-know')}).save()
        assert_message('Item created')
        doc = browser.context.restrictedTraverse('document-1')
        self.assertEquals('text/plain', doc.file.contentType)
コード例 #44
0
    def test_video_url_invariant(self, browser):
        browser.login().visit(self.page)
        factoriesmenu.add('VideoBlock')
        browser.fill({'Youtube, or Vimeo URL': 'https://example.com'})
        browser.find_button_by_label('Save').click()

        statusmessages.assert_message('There were some errors.')
        self.assertEquals('This is no a valid youtube, or vimeo url.',
                          browser.css('.field.error').first.text)
コード例 #45
0
    def test_show_status_message_after_reviving(self, browser):
        self.login(self.administrator, browser)

        browser.visit(self.document)
        browser.css('.actionMenuContent li').find(
            'Revive preview').first.click()

        statusmessages.assert_message(
            'Preview revived and will be available soon')
コード例 #46
0
    def test_doc_with_both_file_and_preserved_as_paper_is_valid(self, browser):
        self.login(self.dossier_responsible, browser)
        browser.open(self.dossier)

        factoriesmenu.add('Document')
        # File AND preserved as paper
        browser.fill({'File': ('File data', 'file.txt', 'text/plain'),
                      'Preserved as paper': True}).save()
        assert_message('Item created')
コード例 #47
0
    def test_active_committee_can_be_deactivated(self, browser):
        self.login(self.committee_responsible, browser)
        browser.open(self.empty_committee)

        editbar.menu_option('Actions', 'deactivate').click()

        self.assertEqual(Committee.STATE_INACTIVE,
                         self.empty_committee.load_model().get_state())
        statusmessages.assert_message('Committee deactivated successfully')
コード例 #48
0
    def test_mimetype_sent_by_browser_is_ignored_on_upload(self, browser):
        browser.login().open(self.dossier.absolute_url())
        factoriesmenu.add('Document')

        browser.fill({'File': (
            'File data', 'file.txt', 'application/i-dont-know')}).save()
        assert_message('Item created')
        doc = browser.context.restrictedTraverse('document-1')
        self.assertEquals('text/plain', doc.file.contentType)
コード例 #49
0
    def test_after_deletion_redirects_back_and_shows_statusmessage(self, browser):
        self.login(self.manager, browser)

        self.trash_documents(self.empty_document)
        browser.open(self.dossier, self.make_path_param(self.empty_document), view='remove_confirmation')
        browser.forms.get('remove_confirmation').submit()

        self.assertEqual('{}#trash'.format(self.dossier.absolute_url()), browser.url)
        assert_message('The documents have been successfully deleted')
コード例 #50
0
    def test_doc_without_file_but_preserved_as_paper_is_valid(self, browser):
        self.login(self.dossier_responsible, browser)
        browser.open(self.dossier)

        factoriesmenu.add('Document')
        # No file, but preserved as paper
        browser.fill({'Title': 'My Document',
                      'Preserved as paper': True}).save()
        assert_message('Item created')
コード例 #51
0
 def test_proposal_cannot_change_state_when_documents_checked_out(self, browser):
     self.login(self.dossier_responsible, browser)
     document = self.draft_word_proposal.get_proposal_document()
     self.checkout_document(document)
     self.assertTrue(self.draft_word_proposal.contains_checked_out_documents())
     browser.open(self.draft_word_proposal, view='tabbedview_view-overview')
     browser.click_on('Submit')
     statusmessages.assert_message(
         'Cannot change the state because the proposal'
         ' contains checked out documents.')
コード例 #52
0
    def test_message_is_displayed_on_working_copy(self, browser):
        baseline = create(Builder('sl content page').titled(u'A page'))
        with freeze(datetime(2017, 7, 24)):
            working_copy = IStaging(baseline).create_working_copy(self.portal)

        transaction.commit()

        browser.login().open(working_copy)
        statusmessages.assert_message(
            'This is the working copy of test_user_1_, created at Jul 24, 2017.')
コード例 #53
0
    def test_message_is_displayed_on_baseline(self, browser):
        baseline = create(Builder('sl content page').titled(u'A page'))
        with freeze(datetime(2017, 7, 24)):
            IStaging(baseline).create_working_copy(self.portal)

        transaction.commit()

        browser.login().open(baseline)
        statusmessages.assert_message(
            'test_user_1_ is working on this page in a http://nohost/plone/copy_of_a-page copy created at Jul 24, 2017.')
コード例 #54
0
 def test_uploading_non_docx_files_is_not_allowed(self, browser):
     self.login(self.administrator, browser)
     browser.open(self.templates, view='++add++opengever.meeting.proposaltemplate')
     browser.fill({
         'Title': u'Geb\xfchren',
         'File': ('DATA', 'Wrong.txt', 'text/plain')}).save()
     statusmessages.assert_message('There were some errors.')
     self.assertEquals(
         ['Only word files (.docx) can be added here.'],
         browser.css('#formfield-form-widgets-file .error').text)
コード例 #55
0
    def test_deactivating_is_not_possible_when_pending_meetings_exists(
            self, browser):
        self.login(self.committee_responsible, browser)
        browser.open(self.committee)

        editbar.menu_option('Actions', 'deactivate').click()

        self.assertEqual(Committee.STATE_ACTIVE,
                         self.committee.load_model().get_state())
        statusmessages.assert_message('Not all meetings are closed.')
コード例 #56
0
    def test_delete_action_works_for_owner_on_document(self, browser):
        self.login(self.regular_user, browser)
        browser.open(self.private_document)
        browser.find('Delete').click()
        browser.find('Delete').click()

        statusmessages.assert_message(u'Testdokum\xe4nt has been deleted.')

        with self.assertRaises(KeyError):
            self.assertIsNone(self.private_document)
コード例 #57
0
    def test_mimetype_is_determined_by_using_python_mtr(self, browser):
        mimetypes.add_type("application/foobar", ".foo")

        browser.login().open(self.dossier.absolute_url())
        factoriesmenu.add("Document")

        browser.fill({"File": ("File data", "file.foo", "application/i-dont-know")}).save()
        assert_message("Item created")
        doc = browser.context.restrictedTraverse("document-1")
        self.assertEquals("application/foobar", doc.file.contentType)