diff options
Diffstat (limited to 'shared/tests/test_models.py')
| -rw-r--r-- | shared/tests/test_models.py | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/shared/tests/test_models.py b/shared/tests/test_models.py new file mode 100644 index 0000000..f1d92ec --- /dev/null +++ b/shared/tests/test_models.py @@ -0,0 +1,100 @@ +"""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") |
