feat: RSS service — feedparser fetch, cache, prune
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
import pytest
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
|
||||
def test_extract_item_fields():
|
||||
"""extract_item() should pull title, link, id, summary from a feedparser entry."""
|
||||
from fabledassistant.services.rss import extract_item
|
||||
entry = MagicMock()
|
||||
entry.get = lambda k, d="": {"title": "Test Post", "link": "https://example.com/1",
|
||||
"id": "guid-1", "summary": "A summary"}.get(k, d)
|
||||
entry.published_parsed = None
|
||||
item = extract_item(entry)
|
||||
assert item["title"] == "Test Post"
|
||||
assert item["url"] == "https://example.com/1"
|
||||
assert item["guid"] == "guid-1"
|
||||
assert item["content"] == "A summary"
|
||||
|
||||
|
||||
def test_extract_item_truncates_content():
|
||||
"""extract_item() should truncate content to 2000 chars."""
|
||||
from fabledassistant.services.rss import extract_item
|
||||
entry = MagicMock()
|
||||
entry.get = lambda k, d="": {"summary": "x" * 3000, "title": "", "link": "", "id": "g"}.get(k, d)
|
||||
entry.published_parsed = None
|
||||
item = extract_item(entry)
|
||||
assert len(item["content"]) == 2000
|
||||
|
||||
|
||||
def test_extract_item_prefers_content_over_summary():
|
||||
"""extract_item() should prefer 'content' field over 'summary' when present."""
|
||||
from fabledassistant.services.rss import extract_item
|
||||
entry = MagicMock()
|
||||
content_obj = MagicMock()
|
||||
content_obj.value = "Full content here"
|
||||
entry.get = lambda k, d="": {
|
||||
"title": "T", "link": "http://x.com", "id": "g",
|
||||
"summary": "Short summary",
|
||||
}.get(k, d)
|
||||
entry.content = [content_obj]
|
||||
entry.published_parsed = None
|
||||
item = extract_item(entry)
|
||||
assert item["content"] == "Full content here"
|
||||
Reference in New Issue
Block a user