def test_copy_outdated_ghost_folder(self):
        """Test creating a Ghost Folder and copying it when it is
        outdated. We should get a new ghost folder, that is fully
        ghost.
        """
        factory = self.root.target.manage_addProduct['Silva']
        factory.manage_addGhostFolder('ghost', None, haunted=self.root.folder)
        self.assertEqual(self.root.target.ghost.get_link_status(), None)

        # We delete something from the ghost
        manager = IContainerManager(self.root.target.ghost)
        with manager.deleter() as deleter:
            deleter(self.root.target.ghost.index)
        self.assertNotIn('index', self.root.target.ghost.objectIds())

        # Copy the ghost in the root folder
        with IContainerManager(self.root).copier() as copier:
            self.assertNotEqual(copier(self.root.target.ghost), None)

        # We should have a copy
        self.assertIn('ghost', self.root.objectIds())
        self.assertTrue(verifyObject(IGhostFolder, self.root.ghost))
        self.assertEqual(self.root.ghost.get_link_status(), None)
        self.assertEqual(self.root.ghost.get_haunted(), self.root.folder)
        self.assertIn('index', self.root.ghost.objectIds())
        self.assertTrue(verifyObject(IGhost, self.root.ghost.index))
        self.assertEqual(self.root.ghost.index.get_link_status(), None)
        self.assertEqual(self.root.ghost.index.get_haunted(),
                         self.root.folder.index)
    def test_copy_outdated_ghost_folder(self):
        """Test creating a Ghost Folder and copying it when it is
        outdated. We should get a new ghost folder, that is fully
        ghost.
        """
        factory = self.root.target.manage_addProduct['Silva']
        factory.manage_addGhostFolder('ghost', None, haunted=self.root.folder)
        self.assertEqual(self.root.target.ghost.get_link_status(), None)

        # We delete something from the ghost
        manager = IContainerManager(self.root.target.ghost)
        with manager.deleter() as deleter:
            deleter(self.root.target.ghost.index)
        self.assertNotIn('index', self.root.target.ghost.objectIds())

        # Copy the ghost in the root folder
        with IContainerManager(self.root).copier() as copier:
            self.assertNotEqual(copier(self.root.target.ghost), None)

        # We should have a copy
        self.assertIn('ghost', self.root.objectIds())
        self.assertTrue(verifyObject(IGhostFolder, self.root.ghost))
        self.assertEqual(self.root.ghost.get_link_status(), None)
        self.assertEqual(self.root.ghost.get_haunted(), self.root.folder)
        self.assertIn('index', self.root.ghost.objectIds())
        self.assertTrue(verifyObject(IGhost, self.root.ghost.index))
        self.assertEqual(self.root.ghost.index.get_link_status(), None)
        self.assertEqual(
            self.root.ghost.index.get_haunted(),
            self.root.folder.index)
    def test_collect_quota_on_activation(self):
        """Test values update on activation.
        """
        # Create some content
        factory = self.root.manage_addProduct['Silva']
        factory.manage_addFolder('folder1', 'FooFolder 1')
        factory.manage_addFolder('folder2', 'FooFolder 2')
        folder1 = self.root._getOb('folder1')
        folder2 = self.root._getOb('folder2')
        factory = folder1.manage_addProduct['Silva']
        factory.manage_addFolder('subfolder', 'Sub FooFolder')
        subfolder1 = folder1._getOb('subfolder')
        factory = subfolder1.manage_addProduct['Silva']
        with self.layer.open_fixture('test1.zip') as source:
            factory.manage_addFile('zipfile1.zip', 'Zip File', source)
            # After reading the file, position should be end of file
            zip1_size = source.tell()
        factory = folder2.manage_addProduct['Silva']
        with self.layer.open_fixture('torvald.jpg') as source:
            factory.manage_addImage('image1.jpg', 'Image File', source)
            image1_size = source.tell()

        # No counting should be done (extensions not activated)
        self.assertEqual(self.root.used_space, 0)
        self.assertEqual(folder1.used_space, 0)
        self.assertEqual(folder2.used_space, 0)

        # Activate the quota system
        self.root.service_extensions.enable_quota_subsystem()

        # Values should be updated
        self.assertEqual(self.root.used_space, zip1_size + image1_size)
        self.assertEqual(folder1.used_space, zip1_size)
        self.assertEqual(subfolder1.used_space, zip1_size)
        self.assertEqual(folder2.used_space, image1_size)

        # Disable
        self.root.service_extensions.disable_quota_subsystem()

        # Do some changes
        manager = IContainerManager(folder1)
        with manager.deleter() as deleter:
            deleter(folder1.subfolder)
        with manager.copier() as copier:
            copier(self.root.folder2)

        # Nothing had change
        self.assertEqual(self.root.used_space, zip1_size + image1_size)
        self.assertEqual(folder1.used_space, zip1_size)
        self.assertEqual(folder2.used_space, image1_size)

        # Re-enable
        self.root.service_extensions.enable_quota_subsystem()
        # Values should be updated
        self.assertEqual(self.root.used_space, (2 * image1_size))
        self.assertEqual(folder1.used_space, image1_size)
        self.assertEqual(folder2.used_space, image1_size)
    def test_collect_quota_on_activation(self):
        """Test values update on activation.
        """
        # Create some content
        factory = self.root.manage_addProduct['Silva']
        factory.manage_addFolder('folder1', 'FooFolder 1')
        factory.manage_addFolder('folder2', 'FooFolder 2')
        folder1 = self.root._getOb('folder1')
        folder2 = self.root._getOb('folder2')
        factory = folder1.manage_addProduct['Silva']
        factory.manage_addFolder('subfolder', 'Sub FooFolder')
        subfolder1 = folder1._getOb('subfolder')
        factory = subfolder1.manage_addProduct['Silva']
        with self.layer.open_fixture('test1.zip') as source:
            factory.manage_addFile('zipfile1.zip', 'Zip File', source)
            # After reading the file, position should be end of file
            zip1_size = source.tell()
        factory = folder2.manage_addProduct['Silva']
        with self.layer.open_fixture('torvald.jpg') as source:
            factory.manage_addImage('image1.jpg', 'Image File', source)
            image1_size = source.tell()

        # No counting should be done (extensions not activated)
        self.assertEqual(self.root.used_space, 0)
        self.assertEqual(folder1.used_space, 0)
        self.assertEqual(folder2.used_space, 0)

        # Activate the quota system
        self.root.service_extensions.enable_quota_subsystem()

        # Values should be updated
        self.assertEqual(self.root.used_space, zip1_size + image1_size)
        self.assertEqual(folder1.used_space, zip1_size)
        self.assertEqual(subfolder1.used_space, zip1_size)
        self.assertEqual(folder2.used_space, image1_size)

        # Disable
        self.root.service_extensions.disable_quota_subsystem()

        # Do some changes
        manager = IContainerManager(folder1)
        with manager.deleter() as deleter:
            deleter(folder1.subfolder)
        with manager.copier() as copier:
            copier(self.root.folder2)

        # Nothing had change
        self.assertEqual(self.root.used_space, zip1_size + image1_size)
        self.assertEqual(folder1.used_space, zip1_size)
        self.assertEqual(folder2.used_space, image1_size)

        # Re-enable
        self.root.service_extensions.enable_quota_subsystem()
        # Values should be updated
        self.assertEqual(self.root.used_space, (2 * image1_size))
        self.assertEqual(folder1.used_space, image1_size)
        self.assertEqual(folder2.used_space, image1_size)
    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_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_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_delete_published_recursive(self):
        """An author cannot delete a folder that contains published
        content.
        """
        manager = IContainerManager(self.root)

        with assertNotTriggersEvents('ObjectWillBeRemovedEvent',
                                     'ObjectRemovedEvent',
                                     'ContainerModifiedEvent'):
            with manager.deleter() as deleter:
                self.assertIsInstance(deleter(self.root.folder), ContentError)

        self.assertTrue('folder' in self.root.objectIds())
    def test_delete_published(self):
        """An author cannot delete published content.
        """
        manager = IContainerManager(self.root.folder)

        with assertNotTriggersEvents(
            'ObjectWillBeRemovedEvent',
            'ObjectRemovedEvent',
            'ContainerModifiedEvent'):
            with manager.deleter() as deleter:
                self.assertIsInstance(
                    deleter(self.root.folder.published_link),
                    ContentError)

        self.assertTrue('published_link' in self.root.folder.objectIds())
    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_delete_invalid(self):
        manager = IContainerManager(self.root.folder)

        with assertNotTriggersEvents('ObjectWillBeRemovedEvent',
                                     'ObjectRemovedEvent',
                                     'ContainerModifiedEvent'):
            with manager.deleter() as deleter:
                self.assertIsInstance(deleter(self.root.publication),
                                      ContentError)
                self.assertIsInstance(deleter(self.root.toc), ContentError)
                self.assertIsInstance(deleter(self.root.folder), ContentError)

        self.assertTrue('publication' in self.root.objectIds())
        self.assertTrue('toc' in self.root.objectIds())
        self.assertTrue('folder' in self.root.objectIds())
    def test_delete_invalid(self):
        manager = IContainerManager(self.root.folder)

        with assertNotTriggersEvents(
            'ObjectWillBeRemovedEvent',
            'ObjectRemovedEvent',
            'ContainerModifiedEvent'):
            with manager.deleter() as deleter:
                self.assertIsInstance(
                    deleter(self.root.publication),
                    ContentError)
                self.assertIsInstance(
                    deleter(self.root.toc),
                    ContentError)
                self.assertIsInstance(
                    deleter(self.root.folder),
                    ContentError)

        self.assertTrue('publication' in self.root.objectIds())
        self.assertTrue('toc' in self.root.objectIds())
        self.assertTrue('folder' in self.root.objectIds())
