from pathlib import Path import jinja2 import pytest from markupsafe import Markup @pytest.mark.parametrize("undefined", [jinja2.Undefined, jinja2.StrictUndefined]) @pytest.mark.parametrize("autoescape", [True, False]) def test_render_assets(catalog, folder, autoescape, undefined): catalog.jinja_env.autoescape = autoescape catalog.jinja_env.undefined = undefined (folder / "Greeting.jinja").write_text( """ {#def message #} {#css greeting.css, http://example.com/super.css #} {#js greeting.js #}
{{ message }}
""" ) (folder / "Card.jinja").write_text( """ {#css https://somewhere.com/style.css, card.css #} {#js card.js, shared.js #}
{{ content }}
""" ) (folder / "Layout.jinja").write_text( """ {{ catalog.render_assets() }} {{ content }} """ ) (folder / "Page.jinja").write_text( """ {#def message #} {#js https://somewhere.com/blabla.js, shared.js #} """ ) html = catalog.render("Page", message="Hello") print(html) assert ( """
Hello
""".strip() in html ) @pytest.mark.parametrize("undefined", [jinja2.Undefined, jinja2.StrictUndefined]) @pytest.mark.parametrize("autoescape", [True, False]) def test_cleanup_assets(catalog, folder, autoescape, undefined): catalog.jinja_env.autoescape = autoescape catalog.jinja_env.undefined = undefined (folder / "Layout.jinja").write_text(""" {{ catalog.render_assets() }} {{ content }} """) (folder / "Foo.jinja").write_text(""" {#js foo.js #}

Foo

""") (folder / "Bar.jinja").write_text(""" {#js bar.js #}

Bar

""") html = catalog.render("Foo") print(html, "\n") assert ( """

Foo

""".strip() in html ) html = catalog.render("Bar") print(html) assert ( """

Bar

""".strip() in html ) @pytest.mark.parametrize("undefined", [jinja2.Undefined, jinja2.StrictUndefined]) @pytest.mark.parametrize("autoescape", [True, False]) def test_fingerprint_assets(catalog, folder: Path, autoescape, undefined): catalog.jinja_env.autoescape = autoescape catalog.jinja_env.undefined = undefined (folder / "Layout.jinja").write_text(""" {{ catalog.render_assets() }} {{ content }} """) (folder / "Page.jinja").write_text(""" {#css app.css, http://example.com/super.css #} {#js app.js #} Hi """) (folder / "app.css").write_text("...") catalog.fingerprint = True html = catalog.render("Page", message="Hello") print(html) assert 'src="/static/components/app.js"' in html assert 'href="/static/components/app-' in html assert 'href="http://example.com/super.css' in html @pytest.mark.parametrize("undefined", [jinja2.Undefined, jinja2.StrictUndefined]) @pytest.mark.parametrize("autoescape", [True, False]) def test_auto_load_assets_with_same_name(catalog, folder, autoescape, undefined): catalog.jinja_env.autoescape = autoescape catalog.jinja_env.undefined = undefined (folder / "Layout.jinja").write_text( """{{ catalog.render_assets() }}\n{{ content }}""" ) (folder / "FooBar.css").touch() (folder / "common").mkdir() (folder / "common" / "Form.jinja").write_text( """ {#js "shared.js" #}
""" ) (folder / "common" / "Form.css").touch() (folder / "common" / "Form.js").touch() (folder / "Page.jinja").write_text( """ {#css "Page.css" #} """ ) (folder / "Page.css").touch() (folder / "Page.js").touch() html = catalog.render("Page") print(html) expected = """
""".strip() assert html == Markup(expected) @pytest.mark.parametrize("undefined", [jinja2.Undefined, jinja2.StrictUndefined]) @pytest.mark.parametrize("autoescape", [True, False]) def test_auto_load_assets_for_kebab_cased_names(catalog, folder, autoescape, undefined): catalog.jinja_env.autoescape = autoescape catalog.jinja_env.undefined = undefined (folder / "Layout.jinja").write_text( """{{ catalog.render_assets() }}\n{{ content }}""" ) (folder / "my-component.jinja").write_text("") (folder / "my-component.css").touch() (folder / "my-component.js").touch() (folder / "page.jinja").write_text("") html = catalog.render("Page") print(html) assert "/static/components/my-component.css" in html assert "/static/components/my-component.js" in html