"""Tests for news and sentiment models.""" import pytest from datetime import datetime, timezone from shared.models import NewsCategory, NewsItem, OrderSide from shared.sentiment_models import SymbolScore, MarketSentiment, SelectedStock, Candidate def test_news_item_defaults(): item = NewsItem( source="finnhub", headline="Test headline", published_at=datetime(2026, 4, 2, tzinfo=timezone.utc), sentiment=0.5, category=NewsCategory.MACRO, ) assert item.id assert item.symbols == [] assert item.summary is None assert item.raw_data == {} assert item.created_at is not None def test_news_item_with_symbols(): item = NewsItem( source="rss", headline="AAPL earnings beat", published_at=datetime(2026, 4, 2, tzinfo=timezone.utc), sentiment=0.8, category=NewsCategory.EARNINGS, symbols=["AAPL"], ) assert item.symbols == ["AAPL"] assert item.category == NewsCategory.EARNINGS def test_news_category_values(): assert NewsCategory.POLICY == "policy" assert NewsCategory.EARNINGS == "earnings" assert NewsCategory.MACRO == "macro" assert NewsCategory.SOCIAL == "social" assert NewsCategory.FILING == "filing" assert NewsCategory.FED == "fed" def test_symbol_score(): score = SymbolScore( symbol="AAPL", news_score=0.5, news_count=10, social_score=0.3, policy_score=0.0, filing_score=0.2, composite=0.3, updated_at=datetime(2026, 4, 2, tzinfo=timezone.utc), ) assert score.symbol == "AAPL" assert score.composite == 0.3 def test_market_sentiment(): ms = MarketSentiment( fear_greed=25, fear_greed_label="Extreme Fear", vix=32.5, fed_stance="hawkish", market_regime="risk_off", updated_at=datetime(2026, 4, 2, tzinfo=timezone.utc), ) assert ms.market_regime == "risk_off" assert ms.vix == 32.5 def test_market_sentiment_no_vix(): ms = MarketSentiment( fear_greed=50, fear_greed_label="Neutral", fed_stance="neutral", market_regime="neutral", updated_at=datetime(2026, 4, 2, tzinfo=timezone.utc), ) assert ms.vix is None def test_selected_stock(): ss = SelectedStock( symbol="NVDA", side=OrderSide.BUY, conviction=0.85, reason="CHIPS Act expansion", key_news=["Trump signs CHIPS Act expansion"], ) assert ss.conviction == 0.85 assert len(ss.key_news) == 1 def test_candidate(): c = Candidate( symbol="TSLA", source="sentiment", direction=OrderSide.BUY, score=0.75, reason="High social buzz", ) assert c.direction == OrderSide.BUY c2 = Candidate( symbol="XOM", source="llm", score=0.6, reason="Oil price surge", ) assert c2.direction is None