Files
Hydra-Engine/tests/test_order_queue.py
2026-03-30 13:19:11 +09:00

50 lines
1.9 KiB
Python

import pytest
from unittest.mock import AsyncMock, MagicMock
from hydra.core.order_queue import OrderQueue, OrderRequest, OrderLockError
@pytest.fixture
def queue(mock_redis, mock_exchange):
risk = MagicMock()
risk.check_order_allowed.return_value = (True, "ok")
positions = MagicMock()
exchanges = {"kr": mock_exchange}
mock_exchange.create_order = AsyncMock(return_value={"order_id": "ORD123", "status": "filled"})
return OrderQueue(redis_client=mock_redis, risk_engine=risk, position_tracker=positions, exchanges=exchanges)
@pytest.mark.asyncio
async def test_order_submitted_successfully(queue, mock_redis):
mock_redis.set.return_value = True # lock acquired
mock_redis.get.return_value = None # no idempotency hit
order = OrderRequest(market="kr", symbol="005930", side="buy", qty=10)
result = await queue.submit(order)
assert result.order_id is not None
@pytest.mark.asyncio
async def test_duplicate_lock_raises(queue, mock_redis):
mock_redis.set.return_value = False # lock already held
mock_redis.get.return_value = None
order = OrderRequest(market="kr", symbol="005930", side="buy", qty=10)
with pytest.raises(OrderLockError):
await queue.submit(order)
@pytest.mark.asyncio
async def test_idempotency_returns_cached(queue, mock_redis):
import json
cached = json.dumps({"order_id": "CACHED_ID", "status": "filled"})
mock_redis.get.return_value = cached
order = OrderRequest(market="kr", symbol="005930", side="buy", qty=10, idempotency_key="fixed-key")
result = await queue.submit(order)
assert result.order_id == "CACHED_ID"
@pytest.mark.asyncio
async def test_blocked_when_kill_switch_active(queue, mock_redis):
mock_redis.get.side_effect = lambda k: "1" if "kill_switch" in k else None
order = OrderRequest(market="kr", symbol="005930", side="buy", qty=10)
with pytest.raises(OrderLockError, match="Kill Switch"):
await queue.submit(order)