diff options
Diffstat (limited to 'tests/test_html_attrs.py')
-rw-r--r-- | tests/test_html_attrs.py | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/tests/test_html_attrs.py b/tests/test_html_attrs.py new file mode 100644 index 0000000..bc1a68f --- /dev/null +++ b/tests/test_html_attrs.py @@ -0,0 +1,281 @@ +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" |