Beispiel #13
0
    def test_reference(self):
        """Test the reference created by the ghost.
        """
        factory = self.root.manage_addProduct['Silva']
        factory.manage_addGhost('ghost', None, haunted=self.root.document)

        ghost = self.root.ghost.get_editable()
        reference = getUtility(IReferenceService).get_reference(
            ghost, name=u"haunted")
        self.assertTrue(verifyObject(IReferenceValue, reference))
        self.assertEqual(aq_chain(reference.target),
                         aq_chain(self.root.document))
        self.assertEqual(aq_chain(reference.source), aq_chain(ghost))

        manager = IContainerManager(self.root)
        with manager.deleter() as deleter:
            deleter(self.root.document)

        reference = getUtility(IReferenceService).get_reference(
            ghost, name=u"haunted")
        self.assertEqual(reference, None)
Beispiel #14
0
    def test_ghost(self):
        """Test simple ghost creation and life time.
        """
        factory = self.root.manage_addProduct['Silva']
        factory.manage_addGhost('ghost', None, haunted=self.root.document)

        version = self.root.ghost.get_editable()
        self.assertTrue(verifyObject(IGhost, self.root.ghost))
        self.assertTrue(verifyObject(IGhostVersion, version))

        self.assertEqual(version.get_link_status(), None)
        self.assertEqual(version.get_haunted(), self.root.document)
        self.assertEqual(aq_chain(version.get_haunted()),
                         aq_chain(self.root.document))

        manager = IContainerManager(self.root)
        with manager.deleter() as deleter:
            deleter(self.root.document)

        self.assertEqual(version.get_haunted(), None)
        self.assertEqual(version.get_link_status(),
                         errors.EmptyInvalidTarget())
