|
@@ -15,6 +15,8 @@ from .utils import (
|
|
|
|
|
|
|
|
|
class JinjaImagesTestCase(TestCase):
|
|
|
+ maxDiff = None
|
|
|
+
|
|
|
def setUp(self):
|
|
|
self.engine = engines["jinja2"]
|
|
|
|
|
@@ -49,6 +51,10 @@ class TestImageJinja(JinjaImagesTestCase):
|
|
|
),
|
|
|
)
|
|
|
|
|
|
+ def test_no_image(self):
|
|
|
+ rendered = self.render('{{ image(myimage, "width-2") }}', {"myimage": None})
|
|
|
+ self.assertEqual(rendered, "")
|
|
|
+
|
|
|
def test_image_attributes(self):
|
|
|
self.assertHTMLEqual(
|
|
|
self.render(
|
|
@@ -159,6 +165,12 @@ class TestSrcsetImageJinja(JinjaImagesTestCase):
|
|
|
"""
|
|
|
self.assertHTMLEqual(rendered, expected)
|
|
|
|
|
|
+ def test_no_image(self):
|
|
|
+ rendered = self.render(
|
|
|
+ '{{ srcset_image(myimage, "width-2") }}', {"myimage": None}
|
|
|
+ )
|
|
|
+ self.assertEqual(rendered, "")
|
|
|
+
|
|
|
def test_srcset_output_single_image(self):
|
|
|
self.assertHTMLEqual(
|
|
|
self.render(
|
|
@@ -185,21 +197,14 @@ class TestSrcsetImageJinja(JinjaImagesTestCase):
|
|
|
self.assertHTMLEqual(rendered, expected)
|
|
|
|
|
|
def test_srcset_image_assignment_render_as_is(self):
|
|
|
- filename_200 = get_test_image_filename(self.image, "width-200")
|
|
|
- filename_400 = get_test_image_filename(self.image, "width-400")
|
|
|
rendered = self.render(
|
|
|
'{% set bg=srcset_image(myimage, "width-{200,400}") %}{{ bg }}',
|
|
|
{"myimage": self.image},
|
|
|
)
|
|
|
- expected = f"""
|
|
|
- <img
|
|
|
- src="{filename_200}"
|
|
|
- srcset="{filename_200} 200w, {filename_400} 400w"
|
|
|
- alt="Test image"
|
|
|
- width="200"
|
|
|
- height="150"
|
|
|
- >
|
|
|
- """
|
|
|
+ expected = self.render(
|
|
|
+ '{{ srcset_image(myimage, "width-{200,400}") }}',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
self.assertHTMLEqual(rendered, expected)
|
|
|
|
|
|
def test_missing_srcset_image(self):
|
|
@@ -272,3 +277,186 @@ class TestSrcsetImageJinja(JinjaImagesTestCase):
|
|
|
>
|
|
|
"""
|
|
|
self.assertHTMLEqual(rendered, expected)
|
|
|
+
|
|
|
+
|
|
|
+class TestPictureJinja(JinjaImagesTestCase):
|
|
|
+ def test_picture_formats_multi_sizes(self):
|
|
|
+ filenames = [
|
|
|
+ get_test_image_filename(self.image, "width-200.format-jpeg"),
|
|
|
+ get_test_image_filename(self.image, "width-400.format-jpeg"),
|
|
|
+ get_test_image_filename(self.image, "width-200.format-webp"),
|
|
|
+ get_test_image_filename(self.image, "width-400.format-webp"),
|
|
|
+ get_test_image_filename(self.image, "width-200.format-gif"),
|
|
|
+ get_test_image_filename(self.image, "width-400.format-gif"),
|
|
|
+ ]
|
|
|
+
|
|
|
+ rendered = self.render(
|
|
|
+ '{{ picture(myimage, "width-{200,400}|format-{jpeg,webp,gif}", sizes="100vw") }}',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
+ expected = f"""
|
|
|
+ <picture>
|
|
|
+ <source srcset="{filenames[2]} 200w, {filenames[3]} 400w" sizes="100vw" type="image/webp">
|
|
|
+ <source srcset="{filenames[0]} 200w, {filenames[1]} 400w" sizes="100vw" type="image/jpeg">
|
|
|
+ <img
|
|
|
+ sizes="100vw"
|
|
|
+ src="{filenames[4]}"
|
|
|
+ srcset="{filenames[4]} 200w, {filenames[5]} 400w"
|
|
|
+ alt="Test image"
|
|
|
+ width="200"
|
|
|
+ height="150"
|
|
|
+ >
|
|
|
+ </picture>
|
|
|
+ """
|
|
|
+ self.assertHTMLEqual(rendered, expected)
|
|
|
+
|
|
|
+ def test_picture_formats_only(self):
|
|
|
+ filename_jpeg = get_test_image_filename(self.image, "format-jpeg")
|
|
|
+ filename_webp = get_test_image_filename(self.image, "format-webp")
|
|
|
+
|
|
|
+ rendered = self.render(
|
|
|
+ '{{ picture(myimage, "format-{jpeg,webp}") }}',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
+ expected = f"""
|
|
|
+ <picture>
|
|
|
+ <source srcset="{filename_webp}" type="image/webp">
|
|
|
+ <img
|
|
|
+ src="{filename_jpeg}"
|
|
|
+ alt="Test image"
|
|
|
+ width="640"
|
|
|
+ height="480"
|
|
|
+ >
|
|
|
+ </picture>
|
|
|
+ """
|
|
|
+ self.assertHTMLEqual(rendered, expected)
|
|
|
+
|
|
|
+ def test_picture_sizes_only(self):
|
|
|
+ rendered = self.render(
|
|
|
+ '{{ picture(myimage, "width-{200,400}", sizes="100vw") }}',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
+ expected = self.render(
|
|
|
+ '<picture>{{ srcset_image(myimage, "width-{200,400}", sizes="100vw") }}</picture>',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
+ self.assertHTMLEqual(rendered, expected)
|
|
|
+
|
|
|
+ def test_picture_single_format(self):
|
|
|
+ rendered = self.render(
|
|
|
+ '{{ picture(myimage, "format-jpeg") }}',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
+ expected = self.render(
|
|
|
+ '<picture>{{ image(myimage, "format-jpeg") }}</picture>',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
+ self.assertHTMLEqual(rendered, expected)
|
|
|
+
|
|
|
+ def test_no_image(self):
|
|
|
+ rendered = self.render('{{ picture(myimage, "width-2") }}', {"myimage": None})
|
|
|
+ self.assertEqual(rendered, "")
|
|
|
+
|
|
|
+ def test_picture_assignment(self):
|
|
|
+ template = (
|
|
|
+ '{% set bg=picture(myimage, "width-{200,400}|format-{jpeg,webp}") %}'
|
|
|
+ "width: {{ bg.formats['jpeg'][0].width }}, url: {{ bg.formats['jpeg'][0].url }} "
|
|
|
+ "width: {{ bg.formats['jpeg'][1].width }}, url: {{ bg.formats['jpeg'][1].url }} "
|
|
|
+ "width: {{ bg.formats['webp'][0].width }}, url: {{ bg.formats['webp'][0].url }} "
|
|
|
+ "width: {{ bg.formats['webp'][1].width }}, url: {{ bg.formats['webp'][1].url }} "
|
|
|
+ )
|
|
|
+ rendered = self.render(template, {"myimage": self.image})
|
|
|
+ expected = f"""
|
|
|
+ width: 200, url: {get_test_image_filename(self.image, "width-200.format-jpeg")}
|
|
|
+ width: 400, url: {get_test_image_filename(self.image, "width-400.format-jpeg")}
|
|
|
+ width: 200, url: {get_test_image_filename(self.image, "width-200.format-webp")}
|
|
|
+ width: 400, url: {get_test_image_filename(self.image, "width-400.format-webp")}
|
|
|
+ """
|
|
|
+ self.assertHTMLEqual(rendered, expected)
|
|
|
+
|
|
|
+ def test_picture_assignment_render_as_is(self):
|
|
|
+ rendered = self.render(
|
|
|
+ '{% set bg=picture(myimage, "width-{200,400}|format-{jpeg,webp,gif}", sizes="100vw") %}{{ bg }}',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
+ expected = self.render(
|
|
|
+ '{{ picture(myimage, "width-{200,400}|format-{jpeg,webp,gif}", sizes="100vw") }}',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
+ self.assertHTMLEqual(rendered, expected)
|
|
|
+
|
|
|
+ def test_missing_picture(self):
|
|
|
+ rendered = self.render(
|
|
|
+ '{{ picture(myimage, "format-{jpeg,webp}") }}',
|
|
|
+ {"myimage": self.bad_image},
|
|
|
+ )
|
|
|
+ expected = """
|
|
|
+ <picture>
|
|
|
+ <source srcset="/media/not-found" type="image/webp">
|
|
|
+ <img
|
|
|
+ src="/media/not-found"
|
|
|
+ alt="missing image"
|
|
|
+ width="0"
|
|
|
+ height="0"
|
|
|
+ >
|
|
|
+ </picture>
|
|
|
+ """
|
|
|
+ self.assertHTMLEqual(rendered, expected)
|
|
|
+
|
|
|
+ def test_invalid_character(self):
|
|
|
+ with self.assertRaisesRegex(
|
|
|
+ TemplateSyntaxError, "filter specs in 'picture' tag may only"
|
|
|
+ ):
|
|
|
+ self.render(
|
|
|
+ '{{ picture(myimage, "fill-{20×20,40×40}", sizes="100vw") }}',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_custom_default_attrs(self):
|
|
|
+ with unittest.mock.patch.object(
|
|
|
+ apps.get_app_config("wagtailimages"),
|
|
|
+ "default_attrs",
|
|
|
+ new={"decoding": "async", "loading": "lazy"},
|
|
|
+ ):
|
|
|
+ rendered = self.render(
|
|
|
+ '{{ picture(myimage, "format-{jpeg,webp}") }}',
|
|
|
+ {"myimage": self.bad_image},
|
|
|
+ )
|
|
|
+ expected = """
|
|
|
+ <picture>
|
|
|
+ <source srcset="/media/not-found" type="image/webp">
|
|
|
+ <img
|
|
|
+ src="/media/not-found"
|
|
|
+ alt="missing image"
|
|
|
+ width="0"
|
|
|
+ height="0"
|
|
|
+ decoding="async"
|
|
|
+ loading="lazy"
|
|
|
+ >
|
|
|
+ </picture>
|
|
|
+ """
|
|
|
+ self.assertHTMLEqual(rendered, expected)
|
|
|
+
|
|
|
+ def test_chaining_filterspecs(self):
|
|
|
+ filename_jpeg = get_test_image_filename(
|
|
|
+ self.image, "format-jpeg.jpegquality-40.webpquality-40"
|
|
|
+ )
|
|
|
+ filename_webp = get_test_image_filename(
|
|
|
+ self.image, "format-webp.jpegquality-40.webpquality-40"
|
|
|
+ )
|
|
|
+ rendered = self.render(
|
|
|
+ '{{ picture(myimage, "format-{jpeg,webp}|jpegquality-40|webpquality-40") }}',
|
|
|
+ {"myimage": self.image},
|
|
|
+ )
|
|
|
+ expected = f"""
|
|
|
+ <picture>
|
|
|
+ <source srcset="{filename_webp}" type="image/webp">
|
|
|
+ <img
|
|
|
+ src="{filename_jpeg}"
|
|
|
+ alt="Test image"
|
|
|
+ width="640"
|
|
|
+ height="480"
|
|
|
+ >
|
|
|
+ </picture>
|
|
|
+ """
|
|
|
+ self.assertHTMLEqual(rendered, expected)
|