[silva.core.editor][Sylvain Viollon] Test various scenarios with...

[email protected] Tue, 12 Nov 2013 15:24:50 +0100
Newsgroups gmane.comp.web.zope.silva.cvs
Message-ID <[email protected]>
author:    Sylvain Viollon
date:      Tue Nov 12 15:24:46 2013 +0100
revision:  274:6e808352342a in silva.core.editor
branch:    
details:   https://hg.infrae.com/silva.core.editor?cmd=changeset;node=6e808352342a
modified:  src/silva/core/editor/tests/test_transform_input_image.py src/silva/core/editor/tests/test_transform_output_image.py src/silva/core/editor/transform/editor/input.py
added:     
removed:   
log:       Test various scenarios with broken images (i.e. not images).


diffstat:

 src/silva/core/editor/tests/test_transform_input_image.py  |  124 ++++++++++++-
 src/silva/core/editor/tests/test_transform_output_image.py |    2 +-
 src/silva/core/editor/transform/editor/input.py            |   17 +-
 3 files changed, 134 insertions(+), 9 deletions(-)

diffs (188 lines):

diff -r 41a768839543 -r 6e808352342a src/silva/core/editor/tests/test_transform_input_image.py
--- a/src/silva/core/editor/tests/test_transform_input_image.py	Mon Nov 11 14:49:55 2013 +0100
+++ b/src/silva/core/editor/tests/test_transform_input_image.py	Tue Nov 12 15:24:46 2013 +0100
@@ -155,6 +155,126 @@
 </div>
 """ % (reference_name, target_id))
 
+    def test_edit_broken_reference_image(self):
+        """On input, broken references for images are replaced with a
+        broken logo. The reference 0 is used to identify them.
+        """
+
+        version = self.root.document.get_editable()
+        service = getUtility(IReferenceService)
+        reference = service.new_reference(version, name=u"test image")
+        reference.add_tag(u"original-image-id")
+        # Reference target is not set.
+
+        # Now if we display this in the editor we get a broken image:
+        intern_format = """
+<div>
+  <p>Some description about the world</p>
+  <div class="image">
+    <img alt="image"
+         reference="original-image-id" />
+  </div>
+</div>
+"""
+        extern_format = self.transform(intern_format, IInputEditorFilter)
+        self.assertXMLEqual(
+            extern_format, """
+<div>
+  <p>Some description about the world</p>
+  <div class="image">
+    <img alt="image"
+         data-silva-reference="original-image-id"
+         data-silva-target="0"
+         src="./++static++/silva.core.editor/broken-link.jpg"></img>
+  </div>
+</div>
+""")
+
+        # Now if we save it, we get back the original format. The
+        # reference is preserved.
+        saved_format = self.transform(extern_format, ISaveEditorFilter)
+        saved_references = list(service.get_references_from(version))
+        self.assertEqual(len(saved_references), 1)
+        saved_reference = saved_references[0]
+        self.assertEqual(saved_reference.source, version)
+        self.assertIs(saved_reference.target, None)
+        self.assertEqual(
+            saved_reference.tags,
+            [u"test image", u"original-image-id"])
+        self.assertXMLEqual(
+            saved_format, """
+<div>
+  <p>Some description about the world</p>
+  <div class="image">
+    <img alt="image"
+         reference="original-image-id" />
+  </div>
+</div>
+""")
+
+    def test_edit_invalid_reference_image(self):
+        """On input, images that doesn't point to an includable image
+        content uses a broken logo as image source (but the reference
+        is kept).
+        """
+        with self.layer.open_fixture('chocobo.png') as stream:
+            factory = self.root.manage_addProduct['Silva']
+            factory.manage_addFile('peco', 'Peco Peco', stream)
+            factory.manage_addGhostAsset('image', None, haunted=self.root.peco)
+
+        version = self.root.document.get_editable()
+        service = getUtility(IReferenceService)
+        reference = service.new_reference(version, name=u"test image")
+        reference.set_target(self.root.image)
+        reference.add_tag(u"original-image-id")
+        target_id = get_content_id(self.root.image)
+
+        # Now if we display this in the editor we get a broken image:
+        self.assertXMLEqual(
+            self.transform("""
+<div>
+  <p>Some description about the world</p>
+  <div class="image">
+    <img alt="image"
+         reference="original-image-id" />
+  </div>
+</div>
+""", IInputEditorFilter), """
+<div>
+  <p>Some description about the world</p>
+  <div class="image">
+    <img alt="image"
+         data-silva-reference="original-image-id"
+         data-silva-target="%s"
+         src="./++static++/silva.core.editor/broken-link.jpg"></img>
+  </div>
+</div>
+""" % (target_id))
+
+        # If you fix the ghost to an image, everything works:
+        reference.set_target(self.root.chocobo)
+        target_id = get_content_id(self.root.chocobo)
+        self.assertXMLEqual(
+            self.transform("""
+<div>
+  <p>Some description about the world</p>
+  <div class="image">
+    <img alt="image"
+         reference="original-image-id" />
+  </div>
+</div>
+""", IInputEditorFilter), """
+<div>
+  <p>Some description about the world</p>
+  <div class="image">
+    <img alt="image"
+         data-silva-reference="original-image-id"
+         data-silva-target="%s"
+         src="http://localhost/root/chocobo"></img>
+  </div>
+</div>
+""" % (target_id))
+
     def test_edit_reference_image(self):
         """On input, updated local images update their references.
         """
@@ -165,7 +285,9 @@
         reference.add_tag(u"original-image-id")
         target_id = get_content_id(self.root.chocobo)
         # So we have a reference, the one we will edit
-        self.assertEqual(list(service.get_references_from(version)), [reference])
+        self.assertEqual(
+            list(service.get_references_from(version)),
+            [reference])
 
         intern_format = self.transform(
             """
