feat(V2): IBKR write methods + auto-confirm warning flow
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -152,3 +152,56 @@ async def test_resolve_conid_malformed_response_raises(httpx_mock: HTTPXMock, cl
|
||||
)
|
||||
with pytest.raises(IBKRError, match="malformed"):
|
||||
await client.resolve_conid("BAD", "STK")
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_place_order_auto_confirms_warning(httpx_mock: HTTPXMock, client):
|
||||
httpx_mock.add_response(url=re.compile(r".*/tickle"), json={})
|
||||
httpx_mock.add_response(
|
||||
url=re.compile(r".*/trsrv/secdef/search"),
|
||||
json=[{"conid": 265598, "symbol": "AAPL", "secType": "STK"}],
|
||||
)
|
||||
httpx_mock.add_response(
|
||||
url=re.compile(r".*/iserver/account/DU1234/orders$"),
|
||||
method="POST",
|
||||
json=[{"id": "msgid1", "message": ["outside RTH"]}],
|
||||
)
|
||||
httpx_mock.add_response(
|
||||
url=re.compile(r".*/iserver/reply/msgid1"),
|
||||
method="POST",
|
||||
json=[{"order_id": "OID42", "order_status": "Submitted"}],
|
||||
)
|
||||
res = await client.place_order(
|
||||
symbol="AAPL", side="buy", qty=1, order_type="market",
|
||||
)
|
||||
assert res["order_id"] == "OID42"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_place_order_rejects_critical_warning(httpx_mock: HTTPXMock, client):
|
||||
httpx_mock.add_response(url=re.compile(r".*/tickle"), json={})
|
||||
httpx_mock.add_response(
|
||||
url=re.compile(r".*/trsrv/secdef/search"),
|
||||
json=[{"conid": 265598, "symbol": "AAPL", "secType": "STK"}],
|
||||
)
|
||||
httpx_mock.add_response(
|
||||
url=re.compile(r".*/iserver/account/DU1234/orders$"),
|
||||
method="POST",
|
||||
json=[{"id": "msgid2", "message": ["Margin requirement exceeded"]}],
|
||||
)
|
||||
with pytest.raises(IBKRError, match="IBKR_ORDER_REJECTED_WARNING"):
|
||||
await client.place_order(
|
||||
symbol="AAPL", side="buy", qty=1000000, order_type="market",
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_cancel_order(httpx_mock: HTTPXMock, client):
|
||||
httpx_mock.add_response(url=re.compile(r".*/tickle"), json={})
|
||||
httpx_mock.add_response(
|
||||
url=re.compile(r".*/iserver/account/DU1234/order/OID42"),
|
||||
method="DELETE",
|
||||
json={"msg": "Request was submitted", "order_id": "OID42"},
|
||||
)
|
||||
res = await client.cancel_order("OID42")
|
||||
assert res["canceled"] is True
|
||||
|
||||
Reference in New Issue
Block a user