| |
| """ |
| تست کامل بانک اطلاعاتی رمزارز |
| 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) |
|
|