def test_only_expired_dossiers_can_be_added(self, browser): self.login(self.records_manager, browser) data = {'paths:list': obj2paths([self.expired_dossier]), '_authenticator': createToken()} self.assertEqual(date(2000, 12, 31), IDossier(self.expired_dossier).end) with freeze(datetime(2001, 1, 1)): browser.open(self.repository_root, view='++add++opengever.disposition.disposition', data=data) browser.find('Save').click() self.assertEquals(['There were some errors.'], error_messages()) self.assertEquals( ['The retention period of the selected dossiers is not expired.'], browser.css('.fieldErrorBox .error').text) with freeze(datetime(2021, 1, 1)): browser.open(self.repository_root, view='++add++opengever.disposition.disposition', data=data) browser.find('Save').click() self.assertEquals([], error_messages()) self.assertEquals(['Item created'], info_messages())
def test_send_mail_form_valid_email_addresses(self, browser): browser.login().visit(self.file_, view='send-mail-form') browser.fill({'Recipients': 'email@example\[email protected]'}) browser.find('Send').click() statusmessages.error_messages() self.assertFalse(len(self.storage.get_storage()), 'Expect no tokens.') browser.fill({'Recipients': u'em\xe4il@example'}) statusmessages.error_messages()
def test_multi_checkin_shows_message_when_no_documents_are_selected(self, browser): browser.login().open( self.dossier, data={"paths": [], "checkin_without_comment:method": 1, "_authenticator": createToken()} ) self.assertEquals(["You have not selected any documents"], error_messages()) self.assertEquals("http://nohost/plone/dossier-1#documents", browser.url) browser.login().open( self.dossier, data={"paths": [], "checkin_documents:method": 1, "_authenticator": createToken()} ) browser.click_on("Checkin") self.assertEquals(["You have not selected any documents"], error_messages()) self.assertEquals("http://nohost/plone/dossier-1#documents", browser.url)
def test_error_when_untrashing_removed_document(self, browser): self.login(self.manager, browser=browser) data = self.make_path_param(self.empty_document) data['_authenticator'] = createToken() self.trash_documents(self.empty_document) Remover([self.empty_document]).remove() # Removed document cannot be untrashed browser.open(self.empty_dossier, view="untrashed", data=data) self.assertTrue(ITrashed.providedBy(self.empty_document)) self.assertEquals( [u'Untrashing {} is forbidden'.format(self.empty_document.title)], error_messages()) # When restored, document can be untrashed api.content.transition( obj=self.empty_document, transition=self.empty_document.restore_transition) self.assertEqual(self.empty_document.active_state, api.content.get_state(self.empty_document)) browser.open(self.empty_dossier, view="untrashed", data=data) self.assertFalse(ITrashed.providedBy(self.empty_document))
def test_redirect_back_and_shows_message_when_no_items_is_selected(self, browser): browser.login().open(self.dossier, view="trashed") self.assertEquals(['You have not selected any items'], error_messages()) self.assertEquals( 'http://nohost/plone/dossier-1#documents', browser.url)
def test_definitionXML_not_touched_on_error(self, browser): with open(INVALID_WORKFLOW_DEFINITION_XML, 'w+') as file_: file_.write('some contents') specdetails.visit('Invalid Workflow (invalid-spec)') self.assertTrue( specdetails.button_write_and_import(), 'The Button "Write and Import Workflow" in "Invalid Workflow"' ' should be visible but is not.') specdetails.button_write_and_import().click() self.assertGreater( os.path.getsize(INVALID_WORKFLOW_DEFINITION_XML), 0, 'The definition.xml (%s) is empty, but it should not be touched' 'since we had an error while generating.' % ( INVALID_WORKFLOW_DEFINITION_XML)) self.maxDiff = None self.assertEquals([], statusmessages.info_messages(), 'Expecting no "info" portal messages.') self.assertEquals(['invalid-spec: Error while generating the' ' workflow: Action "viewX" is' ' neither action group nor transition.'], statusmessages.error_messages(), 'Expecting only the workflow generation error.') remove_definition_xml(INVALID_WORKFLOW_DEFINITION_XML)
def test_pasting_empty_clipboard_shows_message_and_redirect_back(self, browser): self.login(self.regular_user, browser=browser) browser.open(self.dossier, view='paste_clipboard') self.assertEqual(self.dossier.absolute_url(), browser.url) self.assertEqual([u"Can't paste items; the clipboard is emtpy"], error_messages())
def test_redirects_to_context_and_show_message_when_no_main_dossier_exists(self, browser): browser.login().open(self.repo, view='redirect_to_main_dossier') self.assertEquals(self.repo, browser.context) self.assertEquals( [u'The object `F\xfchrung` is not stored inside a dossier.'], error_messages())
def test_pasting_empty_clipboard_shows_message_and_redirect_back(self, browser): dossier = create(Builder('dossier')) browser.login().open(dossier, view='paste_clipboard') self.assertEqual(dossier.absolute_url(), browser.url) self.assertEqual([u"Can't paste items, the clipboard is emtpy"], error_messages())
def test_generating_protocol_twice_displays_error_message(self, browser): self.setup_protocol(browser) browser.open(GenerateProtocol.url_for(self.meeting)) browser.open(GenerateProtocol.url_for(self.meeting)) self.assertEqual('The protocol for meeting My meeting has already ' 'been generated.', error_messages()[0])
def test_multi_checkin_does_not_checkin_locked_documents(self, browser): self.login(self.regular_user, browser) browser.open(self.document, view='tabbedview_view-overview') browser.find('Checkout and edit').click() browser.open(self.subdocument, view='tabbedview_view-overview') browser.find('Checkout and edit').click() lockable = IRefreshableLockable(self.document) lockable.lock() browser.open( self.dossier, method='POST', data={ 'paths': [ obj2brain(self.document).getPath(), obj2brain(self.subdocument).getPath(), ], 'checkin_without_comment:method': 1, '_authenticator': createToken(), }, ) manager = getMultiAdapter((self.document, self.portal.REQUEST), ICheckinCheckoutManager) self.assertEquals('kathi.barfuss', manager.get_checked_out_by()) manager = getMultiAdapter((self.subdocument, self.portal.REQUEST), ICheckinCheckoutManager) self.assertEquals(None, manager.get_checked_out_by()) self.assertEquals([u'Could not check in document Vertr\xe4gsentwurf'], error_messages())
def test_multi_checkin_shows_message_when_no_documents_are_selected(self, browser): self.login(self.regular_user, browser) browser.open( self.dossier, data={ 'paths': [], 'checkin_without_comment:method': 1, '_authenticator': createToken(), }, ) self.assertEquals( ['You have not selected any documents.'], error_messages(), ) redirect_target_url = ''.join(( self.dossier.absolute_url(), '#documents' )) self.assertEquals( redirect_target_url, browser.url, ) browser.open( self.dossier, data={ 'paths': [], 'checkin_documents:method': 1, '_authenticator': createToken(), }, ) browser.click_on('Checkin') self.assertEquals( ['You have not selected any documents.'], error_messages(), ) self.assertIn( redirect_target_url, browser.url, )
def test_redirect_back_and_shows_message_when_no_items_is_selected(self, browser): self.login(self.regular_user, browser=browser) browser.open(self.dossier, view="untrashed") self.assertEquals(['You have not selected any items.'], error_messages()) self.assertEquals( '{}#trash'.format(self.dossier.absolute_url()), browser.url)
def test_protocol_shows_validation_errors(self, browser): browser.login() browser.open(self.meeting.get_url(view='protocol')) browser.fill({'Protocol start-page': 'uhoh, no int'}).submit() self.assertEqual(['There were some errors.'], error_messages()) self.assertIn('Protocol start-page', erroneous_fields(browser.forms['form']))
def test_pasting_empty_clipboard_shows_message_and_redirect_back( self, browser): dossier = create(Builder('dossier')) browser.login().open(dossier, view='paste_clipboard') self.assertEqual(dossier.absolute_url(), browser.url) self.assertEqual([u"Can't paste items; the clipboard is emtpy"], error_messages())
def test_redirects_back_and_show_message_if_no_item_was_selected( self, browser): dossier = create(Builder('dossier')) browser.login().open(dossier, view='copy_items') self.assertEqual(dossier.absolute_url(), browser.url) self.assertEqual(['You have not selected any Items.'], error_messages())
def test_do_nothing_when_responsible_has_not_changed(self, browser): self.login(self.regular_user, browser=browser) responsible = 'fa:{}'.format(self.regular_user.getId()) self.assign_task(responsible, u'Thats a job for you.') self.assertEquals(self.task.absolute_url(), browser.url.strip('/')) self.assertEquals(['No changes: same responsible selected'], error_messages())
def test_shows_message_when_checkout_cant_be_cancelled(self, browser): doc = create(Builder('document').within(self.dossier)) browser.login().open(doc, {'_authenticator': createToken()}, view='cancel_document_checkouts', ) self.assertEquals( [u'Could not cancel checkout on document Testdokum\xe4nt.'], error_messages())
def test_shows_statusmessage_when_no_template_is_configured(self, browser): url = self.period.get_url(self.committee) browser.login().open(url, view=self.view_name) # when an error happens here, the view returns an error # and the page is reloaded in Javascript. Here we reload manually browser.open(url) self.assertEqual(u'There is no toc template configured, toc could ' 'not be generated.', error_messages()[0])
def test_generating_protocol_twice_displays_error_message(self, browser): self.setup_protocol(browser) browser.open(GenerateProtocol.url_for(self.meeting)) browser.open(GenerateProtocol.url_for(self.meeting)) self.assertEqual( 'The protocol for meeting My meeting has already ' 'been generated.', error_messages()[0])
def test_resolving_is_cancelled_when_active_tasks_exist(self, browser): dossier = create(Builder('dossier')) create(Builder('task').within(dossier)) browser.login().open(dossier, {'_authenticator': createToken()}, view='transition-resolve') self.assertEquals(dossier.absolute_url(), browser.url) self.assertEquals(['not all task are closed'], error_messages())
def test_text_field_is_required_for_comments(self, browser): dossier = create(Builder('dossier')) task = create(Builder('task').titled('Task').within(dossier)) browser.login().visit(task, view="addcommentresponse") browser.find('Save').click() self.assertEqual(['There were some errors.'], statusmessages.error_messages())
def test_redirect_back_and_shows_message_when_no_items_is_selected( self, browser): self.login(self.regular_user, browser=browser) browser.open(self.dossier, view="untrashed") self.assertEquals(['You have not selected any items.'], error_messages()) self.assertEquals('{}#trash'.format(self.dossier.absolute_url()), browser.url)
def test_redirects_to_context_and_show_statusmessage_when_obj_cant_be_found(self, browser): self.move_items( browser, src=self.source_dossier, obj='/invalid/path', target=self.target_dossier) self.assertEqual(self.source_dossier.absolute_url(), browser.url) self.assertEqual( "The selected objects can't be found, please try it again.", error_messages()[0])
def test_cannot_copy_checked_out_document(self, browser): self.login(self.regular_user, browser=browser) self.checkout_document(self.document) browser.open(self.document, view='copy_item') self.assertEqual(self.document.absolute_url(), browser.url) self.assertEqual(['Checked out documents cannot be copied.'], error_messages())
def test_fails_with_checked_out_documents(self, browser): create(Builder('document').within(self.dossier).checked_out()) browser.login().open(self.dossier, view='transition-deactivate', data={'_authenticator': createToken()}) self.assertEqual( u"The Dossier can't be deactivated, not all containeddocuments " "are checked in.", error_messages()[0])
def test_shows_statusmessage_when_no_template_is_configured(self, browser): url = self.period.get_url(self.committee) browser.login().open(url, view=self.view_name) # when an error happens here, the view returns an error # and the page is reloaded in Javascript. Here we reload manually browser.open(url) self.assertEqual( u'There is no toc template configured, toc could ' 'not be generated.', error_messages()[0])
def test_deactivating_is_not_possible_when_pending_meetings_exists(self, browser): committee = create(Builder('committee').titled(u'My Committee')) create(Builder('meeting').having(committee=committee)) browser.login().open(committee) browser.find('Deactivate').click() self.assertEqual(['Not all meetings are closed.'], error_messages()) self.assertEqual(Committee.STATE_ACTIVE, committee.load_model().get_state())
def test_cannot_copy_checked_out_document(self, browser): self.login(self.regular_user, browser=browser) self.checkout_document(self.document) data = self.make_path_param(self.document, self.mail_eml) browser.open(self.dossier, data=data, view='copy_items') self.assertEqual(self.dossier.absolute_url(), browser.url) self.assertEqual([], info_messages()) self.assertEqual(['Checked out documents cannot be copied.'], error_messages())
def test_fails_with_resolved_subdossier(self, browser): create(Builder('dossier') .within(self.dossier) .titled(u'b\xe4\xe4\xe4h') .in_state('dossier-state-resolved')) browser.login().open(self.dossier, view='transition-deactivate', data={'_authenticator': createToken()}) self.assertEqual( u"The Dossier can't be deactivated, the subdossier b\xe4\xe4\xe4h is already resolved", error_messages()[0])
def test_dossier_manager_is_not_mandatory_when_not_protecting_dossier(self, browser): self.login(self.dossier_manager, browser) browser.open(self.leaf_repofolder) factoriesmenu.add(u'Business Case Dossier') browser.fill({'Title': 'My Dossier'}) form = browser.find_form_by_field('Reading') form.find_widget('Dossier manager').fill('') browser.click_on('Save') self.assertNotIn('There were some errors.', error_messages())
def test_redirects_to_context_and_show_statusmessage_when_obj_cant_be_found( self, browser): self.move_items(browser, src=self.source_dossier, obj='/invalid/path', target=self.target_dossier) self.assertEqual(self.source_dossier.absolute_url(), browser.url) self.assertEqual( "The selected objects can't be found, please try it again.", error_messages()[0])
def test_resolving_is_cancelled_when_documents_are_checked_out(self, browser): dossier = create(Builder('dossier')) create(Builder('document').within(dossier).checked_out()) browser.login().open(dossier, {'_authenticator': createToken()}, view='transition-resolve') self.assertEquals(dossier.absolute_url(), browser.url) self.assertEquals(['not all documents are checked in'], error_messages())
def test_fails_with_checked_out_documents(self, browser): create(Builder('document') .within(self.dossier) .checked_out()) browser.login().open(self.dossier, view='transition-deactivate', data={'_authenticator': createToken()}) self.assertEqual( u"The Dossier can't be deactivated, not all containeddocuments " "are checked in.", error_messages()[0])
def test_copy_document_from_repository_into_private_dossier_fails(self, browser): # noqa self.login(self.regular_user, browser=browser) browser.open( self.dossier, view="copy_items", data=self.make_path_param(self.document)) browser.open(self.private_dossier, view='paste_clipboard') self.assertEqual( ["Can't paste items, the context does not allow pasting items."], error_messages())
def test_task_inside_closed_dossier_is_not_movable(self, browser): self.login(self.dossier_manager) self.move_items( browser, src=self.expired_dossier, task=self.expired_task, target=self.empty_dossier) self.assertEqual( ['Can only move objects from open dossiers!'], error_messages()) self.assertIn(self.expired_task, self.expired_dossier.objectValues()) self.assertNotIn(self.expired_task, self.empty_dossier.objectValues())
def test_resolving_is_cancelled_when_documents_are_checked_out( self, browser): dossier = create(Builder('dossier')) create(Builder('document').within(dossier).checked_out()) browser.login().open(dossier, {'_authenticator': createToken()}, view='transition-resolve') self.assertEquals(dossier.absolute_url(), browser.url) self.assertEquals(['not all documents are checked in'], error_messages())
def test_task_inside_closed_dossier_is_not_movable(self, browser): self.login(self.dossier_manager) self.move_items(browser, src=self.expired_dossier, task=self.expired_task, target=self.empty_dossier) self.assertEqual(['Can only move objects from open dossiers!'], error_messages()) self.assertIn(self.expired_task, self.expired_dossier.objectValues()) self.assertNotIn(self.expired_task, self.empty_dossier.objectValues())
def test_document_inside_a_task_is_not_movable(self, browser): self.login(self.regular_user) self.move_items( browser, src=self.task, obj=self.taskdocument, target=self.empty_dossier) self.assertEqual( 'Document {} is inside a task and therefore not movable. Move the task instead'.format(self.taskdocument.title), error_messages()[0]) self.assertIn(self.taskdocument, self.task.objectValues()) self.assertNotIn(self.taskdocument, self.empty_dossier.objectValues())
def test_redirects_back_and_show_statusmessage_when_no_active_tasktemplatefolder_exists(self, browser): api.content.transition( self.folder1, transition='tasktemplatefolder-transition-activ-inactiv') transaction.commit() browser.login().open(self.dossier, view='add-tasktemplate') self.assertEquals(self.dossier.absolute_url(), browser.url) self.assertEquals( ['Currently there are no active task template folders registered.'], error_messages())
def test_fails_with_resolved_subdossier(self, browser): create( Builder('dossier').within(self.dossier).titled( u'b\xe4\xe4\xe4h').in_state('dossier-state-resolved')) browser.login().open(self.dossier, view='transition-deactivate', data={'_authenticator': createToken()}) self.assertEqual( u"The Dossier can't be deactivated, the subdossier b\xe4\xe4\xe4h is already resolved", error_messages()[0])
def test_dossier_manager_is_not_mandatory_when_not_protecting_dossier( self, browser): self.login(self.dossier_manager, browser) browser.open(self.leaf_repofolder) factoriesmenu.add(u'Business Case Dossier') browser.fill({'Title': 'My Dossier'}) form = browser.find_form_by_field('Reading') form.find_widget('Dossier manager').fill('') browser.click_on('Save') self.assertNotIn('There were some errors.', error_messages())
def test_mail_inside_closed_dossier_is_not_movable(self, browser): self.login(self.dossier_manager) self.set_workflow_state('dossier-state-resolved', self.dossier) self.move_items( browser, src=self.dossier, obj=self.mail_eml, target=self.empty_dossier) self.assertEqual( ['Can only move objects from open dossiers!'], error_messages()) self.assertIn(self.mail_eml, self.dossier.objectValues()) self.assertNotIn(self.mail_eml, self.empty_dossier.objectValues())
def test_mail_inside_closed_dossier_is_not_movable(self, browser): self.login(self.dossier_manager) self.set_workflow_state('dossier-state-resolved', self.dossier) self.move_items(browser, src=self.dossier, obj=self.mail_eml, target=self.empty_dossier) self.assertEqual(['Can only move objects from open dossiers!'], error_messages()) self.assertIn(self.mail_eml, self.dossier.objectValues()) self.assertNotIn(self.mail_eml, self.empty_dossier.objectValues())
def test_resolving_is_cancelled_when_dossier_has_an_invalid_end_date( self, browser): dossier = create(Builder('dossier').having(end=date(2016, 5, 7))) create( Builder('document').within(dossier).having( document_date=date(2016, 6, 1))) browser.login().open(dossier, {'_authenticator': createToken()}, view='transition-resolve') self.assertEquals(dossier.absolute_url(), browser.url) self.assertEquals([], error_messages())
def test_protocol_template_can_be_configured_per_commitee(self, browser): custom_template = create( Builder('sablontemplate').within( self.templates).with_asset_file('sablon_template.docx')) browser.login().open(self.committee, view='edit') browser.fill({'Protocol template': custom_template}) browser.css('#form-buttons-save').first.click() self.assertEqual([], error_messages()) self.assertEqual(custom_template, self.committee.get_protocol_template())
def test_document_inside_a_task_is_not_movable(self, browser): self.login(self.regular_user) self.move_items(browser, src=self.task, obj=self.taskdocument, target=self.empty_dossier) self.assertEqual( 'Document {} is not movable.'.format(self.taskdocument.title), error_messages()[0]) self.assertIn(self.taskdocument, self.task.objectValues()) self.assertNotIn(self.taskdocument, self.empty_dossier.objectValues())
def test_redirects_back_and_show_statusmessage_when_no_active_tasktemplatefolder_exists( self, browser): api.content.transition( self.folder1, transition='tasktemplatefolder-transition-activ-inactiv') transaction.commit() browser.login().open(self.dossier, view='add-tasktemplate') self.assertEquals(self.dossier.absolute_url(), browser.url) self.assertEquals([ 'Currently there are no active task template folders registered.' ], error_messages())
def test_redirects_back_and_show_statusmessage_when_no_active_tasktemplatefolder_exists(self, browser): self.login(self.regular_user, browser=browser) self.set_workflow_state( 'tasktemplatefolder-state-inactiv', self.tasktemplatefolder) browser.open(self.dossier, view='add-tasktemplate') self.assertEquals(self.dossier.absolute_url(), browser.url) self.assertEquals( ['Currently there are no active task template folders registered.'], error_messages())
def test_issuing_key_without_title_is_not_allowed(self, browser): browser.login().open(view='@@manage-service-keys') browser.find('Issue new service key').click() browser.find('Issue key').click() self.assertEqual(['There were some errors.'], error_messages()) self.assertEqual({'Title': ['Required input is missing.']}, erroneous_fields(browser.forms['form'])) storage = CredentialStorage(self.plugin) self.assertEqual(0, len(storage.list_service_keys(TEST_USER_ID)))
def test_shows_message_when_checkout_cant_be_cancelled(self, browser): doc = create(Builder('document').within(self.dossier)) browser.login().open( doc, {'_authenticator': createToken()}, view='cancel_document_checkouts', ) self.assertEquals( [u'Could not cancel checkout on document Testdokum\xe4nt.'], error_messages())
def test_mail_inside_closed_dossier_is_not_movable(self, browser): dossier = create(Builder('dossier').in_state('dossier-state-resolved')) mail = create(Builder('mail').within(dossier).titled(u'My mail')) self.move_items(browser, src=dossier, obj=mail, target=self.target_dossier) self.assertIn(mail, dossier.objectValues()) self.assertNotIn(mail, self.target_dossier.objectValues()) self.assertEqual(['Can only move objects from open dossiers!'], error_messages())
def test_template_can_be_configured_per_committee(self, browser): self.grant("Administrator", "CommitteeResponsible") custom_template = create( Builder('sablontemplate').within( self.templates).with_asset_file('sablon_template.docx')) browser.login().open(self.committee, view='edit') browser.fill({'Agendaitem list template': custom_template}) browser.css('#form-buttons-save').first.click() self.assertEqual([], error_messages()) self.assertEqual(custom_template, self.committee.get_agendaitem_list_template())
def test_document_inside_inactive_dossier_is_not_movable(self, browser): self.login(self.dossier_manager) self.move_items(browser, src=self.inactive_dossier, obj=self.inactive_document, target=self.empty_dossier) self.assertEqual(['Can only move objects from open dossiers!'], error_messages()) self.assertIn(self.inactive_document, self.inactive_dossier.objectValues()) self.assertNotIn(self.inactive_document, self.empty_dossier.objectValues())
def test_resolving_is_cancelled_when_dossier_has_active_proposals( self, browser): repo = create(Builder('repository')) dossier = create( Builder('dossier').within(repo).having(end=date(2016, 5, 7))) create(Builder('proposal').within(dossier)) browser.login().open(dossier, {'_authenticator': createToken()}, view='transition-resolve') self.assertEquals(dossier.absolute_url(), browser.url) self.assertEquals(['The dossier contains active proposals.'], error_messages())