what2do/tests/unit/test_calendar_and_sanitizer.py

78 lines
2.9 KiB
Python

from datetime import datetime, timezone
from bs4 import BeautifulSoup
from app.main import (
PICKER_SCRIPT,
calendar_day_counts,
event_overlaps_range,
sanitize_picker_html,
)
def test_multiday_events_count_each_overlapping_calendar_day():
events = [
{"day_key": "2026-09-02", "end_day_key": "2026-09-04"},
{"day_key": "2026-09-04", "end_day_key": "2026-09-04"},
]
assert calendar_day_counts(events) == {
"2026-09-02": 1,
"2026-09-03": 1,
"2026-09-04": 2,
}
def test_date_range_overlap_semantics_are_end_exclusive_for_query_range():
event_start = datetime(2026, 9, 2, tzinfo=timezone.utc)
event_end = datetime(2026, 9, 13, tzinfo=timezone.utc)
assert event_overlaps_range(
event_start,
event_end,
datetime(2026, 9, 5, tzinfo=timezone.utc),
datetime(2026, 9, 7, tzinfo=timezone.utc),
)
assert not event_overlaps_range(
event_start,
event_end,
datetime(2026, 9, 14, tzinfo=timezone.utc),
datetime(2026, 9, 20, tzinfo=timezone.utc),
)
assert not event_overlaps_range(
datetime(2026, 9, 20, tzinfo=timezone.utc),
None,
datetime(2026, 9, 14, tzinfo=timezone.utc),
datetime(2026, 9, 20, tzinfo=timezone.utc),
)
def test_sanitizer_removes_active_content_and_rewrites_assets(fixture_html):
output = sanitize_picker_html(fixture_html("hostile_snapshot.html"), "https://example.org/events/")
soup = BeautifulSoup(output, "html.parser")
assert soup.select_one("form, iframe, base") is None
assert "unsafe" not in output
assert "onload=" not in output and "onclick=" not in output
assert "href" not in soup.select_one("a").attrs
assert soup.select_one("img")["src"] == "https://example.org/image.jpg"
assert soup.select_one('link[rel="stylesheet"]')["href"] == "https://example.org/site.css"
assert "what2do-selector" in output
def test_picker_script_contract_contains_generalization_fields():
for field in ("containerSelector", "containerCount", "relativeSelector", "generalizedSelector", "selectorCount"):
assert field in PICKER_SCRIPT
assert "idPattern" in PICKER_SCRIPT
assert "[id^=" in PICKER_SCRIPT
def test_picker_script_supports_guided_highlights_and_preview():
for contract in ("what2do-picker-config", "what2do-picker-preview", "inconsistencies", "withinConfiguredContainer"):
assert contract in PICKER_SCRIPT
for highlight in ("w2d-container", "w2d-field"):
assert highlight in PICKER_SCRIPT
def test_sanitizer_preserves_selector_relevant_ids_and_classes():
output = sanitize_picker_html('<article id="post-12345" class="event card"><h2 class="title">One</h2></article>', "https://example.org")
soup = BeautifulSoup(output, "html.parser")
assert soup.select_one("#post-12345.event.card .title").get_text() == "One"