def test_title_title_content(self): with Reset(): with SimpleTransaction(): factory = self.root.manage_addProduct['Silva'] factory.manage_addFolder('folder', 'Folder') factory = self.root.folder.manage_addProduct['Silva'] factory.manage_addMockupVersionedContent('document', 'Document') with SimpleTransaction(): content = self.root.folder.document with assertTriggersEvents('MetadataModifiedEvent'): content.set_title('New document') with assertTriggersEvents('MetadataModifiedEvent'): content.get_editable().set_title('Outdated Document') request = TestRequest() invalidation = Invalidation(request) self.assertEqual(request.cookies, {}) self.assertEqual( list(invalidation.get_changes()), [{'action': 'update', 'listing': 'publishables', 'interface': 'publishables', 'container': self.get_id(self.root.folder), 'content': self.get_id(content), 'position': 1}]) # A cookie is set self.assertEqual( request.response.cookies, {'silva.listing.invalidation': {'path': '/root', 'value': '1'}})
def test_modify_modify_asset(self): with Reset(): with SimpleTransaction(): factory = self.root.manage_addProduct['Silva'] factory.manage_addFolder('folder', 'Folder') factory = self.root.folder.manage_addProduct['Silva'] factory.manage_addFile('data_file', 'Data file') with SimpleTransaction(): data_file = self.root.folder.data_file with assertTriggersEvents('ObjectModifiedEvent'): data_file.set_text('Edit content') with assertTriggersEvents('ObjectModifiedEvent'): data_file.set_text('Actually, edit again the content') with assertTriggersEvents('ObjectModifiedEvent'): data_file.set_text('I am not sure at all') request = TestRequest() invalidation = Invalidation(request) self.assertEqual(request.cookies, {}) self.assertEqual( list(invalidation.get_changes()), [{'action': 'update', 'listing': 'assets', 'interface': 'assets', 'container': self.get_id(self.root.folder), 'content': self.get_id(data_file), 'position': -1}]) # A cookie is set self.assertEqual( request.response.cookies, {'silva.listing.invalidation': {'path': '/root', 'value': '2'}})
def test_generate_id(self): forum = self.root.forum # test id uniqueness with assertTriggersEvents('ContentCreatedEvent'): topic1 = forum.add_topic('this is title one') with assertTriggersEvents('ContentCreatedEvent'): topic2 = forum.add_topic('this is title one') self.assertNotEqual(topic1.id, topic2.id) # test unicode strings test_id = 'ümlauts ümlauts' gen_id = forum._generate_id('ümlauts ümlauts') self.assertNotEqual(gen_id, test_id) # test invalid characters test_id = 'What the @#@%##!!$#%^' gen_id = forum._generate_id(test_id) self.assertNotEqual(gen_id, test_id) with assertTriggersEvents('ContentCreatedEvent'): t1 = forum.add_topic(':) foo :)') self.assertEqual('foo_', t1.id) with assertTriggersEvents('ContentCreatedEvent'): t2 = forum.add_topic(':) foo :)') self.assertEqual('foo__2', t2.id) with assertTriggersEvents('ContentCreatedEvent'): t3 = forum.add_topic(':) foo :)') self.assertEqual('foo__3', t3.id)
def test_move_content_id_already_in_use(self): """Move a content with an id that is already in use in the target folder. """ factory = self.root.target.manage_addProduct['Silva'] factory.manage_addLink('toc', 'Link to AutoTOC') manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.mover() as mover: self.assertNotEqual( mover(self.root.source.toc), None) self.assertFalse('toc' in self.root.source.objectIds()) self.assertTrue('toc' in self.root.target.objectIds()) self.assertTrue('move_of_toc' in self.root.target.objectIds()) self.assertTrue(verifyObject(ILink, self.root.target.toc)) self.assertTrue(verifyObject(IAutoTOC, self.root.target.move_of_toc)) # Now if we move it back, the move_of_ will be stripped manager = IContainerManager(self.root.source) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.mover() as mover: self.assertNotEqual( mover(self.root.target.move_of_toc), None) self.assertTrue('toc' in self.root.source.objectIds()) self.assertFalse('move_of_toc' in self.root.target.objectIds()) self.assertTrue(verifyObject(IAutoTOC, self.root.source.toc))
def test_activation(self): service = queryUtility(IForestService) with assertTriggersEvents( 'ForestWillBeActivatedEvent', 'ForestActivatedEvent'): service.activate() self.assertTrue(service.is_active()) request = TestRequest(application=self.root) plugin = request.query_plugin(request.application, IVirtualHosting) self.assertTrue(verifyObject(IForestHosting, plugin)) # You cannot activate the service twice. with self.assertRaises(ValueError): with assertNotTriggersEvents(): service.activate() self.assertTrue(service.is_active()) with assertTriggersEvents( 'ForestWillBeDeactivatedEvent', 'ForestDeactivatedEvent'): service.deactivate() self.assertFalse(service.is_active()) # The service is not active. with self.assertRaises(ValueError): with assertNotTriggersEvents(): service.deactivate()
def test_reset(self): """Test that set_acquired reset the settings. """ access = component.queryAdapter(self.content, IAccessSecurity) with assertTriggersEvents('SecurityRestrictionModifiedEvent'): access.set_minimum_role('Manager') checkPermission = getSecurityManager().checkPermission self.assertEqual(bool(checkPermission('View', self.content)), False) with assertTriggersEvents('SecurityRestrictionModifiedEvent'): access.set_acquired() self.assertEqual(access.is_acquired(), True) self.assertEqual(access.acquired, True) self.assertEqual(access.get_minimum_role(), None) self.assertEqual(access.minimum_role, None) self.assertEqual(bool(checkPermission('View', self.content)), True)
def test_empty_image(self): """Test an image that doesn't store an image. """ with Transaction(): factory = self.root.manage_addProduct['Silva'] with assertTriggersEvents('ObjectCreatedEvent'): factory.manage_addImage('image', 'Image') image = self.root.image self.assertTrue(verifyObject(interfaces.IImage, image)) self.assertEqual(image.get_mime_type(), 'application/octet-stream') self.assertEqual(image.get_content_type(), 'application/octet-stream') self.assertEqual(image.get_filename(), 'image') self.assertEqual(image.get_file_size(), 0) self.assertEqual(image.get_file_system_path(), None) self.assertEqual(image.get_image(), None) self.assertNotEqual(image.get_modification_datetime(), None) self.assertNotEqual(image.get_creation_datetime(), None) payload = interfaces.IAssetPayload(image) self.assertTrue(verifyObject(interfaces.IAssetPayload, payload)) self.assertEqual(payload.get_payload(), None) # Since the image is empty, a request to it will trigger a 404 with self.layer.get_browser() as browser: self.assertEqual(browser.open('/root/image'), 404)
def test_grant_role_as_manager(self): """Test setting a role (as a Manager). """ self.layer.login('manager') access = IAuthorizationManager(self.root.folder) authorization = access.get_authorization('reader') self.assertEqual(authorization.role, 'Reader') # The user already have role, reader, so this does nothing with assertNotTriggersEvents('SecurityRoleAddedEvent'): self.assertEqual(authorization.grant('Reader'), False) self.assertEqual(authorization.local_role, None) # The user doesn't have that role so it is set with assertTriggersEvents('SecurityRoleAddedEvent'): self.assertEqual(authorization.grant('Manager'), True) self.assertEqual(authorization.local_role, 'Manager') # Now the user is editor self.assertEqual(authorization.role, 'Manager') # A new query returns the same results authorization = access.get_authorization('reader') self.assertEqual(authorization.local_role, 'Manager') self.assertEqual(authorization.role, 'Manager')
def test_folder(self): """When pasting a folder as a ghost, its content is ghosted and any versioned content (ghost) in it are published. """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeAddedEvent', 'ObjectAddedEvent', 'ContainerModifiedEvent'): with manager.ghoster() as ghoster: ghost = ghoster(self.root.source) self.assertTrue(verifyObject(IGhostFolder, ghost)) self.assertEqual(ghost.get_link_status(), None) self.assertEqual(ghost.get_haunted(), self.root.source) self.assertIn('source', self.root.target.objectIds()) # The ghost folder is created inside the target folder and is # already haunting the source. ghost = self.root.target.source self.assertTrue(verifyObject(IGhostFolder, ghost)) self.assertEqual(ghost.get_link_status(), None) self.assertEqual(ghost.get_haunted(), self.root.source) self.assertItemsEqual( ghost.objectIds(), ['toc', 'data', 'folder', 'logo']) self.assertTrue(verifyObject(IGhost, ghost.toc)) self.assertEqual(ghost.toc.get_haunted(), self.root.source.toc) self.assertTrue(verifyObject(IGhost, ghost.data)) self.assertEqual(ghost.data.get_haunted(), self.root.source.data) self.assertEqual(ghost.data.is_published(), True) self.assertTrue(verifyObject(IGhostFolder, ghost.folder)) self.assertEqual(ghost.folder.get_haunted(), self.root.source.folder)
def test_revoke_as_chiefeditor(self): """Revoke a local role as a chiefeditor (of an editor). """ self.layer.login('chiefeditor') access = IAuthorizationManager(self.root) authorization = access.get_authorization('reader') self.assertEqual(authorization.local_role, 'Editor') self.assertEqual(authorization.acquired_role, 'Reader') self.assertEqual(authorization.role, 'Editor') # We revoke the role with assertTriggersEvents('SecurityRoleRemovedEvent'): self.assertEqual(authorization.revoke(), True) # It is gone self.assertEqual(authorization.local_role, None) self.assertEqual(authorization.acquired_role, 'Reader') self.assertEqual(authorization.role, 'Reader') # Even on a new query authorization = access.get_authorization('reader') self.assertEqual(authorization.local_role, None) self.assertEqual(authorization.acquired_role, 'Reader') self.assertEqual(authorization.role, 'Reader')
def test_events(self): """Check that events are launch when a find object is added/modified. """ with assertTriggersEvents( 'ObjectAddedEvent', 'ContentCreatedEvent'): factory = self.root.manage_addProduct['SilvaFind'] factory.manage_addSilvaFind('new_search', 'New Search')
def test_comments(self): topic = self.root.forum.topic self.assertTrue(verifyObject(interfaces.ITopic, topic)) self.assertEquals(0, len(topic.comments())) factory = topic.manage_addProduct['SilvaForum'] with assertTriggersEvents('ContentCreatedEvent'): factory.manage_addComment('com', 'Comment') self.assertEquals(1, len(topic.comments()))
def test_topics(self): forum = self.root.forum self.assertTrue(verifyObject(interfaces.IForum, forum)) self.assertEqual(0, len(forum.topics())) factory = forum.manage_addProduct['SilvaForum'] with assertTriggersEvents('ContentCreatedEvent'): factory.manage_addTopic('topic', 'Topic') self.assertEqual(1, len(forum.topics()))
def test_not_anonymous(self): forum = self.root.forum metadata = getUtility(IMetadataService) with assertTriggersEvents('ContentCreatedEvent'): topic = forum.add_topic('Spam and eggs') binding = metadata.getMetadata(topic) topics = forum.topics() self.assertEqual(binding.get('silvaforum-item', 'anonymous'), 'no') self.assertEquals(topics[0]['creator'], 'author')
def test_add_comment(self): topic = self.root.forum.topic # test if the forum is empty self.assertEqual(0, len(topic.objectValues('Silva Forum Comment'))) # test add_comment method with assertTriggersEvents('ContentCreatedEvent'): topic.add_comment('Comment', 'comment text') # see if the comment has been added properly self.assertEqual(1,len(topic.objectValues('Silva Forum Comment')))
def test_link(self): """Test that link triggers events. """ factory = self.root.manage_addProduct['Silva'] with assertTriggersEvents('ObjectCreatedEvent'): factory.manage_addLink('link', 'Link') link = self.root.link self.assertTrue(verifyObject(ILink, link)) editable = link.get_editable() self.assertTrue(verifyObject(ILinkVersion, editable))
def test_delete_single(self): manager = IContainerManager(self.root.folder) with assertTriggersEvents( 'ObjectWillBeRemovedEvent', 'ObjectRemovedEvent', 'ContainerModifiedEvent'): with manager.deleter() as deleter: self.assertEqual( deleter(self.root.folder.toc), self.root.folder.toc) self.assertFalse('toc' in self.root.folder.objectIds())
def test_asset(self): """Pasting an asset as a ghost asset. """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeAddedEvent', 'ObjectAddedEvent', 'ContainerModifiedEvent'): with manager.ghoster() as ghoster: ghost = ghoster(self.root.source.logo) self.assertTrue(verifyObject(IGhostAsset, ghost)) self.assertIn('logo', self.root.target.objectIds()) self.assertEqual(ghost.get_link_status(), None) self.assertEqual(ghost.get_haunted(), self.root.source.logo)
def test_copy_content_id_already_in_use(self): """Copy a single content to a folder where the content id is already in use. """ factory = self.root.target.manage_addProduct["Silva"] factory.manage_addLink("folder", "Link to the ultimate Folder") manager = IContainerManager(self.root.target) with assertTriggersEvents( "ObjectCopiedEvent", "ObjectWillBeAddedEvent", "ObjectAddedEvent", "ContainerModifiedEvent", "ObjectClonedEvent", ): with manager.copier() as copier: self.assertNotEqual(copier(self.root.source.folder), None) self.assertTrue("folder" in self.root.source.objectIds()) self.assertTrue("folder" in self.root.target.objectIds()) self.assertTrue("copy_of_folder" in self.root.target.objectIds()) self.assertTrue(verifyObject(ILink, self.root.target.folder)) self.assertTrue(verifyObject(IFolder, self.root.target.copy_of_folder)) # And an another time will create a copy2_of_folder with assertTriggersEvents( "ObjectCopiedEvent", "ObjectWillBeAddedEvent", "ObjectAddedEvent", "ContainerModifiedEvent", "ObjectClonedEvent", ): with manager.copier() as copier: self.assertNotEqual(copier(self.root.source.folder), None) self.assertTrue("copy2_of_folder" in self.root.target.objectIds()) self.assertTrue(verifyObject(IFolder, self.root.target.copy2_of_folder))
def test_other(self): """Pasting a content that doesn't have a ghost implementation. It should be copied. """ factory = self.root.source.manage_addProduct['Silva'] factory.manage_addMockupNonPublishable('stuff', 'Stuff') manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeAddedEvent', 'ObjectAddedEvent', 'ContainerModifiedEvent'): with manager.ghoster() as ghoster: ghost = ghoster(self.root.source.stuff) self.assertTrue(verifyObject(IMockupNonPublishable, ghost)) self.assertIn('stuff', self.root.target.objectIds())
def test_move_content(self): """Move a single item. """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.mover() as mover: self.assertNotEqual( mover(self.root.source.toc), None) self.assertFalse('toc' in self.root.source.objectIds()) self.assertTrue('toc' in self.root.target.objectIds()) self.assertTrue(verifyObject(IAutoTOC, self.root.target.toc))
def test_delete_published_recursive(self): """An editor can delete a folder that contains published content. """ manager = IContainerManager(self.root) with assertTriggersEvents( 'ObjectWillBeRemovedEvent', 'ObjectRemovedEvent', 'ContainerModifiedEvent'): with manager.deleter() as deleter: self.assertEqual( deleter(self.root.folder), self.root.folder) self.assertFalse('folder' in self.root.objectIds())
def test_add_topic(self): forum = self.root.forum # see if the forum is empty like we expect self.assertEqual(0, len(forum.objectValues('Silva Forum Topic'))) # use our method to add a topic with assertTriggersEvents('ContentCreatedEvent'): newtopic = forum.add_topic('Topic') # see if the topic has been added properly self.assertEqual(1, len(forum.objectValues('Silva Forum Topic'))) # also see if the thing returned is what we expect it is self.assertEqual('Silva Forum Topic', newtopic.meta_type) self.assertEqual('Topic', newtopic.get_title())
def test_add_topic_anonymous(self): forum = self.root.forum self.assertFalse(forum.anonymous_posting_allowed()) self.assertRaises(ValueError, forum.add_topic, 'Foo bar!', True) metadata = getUtility(IMetadataService) binding = metadata.getMetadata(forum) binding.setValues('silvaforum-forum', {'anonymous_posting': 'yes'}) with assertTriggersEvents('ContentCreatedEvent'): topic = forum.add_topic('Foo bar!', True) binding = metadata.getMetadata(topic) topics = forum.topics() self.assertEqual(binding.get('silvaforum-item', 'anonymous'), 'yes') self.assertEqual(topics[0]['creator'], 'anonymous')
def test_rename_not_published_content_id_and_title(self): """Rename id and title for a not published content. """ manager = IContainerManager(self.root.folder) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.renamer() as renamer: self.assertNotEqual( renamer((self.root.folder.link, 'nice_link', 'Nice Link')), None) self.assertFalse('link' in self.root.folder.objectIds()) self.assertTrue('nice_link' in self.root.folder.objectIds()) self.assertTrue(verifyObject(ILink, self.root.folder.nice_link)) self.assertEqual(self.root.folder.nice_link.get_editable().get_title(), 'Nice Link')
def test_rename_published_container_id_and_title(self): """Rename a published container id and title. An Editor has the right to change both the id and title. """ manager = IContainerManager(self.root) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.renamer() as renamer: self.assertNotEqual( renamer((self.root.folder, 'archives', 'Archives')), None) self.assertFalse('folder' in self.root.objectIds()) self.assertTrue('archives' in self.root.objectIds()) self.assertTrue(verifyObject(IFolder, self.root.archives)) self.assertEqual(self.root.archives.get_title(), 'Archives')
def test_rename_id(self): """Rename only the identifier for a single non-publishable item. """ manager = IContainerManager(self.root.folder) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.renamer() as renamer: self.assertNotEqual( renamer((self.root.folder.toc, 'newtoc', None)), None) self.assertFalse('toc' in self.root.folder.objectIds()) self.assertTrue('newtoc' in self.root.folder.objectIds()) self.assertTrue(verifyObject(IAutoTOC, self.root.folder.newtoc)) self.assertEqual(self.root.folder.newtoc.get_title(), 'AutoTOC')
def test_rename_not_published_content_id_and_title(self): """Rename id and title for a not published content. """ manager = IContainerManager(self.root.folder) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.renamer() as renamer: self.assertNotEqual( renamer((self.root.folder.link, 'nice_link', 'Nice Link')), None) self.assertFalse('link' in self.root.folder.objectIds()) self.assertTrue('nice_link' in self.root.folder.objectIds()) self.assertTrue(verifyObject(ILink, self.root.folder.nice_link)) self.assertEqual(self.root.folder.nice_link.get_editable().get_title(), 'Nice Link')
def test_copy_content(self): """Copy a single content. """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectCopiedEvent', 'ObjectWillBeAddedEvent', 'ObjectAddedEvent', 'ContainerModifiedEvent', 'ObjectClonedEvent'): with manager.copier() as copier: self.assertNotEqual(copier(self.root.source.toc), None) self.assertTrue('toc' in self.root.source.objectIds()) self.assertTrue('toc' in self.root.target.objectIds()) self.assertTrue(verifyObject(IAutoTOC, self.root.target.toc)) self.assertEqual(self.root.target.toc.get_title(), 'AutoTOC')
def test_create_new_version_published(self): versioning = self.root.versioning # create new version versioning.create_version('0', DateTime() - 10, DateTime() + 20) # approve it with assertTriggersEvents('ContentApprovedEvent', 'ContentPublishedEvent'): versioning.approve_version() # it should be public now, create new version versioning.create_version('1', DateTime() - 5, DateTime() + 20) self.assertEqual(versioning.get_public_version(), '0') self.assertEqual(versioning.get_approved_version(), None) self.assertEqual(versioning.get_unapproved_version(), '1')
def test_invalid(self): """Pasting a content as a ghost folder that contains a content with an invalid identifier. """ self.root.source.manage_renameObject('folder', 'index') manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeAddedEvent', 'ObjectAddedEvent', 'ContainerModifiedEvent'): with manager.ghoster() as ghoster: error = ghoster(self.root.source) self.assertTrue(verifyObject(IContentErrorBundle, error)) self.assertEqual(error.content, self.root.target.source) self.assertEqual(error.reason, u'Error while synchronizing the Ghost Folder: not all its content have been updated properly.') self.assertEqual(len(error.errors), 1)
def test_acquire(self): """Test that children content acquire correctly the settings from parents. """ access = component.queryAdapter(self.content, IAccessSecurity) with assertTriggersEvents('SecurityRestrictionModifiedEvent'): access.set_minimum_role('ChiefEditor') checkPermission = getSecurityManager().checkPermission self.assertEqual(bool(checkPermission('View', self.content)), False) children = self.root.folder.folder children_access = component.queryAdapter(children, IAccessSecurity) self.assertEqual(children_access.is_acquired(), True) self.assertEqual(children_access.acquired, True) self.assertEqual(children_access.get_minimum_role(), 'ChiefEditor') self.assertEqual(children_access.minimum_role, 'ChiefEditor') self.assertEqual(bool(checkPermission('View', children)), False)
def test_move_published_content(self): """Move a single published content. Editors can do it. The link stays published. """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.mover() as mover: self.assertNotEqual(mover(self.root.source.published_link), None) self.assertFalse('published_link' in self.root.source.objectIds()) self.assertTrue('published_link' in self.root.target.objectIds()) self.assertTrue(verifyObject(ILink, self.root.target.published_link)) self.assertNotEqual(self.root.target.published_link.get_viewable(), None)
def test_move_multiple(self): """Move multiple content in one time (one container, one unpublished content). """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.mover() as mover: self.assertNotEqual(mover(self.root.source.folder), None) self.assertNotEqual(mover(self.root.source.link), None) self.assertFalse('folder' in self.root.source.objectIds()) self.assertTrue('folder' in self.root.target.objectIds()) self.assertTrue(verifyObject(IFolder, self.root.target.folder)) self.assertFalse('link' in self.root.source.objectIds()) self.assertTrue('link' in self.root.target.objectIds()) self.assertTrue(verifyObject(ILink, self.root.target.link))
def test_copy_published_content(self): """Copy a content that is published. It is copied, but the copy will be closed. """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectCopiedEvent', 'ObjectWillBeAddedEvent', 'ObjectAddedEvent', 'ContainerModifiedEvent', 'ObjectClonedEvent'): with manager.copier() as copier: self.assertNotEqual(copier(self.root.source.published_link), None) self.assertTrue('published_link' in self.root.source.objectIds()) self.assertTrue('published_link' in self.root.target.objectIds()) self.assertTrue(verifyObject(ILink, self.root.target.published_link)) self.assertEqual(self.root.target.published_link.get_viewable(), None) self.assertNotEqual(self.root.source.published_link.get_viewable(), None)
def test_rename_published_container_id_and_title(self): """Rename a published container id and title. An Editor has the right to change both the id and title. """ manager = IContainerManager(self.root) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.renamer() as renamer: self.assertNotEqual( renamer((self.root.folder, 'archives', 'Archives')), None) self.assertFalse('folder' in self.root.objectIds()) self.assertTrue('archives' in self.root.objectIds()) self.assertTrue(verifyObject(IFolder, self.root.archives)) self.assertEqual(self.root.archives.get_title(), 'Archives')
def test_move_published_content(self): """Move a single published content. Editors can do it. The link stays published. """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.mover() as mover: self.assertNotEqual( mover(self.root.source.published_link), None) self.assertFalse('published_link' in self.root.source.objectIds()) self.assertTrue('published_link' in self.root.target.objectIds()) self.assertTrue(verifyObject(ILink, self.root.target.published_link)) self.assertNotEqual(self.root.target.published_link.get_viewable(), None)
def test_acquire(self): """Test that children content acquire correctly the settings from parents. """ access = component.queryAdapter(self.content, IAccessSecurity) with assertTriggersEvents('SecurityRestrictionModifiedEvent'): access.set_minimum_role('ChiefEditor') checkPermission = getSecurityManager().checkPermission self.assertEqual( bool(checkPermission('View', self.content)), False) children = self.root.folder.folder children_access = component.queryAdapter(children, IAccessSecurity) self.assertEqual(children_access.is_acquired(), True) self.assertEqual(children_access.acquired, True) self.assertEqual(children_access.get_minimum_role(), 'ChiefEditor') self.assertEqual(children_access.minimum_role, 'ChiefEditor') self.assertEqual(bool(checkPermission('View', children)), False)
def test_modify(self): access = component.queryAdapter(self.content, IAccessSecurity) checkPermission = getSecurityManager().checkPermission for role, author_ok in [('Authenticated', True), ('Viewer', True), ('Reader', True), ('Author', True), ('Editor', False), ('ChiefEditor', False), ('Manager', False)]: with assertTriggersEvents('SecurityRestrictionModifiedEvent'): access.set_minimum_role(role) self.assertEqual(access.is_acquired(), False) self.assertEqual(access.acquired, False) self.assertEqual(access.get_minimum_role(), role) self.assertEqual(access.minimum_role, role) self.assertEqual(bool(checkPermission('View', self.content)), author_ok)
def test_move_published_container(self): """Move a single published container. Authors doesn't have the right to do it. """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.mover() as mover: self.assertNotEqual(mover(self.root.source), None) self.assertFalse('source' in self.root.objectIds()) self.assertTrue('source' in self.root.target.objectIds()) self.assertTrue(verifyObject(IFolder, self.root.target.source)) # Inner content is still there and published. self.assertItemsEqual(self.root.target.source.objectIds(), ['toc', 'link', 'published_link', 'folder']) self.assertNotEqual( self.root.target.source.published_link.get_viewable(), None)
def test_content(self): """When pasting a content as a regular ghost, it doesn't get published. """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectWillBeAddedEvent', 'ObjectAddedEvent', 'ContainerModifiedEvent'): with manager.ghoster() as ghoster: ghost = ghoster(self.root.source.data) self.assertTrue(verifyObject(IGhost, ghost)) self.assertIn('data', self.root.target.objectIds()) self.assertEqual(ghost.get_haunted(), self.root.source.data) self.assertEqual(ghost.is_published(), False) self.assertEqual(ghost.get_viewable(), None) version = ghost.get_editable() self.assertTrue(verifyObject(IGhostVersion, version)) self.assertEqual(version.get_link_status(), None) self.assertEqual(version.get_haunted(), self.root.source.data)
def test_rename_published_content_id_and_title(self): """Rename a published content id and title. An Editor has the right to change the id, but not the title (there is no unapproved version to set the title on). """ folder = self.root.folder manager = IContainerManager(folder) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.renamer() as renamer: self.assertIsInstance( renamer((folder.published_link, 'updated_link', 'Updated Link')), ContentError) self.assertFalse('published_link' in folder.objectIds()) self.assertTrue('updated_link' in folder.objectIds()) self.assertTrue(verifyObject(ILink, folder.updated_link)) # The title is not changed (it changed only the editable # version, there is None) self.assertEqual(folder.updated_link.get_title(), 'Published Link')
def test_publication_to_folder(self): """Test Silva Publication to Silva Folder conversion. """ factory = self.root.manage_addProduct['Silva'] factory.manage_addPublication('publication', 'Publication') factory = self.root.publication.manage_addProduct['Silva'] factory.manage_addAutoTOC('index', 'Index') self.assertTrue('publication' in self.get_listing('Silva Publication')) self.assertTrue(verifyObject(IPublication, self.root.publication)) publication_id = self.get_id(self.root.publication) with assertTriggersEvents('ObjectModifiedEvent'): self.root.publication.to_folder() self.assertFalse('publication' in self.get_listing('Silva Publication')) self.assertTrue('publication' in self.get_listing('Silva Folder')) self.assertTrue(verifyObject(IFolder, self.root.publication)) self.assertFalse(IPublication.providedBy(self.root.publication)) self.assertTrue('index' in self.root.publication.objectIds()) self.assertEqual(publication_id, self.get_id(self.root.publication))
def test_publication_to_folder_catalog(self): """Verify that the catalog is updated when the conversion is done. """ factory = self.root.manage_addProduct['Silva'] factory.manage_addFolder('folder', 'Folder') catalog = getUtility(ICatalogService) brains = catalog(meta_type='Silva Folder') self.assertEqual(len(brains), 1) self.assertEqual(brains[0].getObject(), self.root.folder) brains = catalog(meta_type='Silva Publication') self.assertEqual(len(brains), 0) with assertTriggersEvents('ObjectModifiedEvent'): self.root.folder.to_publication() brains = catalog(meta_type='Silva Folder') self.assertEqual(len(brains), 0) brains = catalog(meta_type='Silva Publication') self.assertEqual(len(brains), 1) self.assertEqual(brains[0].getObject(), self.root.folder)
def test_rename_multiple(self): """Rename multipe content in one time. """ manager = IContainerManager(self.root.folder) with assertTriggersEvents('ObjectWillBeMovedEvent', 'ObjectMovedEvent', 'ContainerModifiedEvent'): with manager.renamer() as renamer: self.assertNotEqual( renamer((self.root.folder.toc, 'newtoc', None)), None) self.assertNotEqual( renamer((self.root.folder.link, 'nice_link', 'Nice Link')), None) self.assertFalse('toc' in self.root.folder.objectIds()) self.assertTrue('newtoc' in self.root.folder.objectIds()) self.assertTrue(verifyObject(IAutoTOC, self.root.folder.newtoc)) self.assertEqual(self.root.folder.newtoc.get_title(), 'AutoTOC') self.assertFalse('link' in self.root.folder.objectIds()) self.assertTrue('nice_link' in self.root.folder.objectIds()) self.assertTrue(verifyObject(ILink, self.root.folder.nice_link)) self.assertEqual(self.root.folder.nice_link.get_editable().get_title(), 'Nice Link')
def test_copy_published_container(self): """Copy a container that contains published content. All content will be copied, and published content will be closed. """ manager = IContainerManager(self.root.target) with assertTriggersEvents('ObjectCopiedEvent', 'ObjectWillBeAddedEvent', 'ObjectAddedEvent', 'ContainerModifiedEvent', 'ObjectClonedEvent'): with manager.copier() as copier: self.assertNotEqual(copier(self.root.source), None) self.assertTrue('source' in self.root.target.objectIds()) self.assertItemsEqual( self.root.target.source.objectIds(), ['folder', 'link', 'published_link', 'toc']) self.assertTrue(verifyObject(IFolder, self.root.target.source)) self.assertTrue(verifyObject(IAutoTOC, self.root.target.source.toc)) self.assertTrue(verifyObject(ILink, self.root.target.source.link)) self.assertTrue(verifyObject(ILink, self.root.target.source.published_link)) self.assertEqual(self.root.target.source.link.get_viewable(), None) self.assertEqual(self.root.target.source.published_link.get_viewable(), None)
def test_grant_role(self): """Test setting a role (as a ChiefEditor). """ access = IAuthorizationManager(self.root.folder) authorization = access.get_authorization('reader') self.assertEqual(authorization.role, 'Reader') # We (chiefeditor) don't have Manager, so can't give that role. with assertNotTriggersEvents('SecurityRoleAddedEvent'): with self.assertRaises(UnauthorizedRoleAssignement): authorization.grant('Manager') # The user already have role, reader, so this does nothing with assertNotTriggersEvents('SecurityRoleAddedEvent'): self.assertEqual(authorization.grant('Viewer'), False) self.assertEqual(authorization.local_role, None) # The user doesn't have that role so it is set with assertTriggersEvents('SecurityRoleAddedEvent'): self.assertEqual(authorization.grant('Editor'), True) self.assertEqual(authorization.local_role, 'Editor') # Now the user is editor self.assertEqual(authorization.role, 'Editor')
def test_folder_to_publication_with_marker_past(self): """Test Silva Folder to Silva Publication conversion when the folder have been provided in the past with a marker. """ factory = self.root.manage_addProduct['Silva'] factory.manage_addFolder('folder', 'Folder') factory = self.root.folder.manage_addProduct['Silva'] factory.manage_addAutoTOC('index', 'Index') folder_id = self.get_id(self.root.folder) alsoProvides(self.root.folder, IAdditionalMarker) noLongerProvides(self.root.folder, IAdditionalMarker) self.assertTrue('folder' in self.get_listing('Silva Folder')) self.assertTrue(verifyObject(IFolder, self.root.folder)) self.assertFalse(IPublication.providedBy(self.root.folder)) with assertTriggersEvents('ObjectModifiedEvent'): self.root.folder.to_publication() self.assertFalse('folder' in self.get_listing('Silva Folder')) self.assertTrue('folder' in self.get_listing('Silva Publication')) self.assertTrue(verifyObject(IPublication, self.root.folder)) self.assertTrue('index' in self.root.folder.objectIds()) self.assertEqual(folder_id, self.get_id(self.root.folder))
def test_revoke_as_manager(self): """Revoke a local role as a manager. """ access = IAuthorizationManager(self.folder) authorization = access.get_authorization('reader') self.assertEqual(authorization.local_role, 'Manager') self.assertEqual(authorization.acquired_role, 'Editor') self.assertEqual(authorization.role, 'Manager') # We revoke the role with assertTriggersEvents('SecurityRoleRemovedEvent'): self.assertEqual(authorization.revoke(), True) # It is gone self.assertEqual(authorization.local_role, None) self.assertEqual(authorization.acquired_role, 'Editor') self.assertEqual(authorization.role, 'Editor') # Even on a new query authorization = access.get_authorization('reader') self.assertEqual(authorization.local_role, None) self.assertEqual(authorization.acquired_role, 'Editor') self.assertEqual(authorization.role, 'Editor')