import pytest
from jinjax.html_attrs import HTMLAttrs
def test_parse_initial_attrs():
attrs = HTMLAttrs(
{
"title": "hi",
"data-position": "top",
"class": "z4 c3 a1 z4 b2",
"open": True,
"disabled": False,
"value": 0,
"foobar": None,
}
)
assert attrs.classes == "a1 b2 c3 z4"
assert attrs.get("class") == "a1 b2 c3 z4"
assert attrs.get("data-position") == "top"
assert attrs.get("data_position") == "top"
assert attrs.get("title") == "hi"
assert attrs.get("open") is True
assert attrs.get("disabled", "meh") == "meh"
assert attrs.get("value") == "0"
assert attrs.get("disabled") is None
assert attrs.get("foobar") is None
attrs.set(data_value=0)
attrs.set(data_position=False)
assert attrs.get("data-value") == 0
assert attrs.get("data-position") is None
assert attrs.get("data_position") is None
def test_getattr():
attrs = HTMLAttrs(
{
"title": "hi",
"class": "z4 c3 a1 z4 b2",
"open": True,
}
)
assert attrs["class"] == "a1 b2 c3 z4"
assert attrs["title"] == "hi"
assert attrs["open"] is True
assert attrs["lorem"] is None
def test_deltattr():
attrs = HTMLAttrs(
{
"title": "hi",
"class": "z4 c3 a1 z4 b2",
"open": True,
}
)
assert attrs["class"] == "a1 b2 c3 z4"
del attrs["title"]
assert attrs["title"] is None
def test_render():
attrs = HTMLAttrs(
{
"title": "hi",
"data-position": "top",
"class": "z4 c3 a1 z4 b2",
"open": True,
"disabled": False,
}
)
assert 'class="a1 b2 c3 z4" data-position="top" title="hi" open' == attrs.render()
def test_set():
attrs = HTMLAttrs({})
attrs.set(title="hi", data_position="top")
attrs.set(open=True)
assert 'data-position="top" title="hi" open' == attrs.render()
attrs.set(title=False, open=False)
assert 'data-position="top"' == attrs.render()
def test_class_management():
attrs = HTMLAttrs(
{
"class": "z4 c3 a1 z4 b2",
}
)
attrs.set(classes="lorem bipsum lorem a1")
assert attrs.classes == "a1 b2 bipsum c3 lorem z4"
attrs.remove_class("bipsum")
assert attrs.classes == "a1 b2 c3 lorem z4"
attrs.set(classes=None)
attrs.set(classes="meh")
assert attrs.classes == "meh"
def test_setdefault():
attrs = HTMLAttrs(
{
"title": "hi",
}
)
attrs.setdefault(
title="default title",
data_lorem="ipsum",
open=True,
disabled=False,
)
assert 'data-lorem="ipsum" title="hi"' == attrs.render()
def test_as_dict():
attrs = HTMLAttrs(
{
"title": "hi",
"data-position": "top",
"class": "z4 c3 a1 z4 b2",
"open": True,
"disabled": False,
}
)
assert attrs.as_dict == {
"class": "a1 b2 c3 z4",
"data-position": "top",
"title": "hi",
"open": True,
}
def test_as_dict_no_classes():
attrs = HTMLAttrs(
{
"title": "hi",
"data-position": "top",
"open": True,
}
)
assert attrs.as_dict == {
"data-position": "top",
"title": "hi",
"open": True,
}
def test_render_attrs_lik_set():
attrs = HTMLAttrs({"class": "lorem"})
expected = 'class="ipsum lorem" data-position="top" title="hi" open'
result = attrs.render(
title="hi",
data_position="top",
classes="ipsum",
open=True,
)
print(result)
assert expected == result
def test_do_not_escape_tailwind_syntax():
attrs = HTMLAttrs({"class": "lorem [&_a]:flex"})
expected = 'class="[&_a]:flex ipsum lorem" title="Hi&Stuff"'
result = attrs.render(
**{
"title": "Hi&Stuff",
"class": "ipsum",
}
)
print(result)
assert expected == result
def test_do_escape_quotes_inside_attrs():
attrs = HTMLAttrs(
{
"class": "lorem text-['red']",
"title": 'I say "hey"',
"open": True,
}
)
expected = """class="lorem text-['red']" title='I say "hey"' open"""
result = attrs.render()
print(result)
assert expected == result
def test_additional_attributes_are_lazily_evaluated_to_strings():
class TestObject:
def __str__(self):
raise RuntimeError("Should not be called unless rendered.")
attrs = HTMLAttrs(
{
"some_object": TestObject(),
}
)
with pytest.raises(RuntimeError):
attrs.render()
def test_additional_attributes_lazily_evaluated_has_string_methods():
class TestObject:
def __str__(self):
return "test"
attrs = HTMLAttrs({"some_object": TestObject()})
assert attrs["some_object"].__str__
assert attrs["some_object"].__repr__
assert attrs["some_object"].__int__
assert attrs["some_object"].__float__
assert attrs["some_object"].__complex__
assert attrs["some_object"].__hash__
assert attrs["some_object"].__eq__
assert attrs["some_object"].__lt__
assert attrs["some_object"].__le__
assert attrs["some_object"].__gt__
assert attrs["some_object"].__ge__
assert attrs["some_object"].__contains__
assert attrs["some_object"].__len__
assert attrs["some_object"].__getitem__
assert attrs["some_object"].__add__
assert attrs["some_object"].__radd__
assert attrs["some_object"].__mul__
assert attrs["some_object"].__mod__
assert attrs["some_object"].__rmod__
assert attrs["some_object"].capitalize
assert attrs["some_object"].casefold
assert attrs["some_object"].center
assert attrs["some_object"].count
assert attrs["some_object"].removeprefix
assert attrs["some_object"].removesuffix
assert attrs["some_object"].encode
assert attrs["some_object"].endswith
assert attrs["some_object"].expandtabs
assert attrs["some_object"].find
assert attrs["some_object"].format
assert attrs["some_object"].format_map
assert attrs["some_object"].index
assert attrs["some_object"].isalpha
assert attrs["some_object"].isalnum
assert attrs["some_object"].isascii
assert attrs["some_object"].isdecimal
assert attrs["some_object"].isdigit
assert attrs["some_object"].isidentifier
assert attrs["some_object"].islower
assert attrs["some_object"].isnumeric
assert attrs["some_object"].isprintable
assert attrs["some_object"].isspace
assert attrs["some_object"].istitle
assert attrs["some_object"].isupper
assert attrs["some_object"].join
assert attrs["some_object"].ljust
assert attrs["some_object"].lower
assert attrs["some_object"].lstrip
assert attrs["some_object"].partition
assert attrs["some_object"].replace
assert attrs["some_object"].rfind
assert attrs["some_object"].rindex
assert attrs["some_object"].rjust
assert attrs["some_object"].rpartition
assert attrs["some_object"].rstrip
assert attrs["some_object"].split
assert attrs["some_object"].rsplit
assert attrs["some_object"].splitlines
assert attrs["some_object"].startswith
assert attrs["some_object"].strip
assert attrs["some_object"].swapcase
assert attrs["some_object"].title
assert attrs["some_object"].translate
assert attrs["some_object"].upper
assert attrs["some_object"].zfill
assert attrs["some_object"].upper() == "TEST"
assert attrs["some_object"].title() == "Test"