Explorar el Código

fix: validate hedge mode payload

lxy hace 1 mes
padre
commit
919320a600
Se han modificado 2 ficheros con 16 adiciones y 1 borrados
  1. 4 1
      okx_codex_trader/okx_client.py
  2. 12 0
      tests/test_okx_client.py

+ 4 - 1
okx_codex_trader/okx_client.py

@@ -188,7 +188,10 @@ class OkxClient:
     def ensure_hedge_mode(self) -> None:
         data = self._request("GET", "/api/v5/account/config")
         config = self._first_item(data)
-        if config.get("posMode") != "long_short_mode":
+        pos_mode = config.get("posMode")
+        if not isinstance(pos_mode, str):
+            raise self._invalid_payload()
+        if pos_mode != "long_short_mode":
             raise ValueError("hedge mode is required")
 
     def set_leverage(self, symbol: str, leverage: int, pos_side: str) -> None:

+ 12 - 0
tests/test_okx_client.py

@@ -156,6 +156,10 @@ def account_config_response(pos_mode: str) -> DummyResponse:
     return DummyResponse({"code": "0", "msg": "", "data": [{"posMode": pos_mode}]})
 
 
+def malformed_account_config_response(pos_mode: object) -> DummyResponse:
+    return DummyResponse({"code": "0", "msg": "", "data": [{"posMode": pos_mode}]})
+
+
 def leverage_response() -> DummyResponse:
     return DummyResponse({"code": "0", "msg": "", "data": [{"lever": "2"}]})
 
@@ -563,6 +567,14 @@ def test_place_demo_order_fails_when_not_hedge_mode():
         client.place_demo_order(symbol="BTC-USDT-SWAP", signal=market_long_signal(), margin_usdt=100)
 
 
+def test_ensure_hedge_mode_rejects_malformed_config_payload():
+    session = DummySession([malformed_account_config_response(pos_mode=None)])
+    client = OkxClient(config=sample_config(), session=session)
+
+    with pytest.raises(ValueError, match="okx response payload is invalid"):
+        client.ensure_hedge_mode()
+
+
 def test_place_demo_order_validates_size_before_setting_leverage():
     session = DummySession(
         [