#!/usr/bin/env python3 """ Integration test script for COBY system components. Run this to test the TimescaleDB integration and basic functionality. """ import asyncio import sys from datetime import datetime, timezone from pathlib import Path # Add COBY to path sys.path.insert(0, str(Path(__file__).parent)) from config import config from storage.timescale_manager import TimescaleManager from models.core import OrderBookSnapshot, TradeEvent, PriceLevel from utils.logging import setup_logging, get_logger # Setup logging setup_logging(level='INFO', console_output=True) logger = get_logger(__name__) async def test_database_connection(): """Test basic database connectivity""" logger.info("๐Ÿ”Œ Testing database connection...") try: manager = TimescaleManager() await manager.initialize() # Test health check is_healthy = await manager.health_check() if is_healthy: logger.info("โœ… Database connection: HEALTHY") else: logger.error("โŒ Database connection: UNHEALTHY") return False # Test storage stats stats = await manager.get_storage_stats() logger.info(f"๐Ÿ“Š Found {len(stats.get('table_sizes', []))} tables") for table_info in stats.get('table_sizes', []): logger.info(f" ๐Ÿ“‹ {table_info['table']}: {table_info['size']}") await manager.close() return True except Exception as e: logger.error(f"โŒ Database test failed: {e}") return False async def test_data_storage(): """Test storing and retrieving data""" logger.info("๐Ÿ’พ Testing data storage operations...") try: manager = TimescaleManager() await manager.initialize() # Create test order book test_orderbook = OrderBookSnapshot( symbol="BTCUSDT", exchange="test_exchange", timestamp=datetime.now(timezone.utc), bids=[ PriceLevel(price=50000.0, size=1.5, count=3), PriceLevel(price=49999.0, size=2.0, count=5) ], asks=[ PriceLevel(price=50001.0, size=1.0, count=2), PriceLevel(price=50002.0, size=1.5, count=4) ], sequence_id=12345 ) # Test storing order book result = await manager.store_orderbook(test_orderbook) if result: logger.info("โœ… Order book storage: SUCCESS") else: logger.error("โŒ Order book storage: FAILED") return False # Test retrieving order book retrieved = await manager.get_latest_orderbook("BTCUSDT", "test_exchange") if retrieved: logger.info(f"โœ… Order book retrieval: SUCCESS (mid_price: {retrieved.mid_price})") else: logger.error("โŒ Order book retrieval: FAILED") return False # Create test trade test_trade = TradeEvent( symbol="BTCUSDT", exchange="test_exchange", timestamp=datetime.now(timezone.utc), price=50000.5, size=0.1, side="buy", trade_id="test_trade_123" ) # Test storing trade result = await manager.store_trade(test_trade) if result: logger.info("โœ… Trade storage: SUCCESS") else: logger.error("โŒ Trade storage: FAILED") return False await manager.close() return True except Exception as e: logger.error(f"โŒ Data storage test failed: {e}") return False async def test_batch_operations(): """Test batch storage operations""" logger.info("๐Ÿ“ฆ Testing batch operations...") try: manager = TimescaleManager() await manager.initialize() # Create batch of order books orderbooks = [] for i in range(5): orderbook = OrderBookSnapshot( symbol="ETHUSDT", exchange="test_exchange", timestamp=datetime.now(timezone.utc), bids=[PriceLevel(price=3000.0 + i, size=1.0)], asks=[PriceLevel(price=3001.0 + i, size=1.0)], sequence_id=i ) orderbooks.append(orderbook) # Test batch storage result = await manager.batch_store_orderbooks(orderbooks) if result == 5: logger.info(f"โœ… Batch order book storage: SUCCESS ({result} records)") else: logger.error(f"โŒ Batch order book storage: PARTIAL ({result}/5 records)") return False # Create batch of trades trades = [] for i in range(10): trade = TradeEvent( symbol="ETHUSDT", exchange="test_exchange", timestamp=datetime.now(timezone.utc), price=3000.0 + (i * 0.1), size=0.05, side="buy" if i % 2 == 0 else "sell", trade_id=f"batch_trade_{i}" ) trades.append(trade) # Test batch trade storage result = await manager.batch_store_trades(trades) if result == 10: logger.info(f"โœ… Batch trade storage: SUCCESS ({result} records)") else: logger.error(f"โŒ Batch trade storage: PARTIAL ({result}/10 records)") return False await manager.close() return True except Exception as e: logger.error(f"โŒ Batch operations test failed: {e}") return False async def test_configuration(): """Test configuration system""" logger.info("โš™๏ธ Testing configuration system...") try: # Test database configuration db_url = config.get_database_url() logger.info(f"โœ… Database URL: {db_url.replace(config.database.password, '***')}") # Test Redis configuration redis_url = config.get_redis_url() logger.info(f"โœ… Redis URL: {redis_url.replace(config.redis.password, '***')}") # Test bucket sizes btc_bucket = config.get_bucket_size('BTCUSDT') eth_bucket = config.get_bucket_size('ETHUSDT') logger.info(f"โœ… Bucket sizes: BTC=${btc_bucket}, ETH=${eth_bucket}") # Test configuration dict config_dict = config.to_dict() logger.info(f"โœ… Configuration loaded: {len(config_dict)} sections") return True except Exception as e: logger.error(f"โŒ Configuration test failed: {e}") return False async def run_all_tests(): """Run all integration tests""" logger.info("๐Ÿš€ Starting COBY Integration Tests") logger.info("=" * 50) tests = [ ("Configuration", test_configuration), ("Database Connection", test_database_connection), ("Data Storage", test_data_storage), ("Batch Operations", test_batch_operations) ] results = [] for test_name, test_func in tests: logger.info(f"\n๐Ÿงช Running {test_name} test...") try: result = await test_func() results.append((test_name, result)) if result: logger.info(f"โœ… {test_name}: PASSED") else: logger.error(f"โŒ {test_name}: FAILED") except Exception as e: logger.error(f"โŒ {test_name}: ERROR - {e}") results.append((test_name, False)) # Summary logger.info("\n" + "=" * 50) logger.info("๐Ÿ“‹ TEST SUMMARY") logger.info("=" * 50) passed = sum(1 for _, result in results if result) total = len(results) for test_name, result in results: status = "โœ… PASSED" if result else "โŒ FAILED" logger.info(f"{test_name:20} {status}") logger.info(f"\nOverall: {passed}/{total} tests passed") if passed == total: logger.info("๐ŸŽ‰ All tests passed! System is ready.") return True else: logger.error("โš ๏ธ Some tests failed. Check configuration and database connection.") return False if __name__ == "__main__": print("COBY Integration Test Suite") print("=" * 30) # Run tests success = asyncio.run(run_all_tests()) if success: print("\n๐ŸŽ‰ Integration tests completed successfully!") print("The system is ready for the next development phase.") sys.exit(0) else: print("\nโŒ Integration tests failed!") print("Please check the logs and fix any issues before proceeding.") sys.exit(1)