import pytest
import aiohttp
from datetime import datetime, timezone
from unittest.mock import patch, MagicMock, AsyncMock
from src.crawlers.static_crawler import StaticCrawler
from src.crawlers.skolkovo_crawler import SkolkovoCrawler
from src.crawlers.dto import NewsItemDTO
@pytest.mark.asyncio
async def test_static_crawler_addmeto():
html_content = """
"""
with patch("aiohttp.ClientSession.get") as mock_get:
mock_response = MagicMock()
mock_response.status = 200
mock_response.text = AsyncMock(return_value=html_content)
mock_response.__aenter__.return_value = mock_response
mock_get.return_value = mock_response
crawler = StaticCrawler(url="https://t.me/s/addmeto", source="Telegram: Addmeto", selector=".tgme_widget_message_text")
items = await crawler.fetch_latest()
assert len(items) > 0
assert items[0].source == "Telegram: Addmeto"
assert "t.me/addmeto/123" in items[0].url
@pytest.mark.asyncio
async def test_static_crawler_rsf():
html_content = """
"""
with patch("aiohttp.ClientSession.get") as mock_get:
mock_response = MagicMock()
mock_response.status = 200
mock_response.text = AsyncMock(return_value=html_content)
mock_response.__aenter__.return_value = mock_response
mock_get.return_value = mock_response
crawler = StaticCrawler(url="https://rscf.ru/en/news/", source="RSF", selector=".news-item")
items = await crawler.fetch_latest()
assert len(items) > 0
assert items[0].source == "RSF"
assert "rscf.ru/en/news/123" in items[0].url
@pytest.mark.asyncio
async def test_skolkovo_crawler():
html_content = """
"""
with patch("src.crawlers.playwright_crawler.PlaywrightCrawler.fetch_latest") as mock_fetch:
mock_fetch.return_value = [
NewsItemDTO(title="Skolkovo News", url="https://sk.ru/news/123", content_text="Text", source="Skolkovo", timestamp=datetime.now(timezone.utc))
]
crawler = SkolkovoCrawler(url="https://sk.ru/news/", source="Skolkovo")
items = await crawler.fetch_latest()
assert len(items) > 0
assert items[0].source == "Skolkovo"
assert "sk.ru" in items[0].url