polygrapher / tests /test_templateify.py
dhruv575
Update and clean
c4a298e
"""Tests for templateify base helpers and both service convert() methods."""
from bs4 import BeautifulSoup
from app.templateify_base import TemplateifyHelpers
from app.templateify_new_service import TemplateifyNewService
from app.templateify_special_events_service import TemplateifySpecialEventsService
# ---------------------------------------------------------------------------
# TemplateifyHelpers unit tests
# ---------------------------------------------------------------------------
class TestTemplateifyHelpers:
def test_register_adds_token(self):
soup = BeautifulSoup("<html></html>", "html.parser")
h = TemplateifyHelpers(soup)
h.register("{{FOO}}", "A foo token")
assert len(h.tokens) == 1
assert h.tokens[0] == {"name": "{{FOO}}", "description": "A foo token"}
def test_register_deduplicates(self):
soup = BeautifulSoup("<html></html>", "html.parser")
h = TemplateifyHelpers(soup)
h.register("{{FOO}}", "first")
h.register("{{FOO}}", "second")
assert len(h.tokens) == 1
assert h.tokens[0]["description"] == "first"
def test_set_text_replaces_content(self):
soup = BeautifulSoup('<div><p class="title">Hello</p></div>', "html.parser")
h = TemplateifyHelpers(soup)
h.set_text(".title", "{{TITLE}}", "A title token")
assert soup.select_one(".title").string == "{{TITLE}}"
assert len(h.tokens) == 1
def test_set_text_missing_selector_is_noop(self):
soup = BeautifulSoup("<div></div>", "html.parser")
h = TemplateifyHelpers(soup)
h.set_text(".missing", "{{X}}", "desc")
assert len(h.tokens) == 0
def test_set_attr_updates_attribute(self):
soup = BeautifulSoup('<div><img class="pic" src="old.png"></div>', "html.parser")
h = TemplateifyHelpers(soup)
parent = soup.select_one("div")
h.set_attr(parent, ".pic", "src", "{{IMG}}", "Image URL")
assert soup.select_one(".pic")["src"] == "{{IMG}}"
assert len(h.tokens) == 1
def test_set_child_text(self):
soup = BeautifulSoup('<div><span class="label">old</span></div>', "html.parser")
h = TemplateifyHelpers(soup)
parent = soup.select_one("div")
h.set_child_text(parent, ".label", "{{LABEL}}", "Label token")
assert soup.select_one(".label").string == "{{LABEL}}"
def test_loopify_keeps_first_removes_rest(self):
html = '<div><p class="item">A</p><p class="item">B</p><p class="item">C</p></div>'
soup = BeautifulSoup(html, "html.parser")
h = TemplateifyHelpers(soup)
def transform(node):
node.clear()
node.append("{{TEXT}}")
h.register("{{TEXT}}", "Item text")
h.loopify(".item", "ITEMS", transform, "Repeated items.")
items = soup.select(".item")
assert len(items) == 1
assert items[0].string == "{{TEXT}}"
assert "{{#ITEMS}}" in str(soup)
assert "{{/ITEMS}}" in str(soup)
def test_wrap_images_in_anchors(self):
html = """
<table role="presentation"><tr><td>
<img alt="Polygraph by Polymarket" src="header.png">
</td></tr></table>
<table role="presentation"><tr><td>
<img alt="Polymarket" src="footer.png">
</td></tr></table>
"""
soup = BeautifulSoup(html, "html.parser")
h = TemplateifyHelpers(soup)
h.wrap_images_in_anchors()
header_img = soup.find("img", alt="Polygraph by Polymarket")
assert header_img.find_parent("a") is not None
assert header_img.find_parent("a")["href"] == "https://poly.market/0d7VvzI"
footer_img = soup.find("img", alt="Polymarket")
assert footer_img.find_parent("a") is not None
# ---------------------------------------------------------------------------
# Service-level integration tests
# ---------------------------------------------------------------------------
class TestTemplateifyNewService:
def test_convert_returns_html_and_tokens(self, sample_daily_html):
service = TemplateifyNewService()
result = service.convert(sample_daily_html)
assert "html" in result
assert "tokens" in result
assert isinstance(result["html"], str)
assert isinstance(result["tokens"], list)
def test_convert_tokenizes_intro(self, sample_daily_html):
service = TemplateifyNewService()
result = service.convert(sample_daily_html)
assert "{{{INTRO_TEXT}}}" in result["html"]
token_names = [t["name"] for t in result["tokens"]]
assert "{{{INTRO_TEXT}}}" in token_names
class TestTemplateifySpecialEventsService:
def test_convert_returns_html_and_tokens(self, sample_special_events_html):
service = TemplateifySpecialEventsService()
result = service.convert(sample_special_events_html)
assert "html" in result
assert "tokens" in result
assert isinstance(result["html"], str)
assert isinstance(result["tokens"], list)
def test_convert_tokenizes_event_title(self, sample_special_events_html):
service = TemplateifySpecialEventsService()
result = service.convert(sample_special_events_html)
assert "{{EVENT_TITLE}}" in result["html"]
token_names = [t["name"] for t in result["tokens"]]
assert "{{EVENT_TITLE}}" in token_names
def test_convert_tokenizes_intro_and_outro(self, sample_special_events_html):
service = TemplateifySpecialEventsService()
result = service.convert(sample_special_events_html)
assert "{{{INTRO_TEXT}}}" in result["html"]
assert "{{{OUTRO_TEXT}}}" in result["html"]