fix: persist uncertain cancel outcomes

This commit is contained in:
jordan
2026-07-29 17:17:14 +09:00
parent a656350a35
commit 3dd8eefc92
21 changed files with 416 additions and 76 deletions
+39 -4
View File
@@ -26,12 +26,13 @@ from __future__ import annotations
from datetime import datetime, timedelta, timezone
from decimal import Decimal
import httpx
import pytest
from trex_core.adapters.broker import kis as kis_mod
from trex_core.adapters.broker.kis import KISBroker, resolve_order_venue
from trex_core.adapters.broker.paper import PaperBroker
from trex_core.application.broker_port import OrderRequest
from trex_core.application.broker_port import CancelState, OrderRequest
_MOCK_URL = "https://openapivts.koreainvestment.com:29443"
_LIVE_URL = "https://openapi.koreainvestment.com:9443"
@@ -218,7 +219,7 @@ def test_paper_cancel_venue_ignored():
ack = b.submit_order(req)
# NXT venue로 cancel — paper는 venue 무관하게 취소 성공
result = b.cancel_order(ack.broker_order_id, side="buy", symbol="005930", qty=5, venue="NXT")
assert result is True
assert result.state is CancelState.REQUESTED
def test_paper_cancel_default_venue():
@@ -227,7 +228,7 @@ def test_paper_cancel_default_venue():
req = OrderRequest(slot_id="s1", side="buy", symbol="005930", qty=3)
ack = b.submit_order(req)
result = b.cancel_order(ack.broker_order_id, side="buy", symbol="005930", qty=3)
assert result is True
assert result.state is CancelState.REQUESTED
# ---------------------------------------------------------------------------
@@ -301,6 +302,40 @@ def test_cancel_order_krx_includes_excg(monkeypatch):
assert captured["body"]["EXCG_ID_DVSN_CD"] == "KRX"
def test_cancel_explicit_broker_rejection_is_distinct(monkeypatch):
def fake_post(url, headers=None, json=None, timeout=None):
return _FakeResp({"rt_cd": "1", "msg_cd": "ORDER_NOT_CANCELLABLE"})
b = _mock_broker()
monkeypatch.setattr(kis_mod.httpx, "post", fake_post)
outcome = b.cancel_order(
"06010:0000123456",
side="buy",
symbol="005930",
qty=1,
)
assert outcome.state is CancelState.REJECTED
assert outcome.reason == "ORDER_NOT_CANCELLABLE"
def test_cancel_transport_loss_is_unknown(monkeypatch):
def fake_post(url, headers=None, json=None, timeout=None):
raise httpx.ReadTimeout("timed out")
b = _mock_broker()
monkeypatch.setattr(kis_mod.httpx, "post", fake_post)
outcome = b.cancel_order(
"06010:0000123456",
side="buy",
symbol="005930",
qty=1,
)
assert outcome.state is CancelState.UNKNOWN
assert outcome.reason == "transport_failed"
# ---------------------------------------------------------------------------
# REQ-118 AC-5: get_current_price 기본 market=J
# ---------------------------------------------------------------------------
@@ -422,4 +457,4 @@ def test_paper_cancel_backward_compat_no_venue():
ack = b.submit_order(req)
# 기존 스타일 호출 (venue 없음)
result = b.cancel_order(ack.broker_order_id, side="sell", symbol="005930", qty=2)
assert result is True
assert result.state is CancelState.REQUESTED