"""Tests for payload schemas""" import pytest from datetime import datetime from sentiment_engine.schemas.payload import NormalizedPayload, SourceType, AssetMention, EngagementMetrics class TestNormalizedPayload: """Tests for NormalizedPayload schema""" def test_valid_payload(self): payload = NormalizedPayload( source_id="test_source", source_type=SourceType.NEWS, source_credibility_base=0.8, ingest_ts=datetime.now().timestamp(), publish_ts=datetime.now().timestamp(), asset_mentions=[AssetMention(asset_id="BTC", mention_span=(0, 3), confidence=0.9, source_text="BTC", mention_type="ticker")], raw_text="BTC surges to new highs", title="BTC Surges", url="https://test.com", author="Test Author", content_length=100, language="en" ) assert payload.source_id == "test_source" assert payload.has_assets is True assert payload.get_assets() == ["BTC"] def test_empty_text_raises(self): with pytest.raises(ValueError, match="raw_text cannot be empty"): NormalizedPayload( source_id="test", source_type=SourceType.NEWS, source_credibility_base=0.5, ingest_ts=1234567890.0, raw_text="", content_length=0, language="en" ) def test_whitespace_text_raises(self): with pytest.raises(ValueError, match="raw_text cannot be empty"): NormalizedPayload( source_id="test", source_type=SourceType.NEWS, source_credibility_base=0.5, ingest_ts=1234567890.0, raw_text=" ", content_length=0, language="en" ) class TestAssetMention: """Tests for AssetMention schema""" def test_valid_mention(self): mention = AssetMention( asset_id="BTC", mention_span=(0, 3), confidence=0.9, source_text="BTC", mention_type="ticker" ) assert mention.asset_id == "BTC" assert mention.confidence == 0.9 class TestEngagementMetrics: """Tests for EngagementMetrics""" def test_total_engagement(self): metrics = EngagementMetrics(retweets=10, likes=50, replies=5, upvotes=100, comments=20) assert metrics.total_engagement() == 185 def test_default_zero(self): metrics = EngagementMetrics() assert metrics.total_engagement() == 0 class TestSourceType: """Tests for SourceType enum""" def test_all_values(self): assert SourceType.NEWS == "news" assert SourceType.SOCIAL == "social" assert SourceType.EXCHANGE_ANN == "exchange_ann" assert SourceType.REGULATORY == "regulatory" assert SourceType.CORPORATE == "corporate" assert SourceType.FORUM == "forum" assert SourceType.ON_CHAIN == "on_chain"