1
0
Fork 0
jinjax/tests/test_component.py
Daniel Baumann eb42e29864
Adding upstream version 0.45+dfsg.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-02-05 18:41:31 +01:00

315 lines
7.3 KiB
Python

import pytest
from jinjax import Component, DuplicateDefDeclaration, InvalidArgument
def test_load_args():
com = Component(
name="Test.jinja",
source='{#def message, lorem=4, ipsum="bar" -#}\n',
)
assert com.required == ["message"]
assert com.optional == {
"lorem": 4,
"ipsum": "bar",
}
def test_expression_args():
com = Component(
name="Test.jinja",
source="{#def expr=1 + 2 + 3, a=1 -#}\n",
)
assert com.required == []
assert com.optional == {
"expr": 6,
"a": 1,
}
def test_dict_args():
com = Component(
name="Test.jinja",
source="{#def expr={'a': 'b', 'c': 'd'} -#}\n",
)
assert com.optional == {
"expr": {"a": "b", "c": "d"},
}
com = Component(
name="Test.jinja",
source='{#def a=1, expr={"a": "b", "c": "d"} -#}\n',
)
assert com.optional == {
"a": 1,
"expr": {"a": "b", "c": "d"},
}
def test_lowercase_booleans():
com = Component(
name="Test.jinja",
source="{#def a=false, b=true -#}\n",
)
assert com.optional == {
"a": False,
"b": True,
}
def test_no_args():
com = Component(
name="Test.jinja",
source="\n",
)
assert com.required == []
assert com.optional == {}
def test_fails_when_invalid_name():
with pytest.raises(InvalidArgument):
source = "{#def 000abc -#}\n"
co = Component(name="", source=source)
print(co.required, co.optional)
def test_fails_when_missing_comma_between_args():
with pytest.raises(InvalidArgument):
source = "{#def lorem ipsum -#}\n"
co = Component(name="", source=source)
print(co.required, co.optional)
def test_fails_when_missing_quotes_arround_default_value():
with pytest.raises(InvalidArgument):
source = "{#def lorem=ipsum -#}\n"
co = Component(name="", source=source)
print(co.required, co.optional)
def test_fails_when_prop_is_expression():
with pytest.raises(InvalidArgument):
source = "{#def a-b -#}\n"
co = Component(name="", source=source)
print(co.required, co.optional)
def test_fails_when_extra_comma_between_args():
with pytest.raises(InvalidArgument):
source = "{#def a, , b -#}\n"
co = Component(name="", source=source)
print(co.required, co.optional)
def test_comma_in_default_value():
com = Component(
name="Test.jinja",
source="{#def a='lorem, ipsum' -#}\n",
)
assert com.optional == {"a": "lorem, ipsum"}
def test_load_assets():
com = Component(
name="Test.jinja",
url_prefix="/static/",
source="""
{#css a.css, "b.css", c.css -#}
{#js a.js, b.js, c.js -#}
""",
)
assert com.css == ["/static/a.css", "/static/b.css", "/static/c.css"]
assert com.js == ["/static/a.js", "/static/b.js", "/static/c.js"]
def test_no_comma_in_assets_list_is_your_problem():
com = Component(
name="Test.jinja",
source="{#js a.js b.js c.js -#}\n",
url_prefix="/static/"
)
assert com.js == ["/static/a.js b.js c.js"]
def test_load_metadata_in_any_order():
com = Component(
name="Test.jinja",
source="""
{#css a.css #}
{#def lorem, ipsum=4 #}
{#js a.js #}
""",
)
assert com.required == ["lorem"]
assert com.optional == {"ipsum": 4}
assert com.css == ["a.css"]
assert com.js == ["a.js"]
def test_ignore_metadata_if_not_first():
com = Component(
name="Test.jinja",
source="""
I am content
{#css a.css #}
{#def lorem, ipsum=4 #}
{#js a.js #}
""",
)
assert com.required == []
assert com.optional == {}
assert com.css == []
assert com.js == []
def test_fail_with_more_than_one_args_declaration():
with pytest.raises(DuplicateDefDeclaration):
Component(
name="Test.jinja",
source="""
{#def lorem, ipsum=4 #}
{#def a, b, c, ipsum="nope" #}
""",
)
def test_merge_repeated_css_or_js_declarations():
com = Component(
name="Test.jinja",
source="""
{#css a.css #}
{#def lorem, ipsum=4 #}
{#css b.css #}
{#js a.js #}
{#js b.js #}
""",
)
assert com.required == ["lorem"]
assert com.optional == {"ipsum": 4}
assert com.css == ["a.css", "b.css"]
assert com.js == ["a.js", "b.js"]
def test_linejump_in_args_decl():
com = Component(
name="Test.jinja",
source='{#def\n message,\n lorem=4,\n ipsum="bar"\n#}\n',
)
assert com.required == ["message"]
assert com.optional == {
"lorem": 4,
"ipsum": "bar",
}
def test_global_assets():
com = Component(
name="Test.jinja",
source="""
{#css a.css, /static/shared/b.css, http://example.com/cdn.css #}
{#js "http://example.com/cdn.js", a.js, /static/shared/b.js #}
""",
)
assert com.css == ["a.css", "/static/shared/b.css", "http://example.com/cdn.css"]
assert com.js == ["http://example.com/cdn.js", "a.js", "/static/shared/b.js"]
def test_types_in_args_decl():
com = Component(
name="Test.jinja",
source="""{# def
ring_class: str = "ring-1 ring-black",
rounded_class: str = "rounded-2xl md:rounded-3xl",
image: str | None = None,
title: str = "",
p_class: str = "px-5 md:px-6 py-5 md:py-6",
gap_class: str = "gap-4",
content_class: str = "",
layer_class: str | None = None,
layer_height: int = 4,
#}"""
)
assert com.required == []
print(com.optional)
assert com.optional == {
"ring_class": "ring-1 ring-black",
"rounded_class": "rounded-2xl md:rounded-3xl",
"image": None,
"title": "",
"p_class": "px-5 md:px-6 py-5 md:py-6",
"gap_class": "gap-4",
"content_class": "",
"layer_class": None,
"layer_height": 4,
}
def test_comments_in_args_decl():
com = Component(
name="Test.jinja",
source="""{# def
#
# Card style
ring_class: str = "ring-1 ring-black",
rounded_class: str = "rounded-2xl md:rounded-3xl",
#
# Image
image: str | None = None,
#
# Content
title: str = "",
p_class: str = "px-5 md:px-6 py-5 md:py-6",
gap_class: str = "gap-4",
content_class: str = "",
#
# Decorative layer
layer_class: str | None = None,
layer_height: int = 4,
#}"""
)
assert com.required == []
print(com.optional)
assert com.optional == {
"ring_class": "ring-1 ring-black",
"rounded_class": "rounded-2xl md:rounded-3xl",
"image": None,
"title": "",
"p_class": "px-5 md:px-6 py-5 md:py-6",
"gap_class": "gap-4",
"content_class": "",
"layer_class": None,
"layer_height": 4,
}
def test_comment_after_args_decl():
com = Component(
name="Test.jinja",
source="""
{# def
arg,
#}
{#
Some comment.
#}
Hi
""".strip())
assert com.required == ["arg"]
assert com.optional == {}
def test_fake_decl():
com = Component(
name="Test.jinja",
source="""
{# definitely not an args decl! #}
{# def arg #}
{# jsadfghkl are letters #}
{# csssssss #}
""".strip())
assert com.required == ["arg"]
assert com.optional == {}