| import importlib | |
| from app.article_fetchers.base import ArticleContent | |
| def _load_article_dao(tmp_path, monkeypatch): | |
| monkeypatch.setenv("DATABASE_URL", f"sqlite:///{tmp_path / 'articles.db'}") | |
| import app.db.engine as engine | |
| import app.db.models.articles as article_models | |
| import app.db.init_db as init_db | |
| importlib.reload(engine) | |
| importlib.reload(article_models) | |
| importlib.reload(init_db) | |
| init_db.init_db() | |
| import app.db.article_dao as article_dao | |
| return importlib.reload(article_dao) | |
| def test_upsert_article_item_dedupes_by_platform_and_article_id(tmp_path, monkeypatch): | |
| article_dao = _load_article_dao(tmp_path, monkeypatch) | |
| article = ArticleContent( | |
| platform="wechat_mp", | |
| url="https://mp.weixin.qq.com/s/a", | |
| article_id="biz:mid:1:sn", | |
| title="标题", | |
| author_name="公众号", | |
| content_text="正文", | |
| ) | |
| first = article_dao.upsert_article_item(article) | |
| second = article_dao.upsert_article_item(article) | |
| assert first.id == second.id | |
| assert len(article_dao.list_article_items()) == 1 | |
| def test_create_subscription_and_link_item(tmp_path, monkeypatch): | |
| article_dao = _load_article_dao(tmp_path, monkeypatch) | |
| article = article_dao.upsert_article_item( | |
| ArticleContent( | |
| platform="xiaohongshu", | |
| url="https://www.xiaohongshu.com/explore/a", | |
| article_id="a", | |
| title="小红书标题", | |
| content_text="正文", | |
| ) | |
| ) | |
| subscription = article_dao.create_subscription( | |
| platform="xiaohongshu", | |
| subscription_type="keyword", | |
| query="AI", | |
| label="AI", | |
| ) | |
| article_dao.link_subscription_item(subscription.id, article.id, "keyword:AI") | |
| assert article_dao.list_subscriptions()[0].query == "AI" | |
| assert article_dao.get_article_item(article.id).title == "小红书标题" | |
| assert article_dao.list_article_items(subscription_id=subscription.id)[0].id == article.id | |