"""News feed endpoint + per-article tone classification tests."""
from fastapi.testclient import TestClient

from app.main import app
from app.services.news import classify_headline, get_feed

client = TestClient(app)


def test_classify_headline():
    assert classify_headline({"headline": "Company beats estimates", "summary": ""}) == "positive"
    assert classify_headline({"headline": "Company faces lawsuit", "summary": ""}) == "negative"
    assert classify_headline({"headline": "Company holds meeting", "summary": ""}) == "neutral"


def test_feed_shape_and_tones():
    feed = get_feed(limit=20)
    assert len(feed["articles"]) > 0
    for a in feed["articles"]:
        assert a["headline"]
        assert a["tone"] in ("positive", "negative", "neutral")
        assert "symbol" in a and "source" in a


def test_feed_symbol_filter():
    feed = get_feed(symbols=["TSLA"], limit=10)
    assert all(a["symbol"] == "TSLA" for a in feed["articles"])


def test_news_endpoint():
    r = client.get("/api/news")
    assert r.status_code == 200
    body = r.json()
    assert "articles" in body and len(body["articles"]) > 0

    r = client.get("/api/news", params={"symbol": "nvda", "limit": 5})
    assert r.status_code == 200
    arts = r.json()["articles"]
    assert len(arts) <= 5
    assert all(a["symbol"] == "NVDA" for a in arts)


def test_news_endpoint_limit_validation():
    assert client.get("/api/news", params={"limit": 500}).status_code == 422
