- POST /api/insta/trends/collect — background trend collection via trend_collector.collect_all - GET /api/insta/trends — list external trends with source/category/days filters - GET /api/insta/preferences — return category weights (defaults seeded on init_db) - PUT /api/insta/preferences — upsert category weights - Modified GET /api/insta/keywords to accept source= filter (source present → list_trends, else existing list_trending_keywords, backward compatible) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
84 lines
2.9 KiB
Python
84 lines
2.9 KiB
Python
import os
|
|
import gc
|
|
import tempfile
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
from app import db as db_module
|
|
|
|
|
|
@pytest.fixture
|
|
def client(monkeypatch):
|
|
fd, path = tempfile.mkstemp(suffix=".db")
|
|
os.close(fd)
|
|
monkeypatch.setattr(db_module, "DB_PATH", path)
|
|
db_module.init_db()
|
|
from app import main
|
|
monkeypatch.setattr(main, "DB_PATH", path)
|
|
with TestClient(main.app) as c:
|
|
yield c
|
|
gc.collect()
|
|
for ext in ("", "-wal", "-shm"):
|
|
try:
|
|
os.remove(path + ext)
|
|
except OSError:
|
|
pass
|
|
|
|
|
|
def test_get_preferences_returns_defaults(client):
|
|
resp = client.get("/api/insta/preferences")
|
|
assert resp.status_code == 200
|
|
cats = {p["category"]: p["weight"] for p in resp.json()["categories"]}
|
|
assert cats == {"economy": 1.0, "psychology": 1.0, "celebrity": 1.0}
|
|
|
|
|
|
def test_put_preferences_upsert(client):
|
|
resp = client.put("/api/insta/preferences",
|
|
json={"categories": {"economy": 0.7, "psychology": 0.2, "tech": 0.5}})
|
|
assert resp.status_code == 200
|
|
cats = {p["category"]: p["weight"] for p in resp.json()["categories"]}
|
|
assert cats["economy"] == 0.7
|
|
assert cats["tech"] == 0.5
|
|
|
|
|
|
def test_list_trends_filter(client):
|
|
db_module.add_external_trend({"keyword": "A", "category": "economy",
|
|
"source": "naver_popular", "score": 1.0})
|
|
db_module.add_external_trend({"keyword": "B", "category": "celebrity",
|
|
"source": "google_trends", "score": 0.8})
|
|
resp = client.get("/api/insta/trends?source=naver_popular")
|
|
items = resp.json()["items"]
|
|
assert {it["keyword"] for it in items} == {"A"}
|
|
|
|
|
|
def test_collect_trends_kicks_background(client, monkeypatch):
|
|
from app import main, trend_collector
|
|
|
|
captured = {"called": False}
|
|
|
|
def fake_collect_all(cats):
|
|
captured["called"] = True
|
|
return {"naver_popular": 3, "google_trends": 2}
|
|
|
|
monkeypatch.setattr(trend_collector, "collect_all", fake_collect_all)
|
|
resp = client.post("/api/insta/trends/collect", json={})
|
|
assert resp.status_code == 200
|
|
task_id = resp.json()["task_id"]
|
|
for _ in range(20):
|
|
st = client.get(f"/api/insta/tasks/{task_id}").json()
|
|
if st["status"] in ("succeeded", "failed"):
|
|
break
|
|
assert st["status"] == "succeeded"
|
|
assert captured["called"] is True
|
|
|
|
|
|
def test_list_keywords_filters_by_source(client):
|
|
db_module.add_trending_keyword({"keyword": "M", "category": "economy",
|
|
"score": 0.4, "articles_count": 1, "source": "manual"})
|
|
db_module.add_external_trend({"keyword": "N", "category": "economy",
|
|
"source": "naver_popular", "score": 0.9})
|
|
resp = client.get("/api/insta/keywords?source=manual")
|
|
items = resp.json()["items"]
|
|
assert {it["keyword"] for it in items} == {"M"}
|