diff options
| author | Johannes Maron <johannes@maron.family> | 2024-11-07 10:21:25 +0100 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2025-01-02 13:08:13 +0100 |
| commit | 989329344aabe8ef7a5e55bebfde53f0e00f42e2 (patch) | |
| tree | d2a8ea553450ecd97cb415d445980e70b199e266 /tests/forms_tests | |
| parent | b322319f9d779b8726436421daae2862a380061d (diff) | |
Fixed #35886 -- Added support for object-based form media script assets.
Diffstat (limited to 'tests/forms_tests')
| -rw-r--r-- | tests/forms_tests/tests/test_media.py | 188 |
1 files changed, 112 insertions, 76 deletions
diff --git a/tests/forms_tests/tests/test_media.py b/tests/forms_tests/tests/test_media.py index 061adc09ca..9f6b15074c 100644 --- a/tests/forms_tests/tests/test_media.py +++ b/tests/forms_tests/tests/test_media.py @@ -1,8 +1,94 @@ from django.forms import CharField, Form, Media, MultiWidget, TextInput +from django.forms.widgets import MediaAsset, Script from django.template import Context, Template -from django.templatetags.static import static from django.test import SimpleTestCase, override_settings -from django.utils.html import format_html, html_safe +from django.utils.html import html_safe + + +class CSS(MediaAsset): + element_template = '<link href="{path}"{attributes}>' + + def __init__(self, href, **attributes): + super().__init__(href, **attributes) + self.attributes["rel"] = "stylesheet" + + +@override_settings(STATIC_URL="http://media.example.com/static/") +class MediaAssetTestCase(SimpleTestCase): + def test_init(self): + attributes = {"media": "all", "is": "magic-css"} + asset = MediaAsset("path/to/css", **attributes) + self.assertEqual(asset._path, "path/to/css") + self.assertEqual(asset.attributes, attributes) + self.assertIsNot(asset.attributes, attributes) + + def test_eq(self): + self.assertEqual(MediaAsset("path/to/css"), MediaAsset("path/to/css")) + self.assertEqual(MediaAsset("path/to/css"), "path/to/css") + self.assertEqual( + MediaAsset("path/to/css", media="all"), MediaAsset("path/to/css") + ) + + self.assertNotEqual(MediaAsset("path/to/css"), MediaAsset("path/to/other.css")) + self.assertNotEqual(MediaAsset("path/to/css"), "path/to/other.css") + self.assertNotEqual(MediaAsset("path/to/css", media="all"), CSS("path/to/css")) + + def test_hash(self): + self.assertEqual(hash(MediaAsset("path/to/css")), hash("path/to/css")) + self.assertEqual( + hash(MediaAsset("path/to/css")), hash(MediaAsset("path/to/css")) + ) + + def test_str(self): + self.assertEqual( + str(MediaAsset("path/to/css")), + "http://media.example.com/static/path/to/css", + ) + self.assertEqual( + str(MediaAsset("http://media.other.com/path/to/css")), + "http://media.other.com/path/to/css", + ) + + def test_repr(self): + self.assertEqual(repr(MediaAsset("path/to/css")), "MediaAsset('path/to/css')") + self.assertEqual( + repr(MediaAsset("http://media.other.com/path/to/css")), + "MediaAsset('http://media.other.com/path/to/css')", + ) + + def test_path(self): + asset = MediaAsset("path/to/css") + self.assertEqual(asset.path, "http://media.example.com/static/path/to/css") + + asset = MediaAsset("http://media.other.com/path/to/css") + self.assertEqual(asset.path, "http://media.other.com/path/to/css") + + asset = MediaAsset("https://secure.other.com/path/to/css") + self.assertEqual(asset.path, "https://secure.other.com/path/to/css") + + asset = MediaAsset("/absolute/path/to/css") + self.assertEqual(asset.path, "/absolute/path/to/css") + + asset = MediaAsset("//absolute/path/to/css") + self.assertEqual(asset.path, "//absolute/path/to/css") + + +@override_settings(STATIC_URL="http://media.example.com/static/") +class ScriptTestCase(SimpleTestCase): + def test_init_with_src_kwarg(self): + self.assertEqual( + Script(src="path/to/js").path, "http://media.example.com/static/path/to/js" + ) + + def test_str(self): + self.assertHTMLEqual( + str(Script("path/to/js")), + '<script src="http://media.example.com/static/path/to/js"></script>', + ) + self.assertHTMLEqual( + str(Script("path/to/js", **{"async": True, "deferred": False})), + '<script src="http://media.example.com/static/path/to/js" async></script>', + ) @override_settings( @@ -714,63 +800,6 @@ class FormsMediaTestCase(SimpleTestCase): self.assertEqual(merged._js_lists, [["a"]]) -@html_safe -class Asset: - def __init__(self, path): - self.path = path - - def __eq__(self, other): - return (self.__class__ == other.__class__ and self.path == other.path) or ( - other.__class__ == str and self.path == other - ) - - def __hash__(self): - return hash(self.path) - - def __str__(self): - return self.absolute_path(self.path) - - def absolute_path(self, path): - """ - Given a relative or absolute path to a static asset, return an absolute - path. An absolute path will be returned unchanged while a relative path - will be passed to django.templatetags.static.static(). - """ - if path.startswith(("http://", "https://", "/")): - return path - return static(path) - - def __repr__(self): - return f"{self.path!r}" - - -class CSS(Asset): - def __init__(self, path, medium): - super().__init__(path) - self.medium = medium - - def __str__(self): - path = super().__str__() - return format_html( - '<link href="{}" media="{}" rel="stylesheet">', - self.absolute_path(path), - self.medium, - ) - - -class JS(Asset): - def __init__(self, path, integrity=None): - super().__init__(path) - self.integrity = integrity or "" - - def __str__(self, integrity=None): - path = super().__str__() - template = '<script src="{}"%s></script>' % ( - ' integrity="{}"' if self.integrity else "{}" - ) - return format_html(template, self.absolute_path(path), self.integrity) - - @override_settings( STATIC_URL="http://media.example.com/static/", ) @@ -779,17 +808,22 @@ class FormsMediaObjectTestCase(SimpleTestCase): def test_construction(self): m = Media( - css={"all": (CSS("path/to/css1", "all"), CSS("/path/to/css2", "all"))}, + css={ + "all": ( + CSS("path/to/css1", media="all"), + CSS("/path/to/css2", media="all"), + ) + }, js=( - JS("/path/to/js1"), - JS("http://media.other.com/path/to/js2"), - JS( + Script("/path/to/js1"), + Script("http://media.other.com/path/to/js2"), + Script( "https://secure.other.com/path/to/js3", integrity="9d947b87fdeb25030d56d01f7aa75800", ), ), ) - self.assertEqual( + self.assertHTMLEqual( str(m), '<link href="http://media.example.com/static/path/to/css1" media="all" ' 'rel="stylesheet">\n' @@ -801,9 +835,9 @@ class FormsMediaObjectTestCase(SimpleTestCase): ) self.assertEqual( repr(m), - "Media(css={'all': ['path/to/css1', '/path/to/css2']}, " - "js=['/path/to/js1', 'http://media.other.com/path/to/js2', " - "'https://secure.other.com/path/to/js3'])", + "Media(css={'all': [CSS('path/to/css1'), CSS('/path/to/css2')]}, " + "js=[Script('/path/to/js1'), Script('http://media.other.com/path/to/js2'), " + "Script('https://secure.other.com/path/to/js3')])", ) def test_simplest_class(self): @@ -823,22 +857,24 @@ class FormsMediaObjectTestCase(SimpleTestCase): def test_combine_media(self): class MyWidget1(TextInput): class Media: - css = {"all": (CSS("path/to/css1", "all"), "/path/to/css2")} + css = {"all": (CSS("path/to/css1", media="all"), "/path/to/css2")} js = ( "/path/to/js1", "http://media.other.com/path/to/js2", "https://secure.other.com/path/to/js3", - JS("/path/to/js4", integrity="9d947b87fdeb25030d56d01f7aa75800"), + Script( + "/path/to/js4", integrity="9d947b87fdeb25030d56d01f7aa75800" + ), ) class MyWidget2(TextInput): class Media: - css = {"all": (CSS("/path/to/css2", "all"), "/path/to/css3")} - js = (JS("/path/to/js1"), "/path/to/js4") + css = {"all": (CSS("/path/to/css2", media="all"), "/path/to/css3")} + js = (Script("/path/to/js1"), "/path/to/js4") w1 = MyWidget1() w2 = MyWidget2() - self.assertEqual( + self.assertHTMLEqual( str(w1.media + w2.media), '<link href="http://media.example.com/static/path/to/css1" media="all" ' 'rel="stylesheet">\n' @@ -857,14 +893,14 @@ class FormsMediaObjectTestCase(SimpleTestCase): media = Media( css={ "all": ( - CSS("/path/to/css1", "all"), - CSS("/path/to/css1", "all"), + CSS("/path/to/css1", media="all"), + CSS("/path/to/css1", media="all"), "/path/to/css1", ) }, - js=(JS("/path/to/js1"), JS("/path/to/js1"), "/path/to/js1"), + js=(Script("/path/to/js1"), Script("/path/to/js1"), "/path/to/js1"), ) - self.assertEqual( + self.assertHTMLEqual( str(media), '<link href="/path/to/css1" media="all" rel="stylesheet">\n' '<script src="/path/to/js1"></script>', |
