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"