mirror of
https://github.com/django-components/django-components.git
synced 2025-09-01 11:47:19 +00:00

* feat: skeleton of dependency manager backend (#688) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * refactor: selectolax update and tests cleanup (#702) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * refactor: move release notes to own file (#704) * chore: merge changes from master (#705) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Yassin Rakha <yaso2go@gmail.com> Co-authored-by: Emil Stenström <emil@emilstenstrom.se> fix for nested slots (#698) (#699) * refactor: remove joint {% component_dependencies %} tag (#706) Co-authored-by: Emil Stenström <emil@emilstenstrom.se> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * refactor: split up utils file and move utils to util dir (#707) * docs: Move docs inside src/ to allow imports in python scripts (#708) * refactor: Docs prep 1 (#715) * refactor: Document template tags (#716) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * refactor: pass slot fills in template via slots param (#719) * chore: Merge master to dev (#729) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Yassin Rakha <yaso2go@gmail.com> Co-authored-by: Emil Stenström <emil@emilstenstrom.se> Co-authored-by: Tom Larsen <larsent@gmail.com> fix for nested slots (#698) (#699) * fix: Do not raise error if multiple slots with same name are flagged as default (#727) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * refactor: tag formatter - allow fwd slash in end tag (#730) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * refactor: Use lowercase names for registry settings (#731) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * docs: add docstrings (#732) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * feat: define settings as a data class for type hints, intellisense, and docs (#733) * refactor: fix reload-on-change logic, expose autodiscover's dirs-getting logic, rename settings (#734) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * docs: document settings (#743) * docs: document settings * refactor: fix linter errors * feat: passthrough slots and more (#758) * feat: passthrough slots and more * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * refactor: remove ComponentSlotContext.slots * refactor: update comment * docs: update changelog * refactor: update docstrings * refactor: document and test-cover more changes * refactor: revert fill without name * docs: update README --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * fix: apostrophes in tags (#765) * refactor: fix merge error - duplicate code --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Emil Stenström <emil@emilstenstrom.se>
267 lines
6.6 KiB
Python
267 lines
6.6 KiB
Python
from typing import List, cast
|
|
|
|
from django.test import TestCase
|
|
from selectolax.lexbor import LexborHTMLParser, LexborNode
|
|
|
|
from django_components.util.html import (
|
|
is_html_parser_fragment,
|
|
parse_document_or_nodes,
|
|
parse_multiroot_html,
|
|
parse_node,
|
|
)
|
|
|
|
from .django_test_setup import setup_test_config
|
|
|
|
setup_test_config({"autodiscover": False})
|
|
|
|
|
|
class HtmlTests(TestCase):
|
|
def test_parse_node(self):
|
|
node = parse_node(
|
|
"""
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
"""
|
|
)
|
|
node.attrs["id"] = "my-id" # type: ignore[index]
|
|
node.css("li")[0].attrs["class"] = "item" # type: ignore[index]
|
|
|
|
self.assertHTMLEqual(
|
|
node.html,
|
|
"""
|
|
<div class="abc xyz" data-id="123" id="my-id">
|
|
<ul>
|
|
<li class="item">Hi</li>
|
|
</ul>
|
|
</div>
|
|
""",
|
|
)
|
|
|
|
def test_parse_multiroot_html(self):
|
|
html = """
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
<main id="123" class="one">
|
|
<div>
|
|
42
|
|
</div>
|
|
</main>
|
|
<span>
|
|
Hello
|
|
</span>
|
|
"""
|
|
nodes = parse_multiroot_html(html)
|
|
|
|
self.assertHTMLEqual(
|
|
nodes[0].html,
|
|
"""
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
""",
|
|
)
|
|
self.assertHTMLEqual(
|
|
nodes[1].html,
|
|
"""
|
|
<main id="123" class="one">
|
|
<div>
|
|
42
|
|
</div>
|
|
</main>
|
|
""",
|
|
)
|
|
self.assertHTMLEqual(
|
|
nodes[2].html,
|
|
"""
|
|
<span>
|
|
Hello
|
|
</span>
|
|
""",
|
|
)
|
|
|
|
def test_is_html_parser_fragment(self):
|
|
fragment_html = """
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
<main id="123" class="one">
|
|
<div>
|
|
42
|
|
</div>
|
|
</main>
|
|
<span>
|
|
Hello
|
|
</span>
|
|
"""
|
|
fragment_tree = LexborHTMLParser(fragment_html)
|
|
fragment_result = is_html_parser_fragment(fragment_html, fragment_tree)
|
|
|
|
self.assertEqual(fragment_result, True)
|
|
|
|
doc_html = """
|
|
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<link href="https://..." />
|
|
</head>
|
|
<body>
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
"""
|
|
doc_tree = LexborHTMLParser(doc_html)
|
|
doc_result = is_html_parser_fragment(doc_html, doc_tree)
|
|
|
|
self.assertEqual(doc_result, False)
|
|
|
|
def test_parse_document_or_nodes__fragment(self):
|
|
fragment_html = """
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
<main id="123" class="one">
|
|
<div>
|
|
42
|
|
</div>
|
|
</main>
|
|
<span>
|
|
Hello
|
|
</span>
|
|
"""
|
|
fragment_result = cast(List[LexborNode], parse_document_or_nodes(fragment_html))
|
|
|
|
self.assertHTMLEqual(
|
|
fragment_result[0].html,
|
|
"""
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
""",
|
|
)
|
|
self.assertHTMLEqual(
|
|
fragment_result[1].html,
|
|
"""
|
|
<main id="123" class="one">
|
|
<div>
|
|
42
|
|
</div>
|
|
</main>
|
|
""",
|
|
)
|
|
self.assertHTMLEqual(
|
|
fragment_result[2].html,
|
|
"""
|
|
<span>
|
|
Hello
|
|
</span>
|
|
""",
|
|
)
|
|
|
|
def test_parse_document_or_nodes__mixed(self):
|
|
fragment_html = """
|
|
<link href="" />
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
<main id="123" class="one">
|
|
<div>
|
|
42
|
|
</div>
|
|
</main>
|
|
<span>
|
|
Hello
|
|
</span>
|
|
"""
|
|
fragment_result = cast(List[LexborNode], parse_document_or_nodes(fragment_html))
|
|
|
|
self.assertHTMLEqual(
|
|
fragment_result[0].html,
|
|
"""
|
|
<link href="" />
|
|
""",
|
|
)
|
|
self.assertHTMLEqual(
|
|
fragment_result[1].html,
|
|
"""
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
""",
|
|
)
|
|
self.assertHTMLEqual(
|
|
fragment_result[2].html,
|
|
"""
|
|
<main id="123" class="one">
|
|
<div>
|
|
42
|
|
</div>
|
|
</main>
|
|
""",
|
|
)
|
|
self.assertHTMLEqual(
|
|
fragment_result[3].html,
|
|
"""
|
|
<span>
|
|
Hello
|
|
</span>
|
|
""",
|
|
)
|
|
|
|
def test_parse_document_or_nodes__doc(self):
|
|
doc_html = """
|
|
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<link href="https://..." />
|
|
</head>
|
|
<body>
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
"""
|
|
fragment_result = cast(LexborHTMLParser, parse_document_or_nodes(doc_html))
|
|
|
|
self.assertHTMLEqual(
|
|
fragment_result.html,
|
|
"""
|
|
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<link href="https://..." />
|
|
</head>
|
|
<body>
|
|
<div class="abc xyz" data-id="123">
|
|
<ul>
|
|
<li>Hi</li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
""",
|
|
)
|