"""Tests for shared models and settings.""" import os import pytest from decimal import Decimal from datetime import datetime, timezone from unittest.mock import patch def test_settings_defaults(): """Test that Settings has correct defaults.""" with patch.dict(os.environ, { "BINANCE_API_KEY": "test_key", "BINANCE_API_SECRET": "test_secret", }): from shared.config import Settings settings = Settings() assert settings.redis_url == "redis://localhost:6379" assert settings.database_url == "postgresql://trading:trading@localhost:5432/trading" assert settings.log_level == "INFO" assert settings.risk_max_position_size == 0.1 assert settings.risk_stop_loss_pct == 5.0 assert settings.risk_daily_loss_limit_pct == 10.0 assert settings.dry_run is True def test_candle_creation(): """Test Candle model creation.""" from shared.models import Candle now = datetime.now(timezone.utc) candle = Candle( symbol="BTCUSDT", timeframe="1m", open_time=now, open=Decimal("50000.00"), high=Decimal("51000.00"), low=Decimal("49500.00"), close=Decimal("50500.00"), volume=Decimal("100.5"), ) assert candle.symbol == "BTCUSDT" assert candle.timeframe == "1m" assert candle.open == Decimal("50000.00") assert candle.high == Decimal("51000.00") assert candle.low == Decimal("49500.00") assert candle.close == Decimal("50500.00") assert candle.volume == Decimal("100.5") def test_signal_creation(): """Test Signal model creation.""" from shared.models import Signal, OrderSide signal = Signal( strategy="rsi_strategy", symbol="BTCUSDT", side=OrderSide.BUY, price=Decimal("50000.00"), quantity=Decimal("0.01"), reason="RSI oversold", ) assert signal.strategy == "rsi_strategy" assert signal.symbol == "BTCUSDT" assert signal.side == OrderSide.BUY assert signal.price == Decimal("50000.00") assert signal.quantity == Decimal("0.01") assert signal.reason == "RSI oversold" assert signal.id is not None assert signal.created_at is not None def test_order_creation(): """Test Order model creation with defaults.""" from shared.models import Order, OrderSide, OrderType, OrderStatus import uuid signal_id = str(uuid.uuid4()) order = Order( signal_id=signal_id, symbol="BTCUSDT", side=OrderSide.BUY, type=OrderType.MARKET, price=Decimal("50000.00"), quantity=Decimal("0.01"), ) assert order.id is not None assert order.signal_id == signal_id assert order.status == OrderStatus.PENDING assert order.filled_at is None assert order.created_at is not None def test_position_unrealized_pnl(): """Test Position unrealized_pnl computed property.""" from shared.models import Position position = Position( symbol="BTCUSDT", quantity=Decimal("0.1"), avg_entry_price=Decimal("50000"), current_price=Decimal("51000"), ) # 0.1 * (51000 - 50000) = 100 assert position.unrealized_pnl == Decimal("100")