feat(MAT-174): Add cron job scheduler and executors

Cron package that syncs jobs from matrixhost portal API, schedules execution
with timezone-aware timing, and posts results to Matrix rooms. Includes
Brave Search, reminder, and browser scrape (placeholder) executors with
formatter. 31 pytest tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Christian Gick
2026-03-16 09:31:19 +02:00
parent 21b8a4efb1
commit 4d8ea44b3d
15 changed files with 1009 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
"""Tests for the cron result formatter."""
from cron.formatter import format_search_results, format_listings
class TestFormatSearchResults:
def test_single_result(self):
results = [
{"title": "BMW X3 2018", "url": "https://example.com/1", "description": "Unfallwagen"}
]
msg = format_search_results("BMW Scan", results)
assert "BMW Scan" in msg
assert "1 new result" in msg
assert "BMW X3 2018" in msg
assert "https://example.com/1" in msg
assert "Unfallwagen" in msg
assert "matrixhost.eu/settings/automations" in msg
def test_multiple_results(self):
results = [
{"title": "Result 1", "url": "https://a.com", "description": "Desc 1"},
{"title": "Result 2", "url": "https://b.com", "description": "Desc 2"},
{"title": "Result 3", "url": "https://c.com", "description": ""},
]
msg = format_search_results("Test Search", results)
assert "3 new results" in msg
assert "1." in msg
assert "2." in msg
assert "3." in msg
def test_result_without_description(self):
results = [{"title": "No Desc", "url": "https://x.com"}]
msg = format_search_results("Search", results)
assert "No Desc" in msg
# Should not have empty description line
class TestFormatListings:
def test_single_listing(self):
listings = [
{
"title": "BMW X3 2.0i",
"price": "\u20ac4,500",
"location": "Limassol",
"url": "https://fb.com/123",
"age": "2h ago",
}
]
msg = format_listings("Car Scan", listings)
assert "Car Scan" in msg
assert "1 new listing" in msg
assert "BMW X3 2.0i" in msg
assert "\u20ac4,500" in msg
assert "Limassol" in msg
assert "2h ago" in msg
assert "https://fb.com/123" in msg
def test_listing_without_optional_fields(self):
listings = [{"title": "Bare Listing"}]
msg = format_listings("Scan", listings)
assert "Bare Listing" in msg
assert "1 new listing" in msg
def test_multiple_listings_plural(self):
listings = [{"title": f"Item {i}"} for i in range(5)]
msg = format_listings("Multi", listings)
assert "5 new listings" in msg