bowser/tests/test_dom_graph.py
Benedikt Willi c9ef5e5c44 Refactor test files to remove unnecessary imports and improve readability
- Removed unused imports from various test files to streamline code.
- Cleaned up whitespace in test cases for better consistency.
- Updated dependency management in `uv.lock` to reflect changes in optional dependencies.
- Ensured all tests maintain functionality while enhancing clarity and organization.
2026-01-12 10:22:34 +01:00

141 lines
4.7 KiB
Python

"""Tests for DOM graph visualization."""
from src.parser.html import parse_html
from src.debug.dom_graph import generate_dot_graph, print_dom_tree
class TestDOMGraph:
def test_generate_dot_graph_empty(self):
"""Test generating graph for None document."""
dot = generate_dot_graph(None)
assert "digraph DOM" in dot
assert "Empty Document" in dot
def test_generate_dot_graph_simple(self):
"""Test generating graph for simple HTML."""
html = "<html><body><p>Hello World</p></body></html>"
doc = parse_html(html)
dot = generate_dot_graph(doc)
assert "digraph DOM" in dot
assert "node_" in dot # Should have node IDs
assert "<html>" in dot
assert "<body>" in dot
assert "<p>" in dot
assert "Hello World" in dot
def test_generate_dot_graph_with_attributes(self):
"""Test graph generation with element attributes."""
html = '<html><body><div class="test" id="main">Content</div></body></html>'
doc = parse_html(html)
dot = generate_dot_graph(doc)
assert "digraph DOM" in dot
assert "<div>" in dot
# Attributes should be included (at least some of them)
assert "class" in dot or "id" in dot
def test_generate_dot_graph_nested(self):
"""Test graph generation with nested elements."""
html = """
<html>
<body>
<div>
<p>First</p>
<p>Second</p>
</div>
</body>
</html>
"""
doc = parse_html(html)
dot = generate_dot_graph(doc)
assert "digraph DOM" in dot
assert "->" in dot # Should have edges
assert "First" in dot
assert "Second" in dot
def test_generate_dot_graph_colors(self):
"""Test that different element types get different colors."""
html = "<html><body><h1>Title</h1><p>Text</p><ul><li>Item</li></ul></body></html>"
doc = parse_html(html)
dot = generate_dot_graph(doc)
# Check for color attributes
assert "fillcolor=" in dot
assert "lightgreen" in dot or "lightyellow" in dot or "lightgray" in dot
def test_print_dom_tree_simple(self):
"""Test text tree representation."""
html = "<html><body><p>Hello</p></body></html>"
doc = parse_html(html)
tree = print_dom_tree(doc)
assert "<html>" in tree
assert "<body>" in tree
assert "<p>" in tree
assert "Hello" in tree
def test_print_dom_tree_indentation(self):
"""Test that tree has proper indentation."""
html = "<html><body><div><p>Nested</p></div></body></html>"
doc = parse_html(html)
tree = print_dom_tree(doc)
# Should have increasing indentation
lines = tree.split('\n')
# Find the nested <p> line - should be more indented than <div>
p_line = [line for line in lines if '<p>' in line][0]
div_line = [line for line in lines if '<div>' in line][0]
# Count leading spaces
p_indent = len(p_line) - len(p_line.lstrip())
div_indent = len(div_line) - len(div_line.lstrip())
assert p_indent > div_indent
def test_print_dom_tree_max_depth(self):
"""Test that max_depth limits tree traversal."""
html = "<html><body><div><div><div><p>Deep</p></div></div></div></body></html>"
doc = parse_html(html)
tree_shallow = print_dom_tree(doc, max_depth=2)
tree_deep = print_dom_tree(doc, max_depth=10)
# Shallow should be shorter
assert len(tree_shallow) < len(tree_deep)
assert "..." in tree_shallow
def test_generate_dot_graph_text_escaping(self):
"""Test that special characters in text are escaped."""
html = '<html><body><p>Text with "quotes" and newlines\n</p></body></html>'
doc = parse_html(html)
dot = generate_dot_graph(doc)
# Should have escaped quotes
assert '\\"' in dot or 'quotes' in dot
# Should not have raw newlines breaking the DOT format
lines = dot.split('\n')
# All lines should be valid (no line starts with unexpected characters)
for line in lines:
if line.strip():
assert not line.strip().startswith('"') or line.strip().endswith(';') or line.strip().endswith(']')
def test_generate_dot_graph_long_text_truncation(self):
"""Test that very long text nodes are truncated."""
long_text = "A" * 100
html = f"<html><body><p>{long_text}</p></body></html>"
doc = parse_html(html)
dot = generate_dot_graph(doc)
# Should contain truncation marker
assert "..." in dot