|
|
|
|
|
""" |
|
|
تست کامل بانک اطلاعاتی رمزارز |
|
|
Complete Crypto Data Bank Test Suite |
|
|
""" |
|
|
|
|
|
import asyncio |
|
|
import sys |
|
|
from pathlib import Path |
|
|
|
|
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent)) |
|
|
|
|
|
from crypto_data_bank.collectors.free_price_collector import FreePriceCollector |
|
|
from crypto_data_bank.collectors.rss_news_collector import RSSNewsCollector |
|
|
from crypto_data_bank.collectors.sentiment_collector import SentimentCollector |
|
|
from crypto_data_bank.ai.huggingface_models import get_analyzer |
|
|
from crypto_data_bank.database import get_db |
|
|
from crypto_data_bank.orchestrator import get_orchestrator |
|
|
|
|
|
|
|
|
async def test_price_collectors(): |
|
|
"""Test price collectors""" |
|
|
print("\n" + "="*70) |
|
|
print("💰 Testing Price Collectors") |
|
|
print("="*70) |
|
|
|
|
|
collector = FreePriceCollector() |
|
|
|
|
|
symbols = ["BTC", "ETH", "SOL"] |
|
|
|
|
|
|
|
|
print("\nTesting individual sources...") |
|
|
|
|
|
try: |
|
|
coincap = await collector.collect_from_coincap(symbols) |
|
|
print(f"✅ CoinCap: {len(coincap)} prices") |
|
|
except Exception as e: |
|
|
print(f"⚠️ CoinCap: {e}") |
|
|
|
|
|
try: |
|
|
coingecko = await collector.collect_from_coingecko(symbols) |
|
|
print(f"✅ CoinGecko: {len(coingecko)} prices") |
|
|
except Exception as e: |
|
|
print(f"⚠️ CoinGecko: {e}") |
|
|
|
|
|
try: |
|
|
binance = await collector.collect_from_binance_public(symbols) |
|
|
print(f"✅ Binance: {len(binance)} prices") |
|
|
except Exception as e: |
|
|
print(f"⚠️ Binance: {e}") |
|
|
|
|
|
|
|
|
print("\nTesting aggregation...") |
|
|
all_prices = await collector.collect_all_free_sources(symbols) |
|
|
aggregated = collector.aggregate_prices(all_prices) |
|
|
|
|
|
print(f"\n✅ Aggregated {len(aggregated)} prices from multiple sources") |
|
|
|
|
|
if aggregated: |
|
|
print("\nSample prices:") |
|
|
for price in aggregated[:3]: |
|
|
print(f" {price['symbol']}: ${price['price']:,.2f} (from {price.get('sources_count', 0)} sources)") |
|
|
|
|
|
return len(aggregated) > 0 |
|
|
|
|
|
|
|
|
async def test_news_collectors(): |
|
|
"""Test news collectors""" |
|
|
print("\n" + "="*70) |
|
|
print("📰 Testing News Collectors") |
|
|
print("="*70) |
|
|
|
|
|
collector = RSSNewsCollector() |
|
|
|
|
|
print("\nTesting RSS feeds...") |
|
|
|
|
|
try: |
|
|
cointelegraph = await collector.collect_from_cointelegraph() |
|
|
print(f"✅ CoinTelegraph: {len(cointelegraph)} news") |
|
|
except Exception as e: |
|
|
print(f"⚠️ CoinTelegraph: {e}") |
|
|
|
|
|
try: |
|
|
coindesk = await collector.collect_from_coindesk() |
|
|
print(f"✅ CoinDesk: {len(coindesk)} news") |
|
|
except Exception as e: |
|
|
print(f"⚠️ CoinDesk: {e}") |
|
|
|
|
|
|
|
|
print("\nTesting all RSS feeds...") |
|
|
all_news = await collector.collect_all_rss_feeds() |
|
|
total = sum(len(v) for v in all_news.values()) |
|
|
print(f"\n✅ Collected {total} news items from {len(all_news)} sources") |
|
|
|
|
|
|
|
|
unique_news = collector.deduplicate_news(all_news) |
|
|
print(f"✅ Deduplicated to {len(unique_news)} unique items") |
|
|
|
|
|
if unique_news: |
|
|
print("\nLatest news:") |
|
|
for news in unique_news[:3]: |
|
|
print(f" • {news['title'][:60]}...") |
|
|
print(f" Source: {news['source']}") |
|
|
|
|
|
|
|
|
trending = collector.get_trending_coins(unique_news) |
|
|
if trending: |
|
|
print("\nTrending coins:") |
|
|
for coin in trending[:5]: |
|
|
print(f" {coin['coin']}: {coin['mentions']} mentions") |
|
|
|
|
|
return len(unique_news) > 0 |
|
|
|
|
|
|
|
|
async def test_sentiment_collectors(): |
|
|
"""Test sentiment collectors""" |
|
|
print("\n" + "="*70) |
|
|
print("😊 Testing Sentiment Collectors") |
|
|
print("="*70) |
|
|
|
|
|
collector = SentimentCollector() |
|
|
|
|
|
|
|
|
print("\nTesting Fear & Greed Index...") |
|
|
try: |
|
|
fg = await collector.collect_fear_greed_index() |
|
|
if fg: |
|
|
print(f"✅ Fear & Greed: {fg['fear_greed_value']}/100 ({fg['fear_greed_classification']})") |
|
|
else: |
|
|
print("⚠️ Fear & Greed: No data") |
|
|
except Exception as e: |
|
|
print(f"⚠️ Fear & Greed: {e}") |
|
|
|
|
|
|
|
|
print("\nTesting all sentiment sources...") |
|
|
all_sentiment = await collector.collect_all_sentiment_data() |
|
|
|
|
|
if all_sentiment.get('overall_sentiment'): |
|
|
overall = all_sentiment['overall_sentiment'] |
|
|
print(f"\n✅ Overall Sentiment: {overall['overall_sentiment']}") |
|
|
print(f" Score: {overall['sentiment_score']}/100") |
|
|
print(f" Confidence: {overall['confidence']:.2%}") |
|
|
|
|
|
return all_sentiment.get('overall_sentiment') is not None |
|
|
|
|
|
|
|
|
async def test_ai_models(): |
|
|
"""Test AI models""" |
|
|
print("\n" + "="*70) |
|
|
print("🤖 Testing AI Models") |
|
|
print("="*70) |
|
|
|
|
|
analyzer = get_analyzer() |
|
|
|
|
|
|
|
|
print("\nTesting sentiment analysis...") |
|
|
test_texts = [ |
|
|
"Bitcoin surges past $50,000 as institutional adoption accelerates", |
|
|
"SEC delays crypto ETF decision, causing market uncertainty", |
|
|
"Ethereum successfully completes major network upgrade" |
|
|
] |
|
|
|
|
|
for i, text in enumerate(test_texts, 1): |
|
|
result = await analyzer.analyze_news_sentiment(text) |
|
|
print(f"\n{i}. {text[:50]}...") |
|
|
print(f" Sentiment: {result['sentiment']}") |
|
|
print(f" Confidence: {result.get('confidence', 0):.2%}") |
|
|
|
|
|
return True |
|
|
|
|
|
|
|
|
async def test_database(): |
|
|
"""Test database operations""" |
|
|
print("\n" + "="*70) |
|
|
print("💾 Testing Database") |
|
|
print("="*70) |
|
|
|
|
|
db = get_db() |
|
|
|
|
|
|
|
|
print("\nTesting price storage...") |
|
|
test_price = { |
|
|
'price': 50000.0, |
|
|
'priceUsd': 50000.0, |
|
|
'change24h': 2.5, |
|
|
'volume24h': 25000000000, |
|
|
'marketCap': 980000000000, |
|
|
} |
|
|
|
|
|
try: |
|
|
db.save_price('BTC', test_price, 'test') |
|
|
print("✅ Price saved successfully") |
|
|
except Exception as e: |
|
|
print(f"❌ Failed to save price: {e}") |
|
|
return False |
|
|
|
|
|
|
|
|
print("\nTesting price retrieval...") |
|
|
try: |
|
|
latest_prices = db.get_latest_prices(['BTC'], 1) |
|
|
print(f"✅ Retrieved {len(latest_prices)} prices") |
|
|
except Exception as e: |
|
|
print(f"❌ Failed to retrieve prices: {e}") |
|
|
return False |
|
|
|
|
|
|
|
|
print("\nDatabase statistics:") |
|
|
stats = db.get_statistics() |
|
|
print(f" Prices: {stats.get('prices_count', 0)}") |
|
|
print(f" News: {stats.get('news_count', 0)}") |
|
|
print(f" AI Analysis: {stats.get('ai_analysis_count', 0)}") |
|
|
print(f" Database size: {stats.get('database_size', 0):,} bytes") |
|
|
|
|
|
return True |
|
|
|
|
|
|
|
|
async def test_orchestrator(): |
|
|
"""Test orchestrator""" |
|
|
print("\n" + "="*70) |
|
|
print("🎯 Testing Orchestrator") |
|
|
print("="*70) |
|
|
|
|
|
orchestrator = get_orchestrator() |
|
|
|
|
|
|
|
|
print("\nTesting single collection cycle...") |
|
|
results = await orchestrator.collect_all_data_once() |
|
|
|
|
|
print(f"\n✅ Collection Results:") |
|
|
if results.get('prices', {}).get('success'): |
|
|
print(f" Prices: {results['prices'].get('prices_saved', 0)} saved") |
|
|
else: |
|
|
print(f" Prices: ⚠️ {results.get('prices', {}).get('error', 'Failed')}") |
|
|
|
|
|
if results.get('news', {}).get('success'): |
|
|
print(f" News: {results['news'].get('news_saved', 0)} saved") |
|
|
else: |
|
|
print(f" News: ⚠️ {results.get('news', {}).get('error', 'Failed')}") |
|
|
|
|
|
if results.get('sentiment', {}).get('success'): |
|
|
print(f" Sentiment: ✅ Success") |
|
|
else: |
|
|
print(f" Sentiment: ⚠️ Failed") |
|
|
|
|
|
|
|
|
status = orchestrator.get_collection_status() |
|
|
print(f"\n📊 Collection Status:") |
|
|
print(f" Running: {status['is_running']}") |
|
|
print(f" Last collection: {status.get('last_collection', {})}") |
|
|
|
|
|
return results.get('prices', {}).get('success', False) |
|
|
|
|
|
|
|
|
async def main(): |
|
|
"""Run all tests""" |
|
|
print("\n" + "🧪"*35) |
|
|
print("CRYPTO DATA BANK - COMPREHENSIVE TEST SUITE") |
|
|
print("تست جامع بانک اطلاعاتی رمزارز") |
|
|
print("🧪"*35) |
|
|
|
|
|
results = {} |
|
|
|
|
|
|
|
|
try: |
|
|
results['price_collectors'] = await test_price_collectors() |
|
|
except Exception as e: |
|
|
print(f"\n❌ Price collectors test failed: {e}") |
|
|
results['price_collectors'] = False |
|
|
|
|
|
try: |
|
|
results['news_collectors'] = await test_news_collectors() |
|
|
except Exception as e: |
|
|
print(f"\n❌ News collectors test failed: {e}") |
|
|
results['news_collectors'] = False |
|
|
|
|
|
try: |
|
|
results['sentiment_collectors'] = await test_sentiment_collectors() |
|
|
except Exception as e: |
|
|
print(f"\n❌ Sentiment collectors test failed: {e}") |
|
|
results['sentiment_collectors'] = False |
|
|
|
|
|
try: |
|
|
results['ai_models'] = await test_ai_models() |
|
|
except Exception as e: |
|
|
print(f"\n❌ AI models test failed: {e}") |
|
|
results['ai_models'] = False |
|
|
|
|
|
try: |
|
|
results['database'] = await test_database() |
|
|
except Exception as e: |
|
|
print(f"\n❌ Database test failed: {e}") |
|
|
results['database'] = False |
|
|
|
|
|
try: |
|
|
results['orchestrator'] = await test_orchestrator() |
|
|
except Exception as e: |
|
|
print(f"\n❌ Orchestrator test failed: {e}") |
|
|
results['orchestrator'] = False |
|
|
|
|
|
|
|
|
print("\n" + "="*70) |
|
|
print("📊 TEST SUMMARY | خلاصه تستها") |
|
|
print("="*70) |
|
|
|
|
|
passed = sum(1 for v in results.values() if v) |
|
|
total = len(results) |
|
|
|
|
|
for test_name, success in results.items(): |
|
|
status = "✅ PASSED" if success else "❌ FAILED" |
|
|
print(f"{status} - {test_name.replace('_', ' ').title()}") |
|
|
|
|
|
print("\n" + "="*70) |
|
|
print(f"Results: {passed}/{total} tests passed ({passed/total*100:.0f}%)") |
|
|
print("="*70) |
|
|
|
|
|
if passed == total: |
|
|
print("\n🎉 ALL TESTS PASSED! System is ready to use!") |
|
|
print("🎉 همه تستها موفق! سیستم آماده استفاده است!") |
|
|
return 0 |
|
|
else: |
|
|
print(f"\n⚠️ {total - passed} test(s) failed. Please review the errors above.") |
|
|
print(f"⚠️ {total - passed} تست ناموفق. لطفاً خطاها را بررسی کنید.") |
|
|
return 1 |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
exit_code = asyncio.run(main()) |
|
|
sys.exit(exit_code) |
|
|
|