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 #}
"""
)
(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 (
"""
""".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