feat(http/parser): extend query selector

This commit is contained in:
Tiara Rodney 2025-12-31 15:47:05 +01:00
parent db72017810
commit a4e215c69c
No known key found for this signature in database
GPG key ID: 5CD8EC1D46106723
2 changed files with 151 additions and 51 deletions

View file

@ -7,14 +7,6 @@ from byteb4rb1e.utils.http.parser import Node, TreeBuilder
def sample_dom():
"""
Build a small DOM tree for testing:
<div id="root" class="container">
<p class="text">Hello</p>
<span class="text highlight">World</span>
<div class="box">
<span id="inner">Inside</span>
</div>
</div>
"""
html = """
<div id="root" class="container">
@ -22,6 +14,7 @@ def sample_dom():
<span class="text highlight">World</span>
<div class="box">
<span id="inner">Inside</span>
<span id="inner2">Inside Too</span>
</div>
</div>
"""
@ -33,9 +26,10 @@ def sample_dom():
class TestGetElementsByTagName:
def test_find_all_spans(self, sample_dom):
spans = sample_dom.get_elements_by_tag_name("span")
assert len(spans) == 2
assert len(spans) == 3
assert spans[0].tag == "span"
assert spans[1].tag == "span"
assert spans[2].tag == "span"
def test_find_no_matches(self, sample_dom):
assert sample_dom.get_elements_by_tag_name("table") == []
@ -82,15 +76,53 @@ class TestQuerySelectorAll:
assert items[0].inner_content == "Hello"
def test_chained_selector(self, sample_dom):
items = sample_dom.query_selector_all("div .highlight")
items = sample_dom.query_selector_all(".text .highlight")
assert len(items) == 1
assert items[0].inner_content == "World"
def test_direct_child(self, sample_dom):
items = sample_dom.query_selector_all(".box > #inner")
assert len(items) == 1
assert items[0].inner_content == "Inside"
def test_direct_child_no_match(self, sample_dom):
items = sample_dom.query_selector_all("div > span.highlight")
# highlight span is NOT a direct child of inner div
assert len(items) == 0
def test_attribute_match(self, sample_dom):
items = sample_dom.query_selector_all('[id="inner"]')
assert len(items) == 1
assert items[0].inner_content == "Inside"
def test_attribute_no_match(self, sample_dom):
items = sample_dom.query_selector_all('[data-x="nope"]')
assert items == []
def test_tag_class(self, sample_dom):
items = sample_dom.query_selector_all("span.highlight")
assert len(items) == 1
assert items[0].inner_content == "World"
def test_multiple_classes(self, sample_dom):
items = sample_dom.query_selector_all(".text.highlight")
assert len(items) == 1
assert items[0].inner_content == "World"
def test_tag_id_class(self, sample_dom):
items = sample_dom.query_selector_all("span#inner")
assert len(items) == 1
assert items[0].inner_content == "Inside"
def test_descendant(self, sample_dom):
items = sample_dom.query_selector_all("div span")
assert len(items) == 2
class TestXPath:
def test_simple_tag(self, sample_dom):
spans = sample_dom.xpath("//span")
assert len(spans) == 2
assert len(spans) == 3
def test_attribute_match(self, sample_dom):
nodes = sample_dom.xpath('//span[@id="inner"]')