Beispiel #15
0
    def test_ghost(self):
        """Test simple ghost creation and life time.
        """
        factory = self.root.manage_addProduct['Silva']
        factory.manage_addGhost('ghost', None, haunted=self.root.document)

        version = self.root.ghost.get_editable()
        self.assertTrue(verifyObject(IGhost, self.root.ghost))
        self.assertTrue(verifyObject(IGhostVersion, version))

        self.assertEqual(version.get_link_status(), None)
        self.assertEqual(version.get_haunted(), self.root.document)
        self.assertEqual(
            aq_chain(version.get_haunted()),
            aq_chain(self.root.document))

        manager = IContainerManager(self.root)
        with manager.deleter() as deleter:
            deleter(self.root.document)

        self.assertEqual(version.get_haunted(), None)
        self.assertEqual(version.get_link_status(), errors.EmptyInvalidTarget())
Beispiel #16
0
    def test_reference(self):
        """Test the reference created by the ghost.
        """
        factory = self.root.manage_addProduct['Silva']
        factory.manage_addGhost('ghost', None, haunted=self.root.document)

        ghost = self.root.ghost.get_editable()
        reference = getUtility(IReferenceService).get_reference(
            ghost, name=u"haunted")
        self.assertTrue(verifyObject(IReferenceValue, reference))
        self.assertEqual(
            aq_chain(reference.target),
            aq_chain(self.root.document))
        self.assertEqual(
            aq_chain(reference.source),
            aq_chain(ghost))

        manager = IContainerManager(self.root)
        with manager.deleter() as deleter:
            deleter(self.root.document)

        reference = getUtility(IReferenceService).get_reference(
            ghost, name=u"haunted")
        self.assertEqual(reference, None)
    def test_folder_action(self):
        """Test that folder action update used space.
        Content structure:

        root
        |-- folder1
        |   `-- subfolder1
        |       `-- zipfile1.zip
        `-- folder2
            `-- image1.jpg
        """
        # XXX this big hugre
        factory = self.root.manage_addProduct['Silva']
        factory.manage_addFolder('folder1', 'FooFolder 1')
        factory.manage_addFolder('folder2', 'FooFolder 2')
        folder1 = self.root._getOb('folder1')
        folder2 = self.root._getOb('folder2')
        factory = folder1.manage_addProduct['Silva']
        factory.manage_addFolder('subfolder1', 'Sub FooFolder')
        subfolder1 = folder1._getOb('subfolder1')

        # By default, all used_space should be at 0
        self.assertEqual(self.root.used_space, 0)
        self.assertEqual(folder1.used_space, 0)
        self.assertEqual(subfolder1.used_space, 0)

        # Add a file
        factory = subfolder1.manage_addProduct['Silva']
        with self.layer.open_fixture('test2.zip') as source:
            factory.manage_addFile('file.zip', 'Zip File', source)
            zipfile_size = source.tell()
            zipfile = subfolder1._getOb('file.zip')

        self.assertTrue(verifyObject(IAsset, zipfile))
        self.assertEqual(zipfile.get_file_size(), zipfile_size)
        # And check used space
        self.assertEqual(subfolder1.used_space, zipfile_size)
        self.assertEqual(self.root.used_space, zipfile_size)

        # Change file data
        with self.layer.open_fixture('test1.zip') as source:
            zipfile.set_file(source)
            zipfile_size = source.tell()
        self.assertEqual(zipfile.get_file_size(), zipfile_size)
        # And check used space
        self.assertEqual(subfolder1.used_space, zipfile_size)
        self.assertEqual(self.root.used_space, zipfile_size)
        self.assertEqual(folder2.used_space, 0)

        # Add an image
        factory = folder2.manage_addProduct['Silva']
        with self.layer.open_fixture('torvald.jpg') as source:
            factory.manage_addImage('image1.jpg', 'Image File', source)
            image_size = source.tell()

        # Verify added image
        image = folder2._getOb('image1.jpg')
        self.assertTrue(verifyObject(IAsset, image))
        self.assertEqual(image.get_file_size(), image_size)
        # And check used space
        self.assertEqual(self.root.used_space, zipfile_size + image_size)
        self.assertEqual(folder2.used_space, image_size)
        # Change image and check size
        with self.layer.open_fixture('testimage.gif') as source:
            image.set_image(source)
            image_size = source.tell()
        # And check used space
        self.assertEqual(image.get_file_size(), image_size)
        self.assertEqual(subfolder1.used_space, zipfile_size)
        self.assertEqual(self.root.used_space, zipfile_size + image_size)
        self.assertEqual(folder2.used_space, image_size)

        # Try cut and paste
        manager2 = IContainerManager(folder2)
        with manager2.mover() as mover:
            mover(folder1['subfolder1'])

        # And check used space
        self.assertEqual(folder1.used_space, 0)
        self.assertEqual(self.root.used_space, zipfile_size + image_size)
        self.assertEqual(folder2.used_space, zipfile_size + image_size)

        # Try cut and ghost paste
        manager1 = IContainerManager(folder1)
        with manager1.ghoster() as ghoster:
            ghoster(folder2['subfolder1'])

        # And check used space. Ghost Assets don't use any quota.
        self.assertEqual(folder1.used_space, 0)
        self.assertEqual(self.root.used_space, zipfile_size + image_size)
        self.assertEqual(folder2.used_space, zipfile_size + image_size)

        # Delete the ghost
        with manager1.deleter() as deleter:
            deleter(folder1['subfolder1'])

        # And check used space
        self.assertEqual(folder1.used_space, 0)
        self.assertEqual(self.root.used_space, zipfile_size + image_size)
        self.assertEqual(folder2.used_space, zipfile_size + image_size)

        # Try copy and paste
        with manager1.copier() as copier:
            copier(folder2['image1.jpg'])

        # And check used space
        self.assertEqual(folder1.used_space, image_size)
        self.assertEqual(self.root.used_space, zipfile_size + (2 * image_size))
        self.assertEqual(folder2.used_space, zipfile_size + image_size)

        # Clean, and check each time
        manager = IContainerManager(self.root)
        with manager.deleter() as deleter:
            deleter(self.root['folder2'])
        self.assertEqual(self.root.used_space, image_size)
        with manager.deleter() as deleter:
            deleter(self.root['folder1'])
        self.assertEqual(self.root.used_space, 0)
    def test_folder_action(self):
        """Test that folder action update used space.
        Content structure:

        root
        |-- folder1
        |   `-- subfolder1
        |       `-- zipfile1.zip
        `-- folder2
            `-- image1.jpg
        """
        # XXX this big hugre
        factory = self.root.manage_addProduct['Silva']
        factory.manage_addFolder('folder1', 'FooFolder 1')
        factory.manage_addFolder('folder2', 'FooFolder 2')
        folder1 = self.root._getOb('folder1')
        folder2 = self.root._getOb('folder2')
        factory = folder1.manage_addProduct['Silva']
        factory.manage_addFolder('subfolder1', 'Sub FooFolder')
        subfolder1 = folder1._getOb('subfolder1')

        # By default, all used_space should be at 0
        self.assertEqual(self.root.used_space, 0)
        self.assertEqual(folder1.used_space, 0)
        self.assertEqual(subfolder1.used_space, 0)

        # Add a file
        factory = subfolder1.manage_addProduct['Silva']
        with self.layer.open_fixture('test2.zip') as source:
            factory.manage_addFile('file.zip', 'Zip File', source)
            zipfile_size = source.tell()
            zipfile = subfolder1._getOb('file.zip')

        self.assertTrue(verifyObject(IAsset, zipfile))
        self.assertEqual(zipfile.get_file_size(), zipfile_size)
        # And check used space
        self.assertEqual(subfolder1.used_space, zipfile_size)
        self.assertEqual(self.root.used_space, zipfile_size)

        # Change file data
        with self.layer.open_fixture('test1.zip') as source:
            zipfile.set_file(source)
            zipfile_size = source.tell()
        self.assertEqual(zipfile.get_file_size(), zipfile_size)
        # And check used space
        self.assertEqual(subfolder1.used_space, zipfile_size)
        self.assertEqual(self.root.used_space, zipfile_size)
        self.assertEqual(folder2.used_space, 0)

        # Add an image
        factory = folder2.manage_addProduct['Silva']
        with self.layer.open_fixture('torvald.jpg') as source:
            factory.manage_addImage('image1.jpg', 'Image File', source)
            image_size = source.tell()

        # Verify added image
        image = folder2._getOb('image1.jpg')
        self.assertTrue(verifyObject(IAsset, image))
        self.assertEqual(image.get_file_size(), image_size)
        # And check used space
        self.assertEqual(self.root.used_space, zipfile_size + image_size)
        self.assertEqual(folder2.used_space, image_size)
        # Change image and check size
        with self.layer.open_fixture('testimage.gif') as source:
            image.set_image(source)
            image_size = source.tell()
        # And check used space
        self.assertEqual(image.get_file_size(), image_size)
        self.assertEqual(subfolder1.used_space, zipfile_size)
        self.assertEqual(self.root.used_space, zipfile_size + image_size)
        self.assertEqual(folder2.used_space, image_size)

        # Try cut and paste
        manager2 = IContainerManager(folder2)
        with manager2.mover() as mover:
            mover(folder1['subfolder1'])

        # And check used space
        self.assertEqual(folder1.used_space, 0)
        self.assertEqual(self.root.used_space, zipfile_size + image_size)
        self.assertEqual(folder2.used_space, zipfile_size + image_size)

        # Try cut and ghost paste
        manager1 = IContainerManager(folder1)
        with manager1.ghoster() as ghoster:
            ghoster(folder2['subfolder1'])

        # And check used space. Ghost Assets don't use any quota.
        self.assertEqual(folder1.used_space, 0)
        self.assertEqual(self.root.used_space, zipfile_size + image_size)
        self.assertEqual(folder2.used_space, zipfile_size + image_size)

        # Delete the ghost
        with manager1.deleter() as deleter:
            deleter(folder1['subfolder1'])

        # And check used space
        self.assertEqual(folder1.used_space, 0)
        self.assertEqual(self.root.used_space, zipfile_size + image_size)
        self.assertEqual(folder2.used_space, zipfile_size + image_size)

        # Try copy and paste
        with manager1.copier() as copier:
            copier(folder2['image1.jpg'])

        # And check used space
        self.assertEqual(folder1.used_space, image_size)
        self.assertEqual(self.root.used_space, zipfile_size + (2 * image_size))
        self.assertEqual(folder2.used_space, zipfile_size + image_size)

        # Clean, and check each time
        manager = IContainerManager(self.root)
        with manager.deleter() as deleter:
            deleter(self.root['folder2'])
        self.assertEqual(self.root.used_space, image_size)
        with manager.deleter() as deleter:
            deleter(self.root['folder1'])
        self.assertEqual(self.root.used_space, 0)