import asyncio import json import uuid from datetime import UTC, datetime, timedelta import pytest from scrapy.http import Request, TextResponse @pytest.fixture def wscn(trading): from alphapulse.crawler.spiders.base import RunState from alphapulse.crawler.spiders.wscn import WscnNewsSpider spider = WscnNewsSpider() now = datetime(2026, 10, 22, tzinfo=UTC) spider.run = RunState(uuid.uuid4(), "schedule", now, now - timedelta(hours=72), history_target=datetime(2025, 1, 1, tzinfo=UTC), history_position=datetime(2025, 12, 10, tzinfo=UTC)) return spider def json_response(request, body, raw_id): request.meta["raw_response_id"] = raw_id return TextResponse(request.url, request=request, body=json.dumps(body).encode(), encoding="utf-8") async def detail_request(spider, monkeypatch, *, history=True, priced=True): async def known_items(ids): return {} monkeypatch.setattr(spider, "known_items", known_items) response = json_response(spider.list_request("", 1, history=history), { "code": 20000, "data": {"items": [{"resource_type": "article", "resource": { "id": 3759372, "uri": "https://wallstreetcn.com/premium/articles/3759372?layout=wscn-layout", "title": "公开课程标题", "content_short": "公开摘要