141 lines
5.6 KiB
Python
141 lines
5.6 KiB
Python
"""Pytest configuration and fixtures"""
|
|
|
|
import asyncio
|
|
import pytest
|
|
from unittest.mock import AsyncMock, MagicMock
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
|
|
|
|
from sentiment_engine.schemas.payload import NormalizedPayload, SourceType, AssetMention, EngagementMetrics
|
|
from sentiment_engine.schemas.processed import ProcessedItem, EntityExtraction, SentimentScores, EmotionScores, EventClassification, TemporalAnchor, CredibilityScore, EventType
|
|
from sentiment_engine.schemas.output import AssetSentiment, MarketSentiment, IndustrySentiment, SentimentOutput, PumpDumpScore, VelocityMetrics, EventFlag
|
|
|
|
|
|
@pytest.fixture
|
|
def event_loop():
|
|
"""Create event loop for async tests"""
|
|
loop = asyncio.new_event_loop()
|
|
yield loop
|
|
loop.close()
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_payload():
|
|
"""Sample normalized payload"""
|
|
return NormalizedPayload(
|
|
source_id="rss:coindesk.com",
|
|
source_type=SourceType.NEWS,
|
|
source_credibility_base=0.85,
|
|
ingest_ts=1724262300.0,
|
|
publish_ts=1724262200.0,
|
|
asset_mentions=[
|
|
AssetMention(asset_id="BTC", mention_span=(0, 3), confidence=0.9, source_text="BTC", mention_type="ticker"),
|
|
AssetMention(asset_id="ETH", mention_span=(10, 13), confidence=0.9, source_text="ETH", mention_type="ticker"),
|
|
],
|
|
raw_text="BTC surges to $65K as ETH follows with strong momentum. Market sentiment turns bullish.",
|
|
title="Bitcoin Surges to $65K",
|
|
url="https://coindesk.com/btc-surges",
|
|
author="John Doe",
|
|
engagement_metrics=EngagementMetrics(retweets=100, likes=500, replies=50),
|
|
content_length=200,
|
|
language="en",
|
|
metadata={"feed_url": "https://coindesk.com/feed"}
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_processed_item(sample_payload):
|
|
"""Sample processed item"""
|
|
return ProcessedItem(
|
|
payload_id="test_payload_1",
|
|
source_id=sample_payload.source_id,
|
|
source_type=sample_payload.source_type.value,
|
|
ingest_ts=sample_payload.ingest_ts,
|
|
publish_ts=sample_payload.publish_ts,
|
|
entities=[
|
|
EntityExtraction(asset_id="BTC", mention_span=(0, 3), confidence=0.9, entity_type="ticker", canonical_name="BTC"),
|
|
EntityExtraction(asset_id="ETH", mention_span=(10, 13), confidence=0.9, entity_type="ticker", canonical_name="ETH"),
|
|
],
|
|
sentiment_per_asset={
|
|
"BTC": SentimentScores(polarity=0.7, confidence=0.85, positive_prob=0.8, negative_prob=0.1, neutral_prob=0.1),
|
|
"ETH": SentimentScores(polarity=0.5, confidence=0.8, positive_prob=0.7, negative_prob=0.15, neutral_prob=0.15),
|
|
},
|
|
emotions_per_asset={
|
|
"BTC": EmotionScores(joy=0.8, fear=0.1, anger=0.05, greed=0.7, sadness=0.05, intensity=0.75),
|
|
"ETH": EmotionScores(joy=0.6, fear=0.15, anger=0.05, greed=0.5, sadness=0.05, intensity=0.6),
|
|
},
|
|
events=[
|
|
EventClassification(event_type=EventType.LISTING, confidence=0.7, assets_involved=["BTC"], key_details={}, severity=0.5),
|
|
],
|
|
temporal=TemporalAnchor(event_time=None, time_horizon="immediate", is_breaking=True, is_scheduled=False),
|
|
credibility=CredibilityScore(source_base=0.85, content_quality=0.8, engagement_authenticity=0.7, cross_source_corroboration=0.6, historical_accuracy=0.8, composite=0.78),
|
|
processed_ts=1724262305.0,
|
|
processing_latency_ms=45.2,
|
|
model_versions={"finbert": "1.0", "gemma": "3-4b"}
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_asset_sentiment():
|
|
"""Sample asset sentiment output"""
|
|
return AssetSentiment(
|
|
asset_id="BTC",
|
|
fear_state=20.0,
|
|
greed_state=80.0,
|
|
sentiment_polarity=60.0,
|
|
emotion_profile={"joy": 0.8, "fear": 0.1, "anger": 0.05, "greed": 0.7, "sadness": 0.05, "intensity": 0.75},
|
|
pump_dump=PumpDumpScore(asset_id="BTC", pump_score=75.0, dump_score=15.0, pump_confidence=0.8, dump_confidence=0.7, coordinating_sources=3, last_update_ts=1724262305.0),
|
|
event_flags=[EventFlag(event_type="listing", asset_id="BTC", strength=60.0, confidence=0.7, first_seen_ts=1724262300.0, last_seen_ts=1724262305.0, source_count=2)],
|
|
velocity=VelocityMetrics(hype_velocity=0.7, pub_velocity=0.5, velocity_direction="accelerating", window_minutes=15, source_count=3, unique_assets=1),
|
|
last_update_ts=1724262305.0,
|
|
contributing_sources=3,
|
|
decay_factor=0.95
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_market_sentiment(sample_asset_sentiment):
|
|
"""Sample market sentiment output"""
|
|
return MarketSentiment(
|
|
fear_state=25.0,
|
|
greed_state=75.0,
|
|
sentiment_index=50.0,
|
|
hype_velocity=65.0,
|
|
pub_velocity=55.0,
|
|
aggregate_pump_risk=75.0,
|
|
aggregate_dump_risk=20.0,
|
|
top_pump_assets=["BTC", "ETH", "SOL"],
|
|
top_dump_assets=[],
|
|
dominant_events=[],
|
|
industry_breakdown={},
|
|
last_update_ts=1724262305.0,
|
|
total_sources=10,
|
|
total_assets=50
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_sentiment_output(sample_market_sentiment, sample_asset_sentiment):
|
|
"""Complete sentiment output"""
|
|
industry = IndustrySentiment(
|
|
industry="Smart Contract Platform",
|
|
assets=["BTC", "ETH"],
|
|
fear_state=22.0,
|
|
greed_state=78.0,
|
|
avg_polarity=55.0,
|
|
pump_risk=75.0,
|
|
dump_risk=15.0,
|
|
dominant_events=[],
|
|
asset_count=2,
|
|
last_update_ts=1724262305.0
|
|
)
|
|
|
|
return SentimentOutput(
|
|
timestamp=1724262305.0,
|
|
market=sample_market_sentiment,
|
|
industries={"Smart Contract Platform": industry},
|
|
assets={"BTC": sample_asset_sentiment, "ETH": sample_asset_sentiment}
|
|
)
|