Example #1
0
    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'}})
Example #2
0
    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()
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
    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)
Example #10
0
    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')
Example #11
0
    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')))
Example #16
0
    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')
Example #29
0
    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')
Example #30
0
    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)
Example #32
0
    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))
Example #35
0
    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)
Example #38
0
    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)
Example #39
0
    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')
Example #43
0
    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))
Example #44
0
    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')
Example #46
0
    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)
Example #47
0
    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')
Example #48
0
    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))
Example #49
0
    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')