diff -r 41a768839543 -r 6e808352342a src/silva/core/editor/tests/test_transform_output_image.py
--- a/src/silva/core/editor/tests/test_transform_output_image.py	Mon Nov 11 14:49:55 2013 +0100
+++ b/src/silva/core/editor/tests/test_transform_output_image.py	Tue Nov 12 15:24:46 2013 +0100
@@ -327,7 +327,7 @@
             actual_image_block = self.transform(editor_image_block,
                                                 ISaveEditorFilter)
 
-            expected_image_block = """"""
+            expected_image_block = ""
 
             self.assertXMLEqual(expected_image_block, actual_image_block)
 
diff -r 41a768839543 -r 6e808352342a src/silva/core/editor/transform/editor/input.py
--- a/src/silva/core/editor/transform/editor/input.py	Mon Nov 11 14:49:55 2013 +0100
+++ b/src/silva/core/editor/transform/editor/input.py	Tue Nov 12 15:24:46 2013 +0100
@@ -5,6 +5,8 @@
 from five import grok
 from zope.traversing.browser import absoluteURL
 
+from silva.core.interfaces import IImageIncluable
+
 from ..base import ReferenceTransformationFilter, TransformationFilter
 from ..interfaces import IInputEditorFilter
 
@@ -79,14 +81,15 @@
             if 'reference' in image.attrib:
                 name, reference = self.get_reference(image.attrib['reference'])
                 if reference is not None:
+                    target_id = '0'
+                    url = './++static++/silva.core.editor/broken-link.jpg'
+                    if reference.target_id:
+                        target_id = str(reference.target_id)
+                        target = reference.target
+                        if IImageIncluable.providedBy(target):
+                            url = absoluteURL(target, self.request)
                     image.attrib['data-silva-reference'] = name
-                    if reference.target_id:
-                        target = str(reference.target_id)
-                        url = absoluteURL(reference.target, self.request)
-                    else:
-                        target = '0'
-                        url = './++static++/silva.core.editor/broken-link.jpg'
-                    image.attrib['data-silva-target'] = target
+                    image.attrib['data-silva-target'] = target_id
                     image.attrib['src'] = url
                     del image.attrib['reference']
             elif 'src' in image.attrib: