Enrich WeCom open/close notifies with Chinese qty, margin, and PnL.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,12 +1,21 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from app.notify.wecom import TAG_OPEN, build_markdown, venue_label
|
||||
from app.notify.wecom import (
|
||||
TAG_CLOSE,
|
||||
TAG_OPEN,
|
||||
build_markdown,
|
||||
close_reason_zh,
|
||||
direction_zh,
|
||||
notify_close,
|
||||
notify_open,
|
||||
venue_label,
|
||||
)
|
||||
|
||||
|
||||
def test_build_markdown_has_tag_and_title(monkeypatch):
|
||||
monkeypatch.setattr("app.notify.wecom.venue_label", lambda: "模拟盘")
|
||||
monkeypatch.setattr("app.notify.wecom.venue_label", lambda: "实盘·OKX")
|
||||
md = build_markdown(tag=TAG_OPEN, title="开仓成功", lines=["组: G-1"])
|
||||
assert "【模拟盘】开仓成功" in md
|
||||
assert "【实盘·OKX】开仓成功" in md
|
||||
assert "`OPEN`" in md
|
||||
assert "组: G-1" in md
|
||||
|
||||
@@ -17,4 +26,78 @@ def test_venue_label_sim(monkeypatch):
|
||||
exchange = "okx"
|
||||
|
||||
monkeypatch.setattr("app.notify.wecom.get_settings", lambda: S())
|
||||
assert venue_label() == "模拟盘"
|
||||
assert venue_label() is None
|
||||
|
||||
|
||||
def test_direction_and_close_reason_zh() -> None:
|
||||
assert "Put" in direction_zh({"option_side": "put", "perp_side": "long"})
|
||||
assert close_reason_zh("liquidity_retry") == "等待流动性后全平"
|
||||
assert close_reason_zh("fixed_usdt") == "固定净盈利达标·双腿全平"
|
||||
|
||||
|
||||
def test_notify_open_close_markdown(monkeypatch) -> None:
|
||||
captured: list[str] = []
|
||||
|
||||
monkeypatch.setattr("app.notify.wecom.wecom_enabled", lambda: True)
|
||||
monkeypatch.setattr("app.notify.wecom.wecom_webhook_url", lambda: "http://example.test")
|
||||
monkeypatch.setattr("app.notify.wecom.venue_label", lambda: None)
|
||||
monkeypatch.setattr("app.notify.wecom.wecom_machine_name", lambda: "")
|
||||
|
||||
def _capture(content: str):
|
||||
captured.append(content)
|
||||
return True, "ok"
|
||||
|
||||
monkeypatch.setattr("app.notify.wecom._post_markdown_sync", _capture)
|
||||
monkeypatch.setattr(
|
||||
"app.notify.wecom.notify_async",
|
||||
lambda content: captured.append(content),
|
||||
)
|
||||
|
||||
notify_open(
|
||||
group_id="G-20260802-01",
|
||||
detail="opened",
|
||||
extra={
|
||||
"bias": "put_ask_gt_call",
|
||||
"option_side": "put",
|
||||
"perp_side": "long",
|
||||
"option_inst_id": "ETH-USD-260802-1850-P",
|
||||
"strike": 1850,
|
||||
"expiry_ymd": "260802",
|
||||
"perp_qty_eth": 1.0,
|
||||
"option_qty_eth": 2.0,
|
||||
"perp_entry_px": 1860.5,
|
||||
"option_entry_px": 12.3,
|
||||
"initial_premium": 24.6,
|
||||
"perp_margin": 620.0,
|
||||
"leverage": 3,
|
||||
},
|
||||
)
|
||||
assert captured
|
||||
open_md = captured[-1]
|
||||
assert "开仓成功" in open_md
|
||||
assert "`OPEN`" in open_md or TAG_OPEN in open_md
|
||||
assert "权利金占用" in open_md
|
||||
assert "保证金占用" in open_md
|
||||
assert "开仓数量" in open_md
|
||||
assert "买Put" in open_md
|
||||
|
||||
captured.clear()
|
||||
notify_close(
|
||||
reason="liquidity_retry",
|
||||
detail="closed",
|
||||
data={
|
||||
"group_id": "G-20260802-01",
|
||||
"perp_pnl": -10.5,
|
||||
"option_pnl": 40.2,
|
||||
"net": 25.0,
|
||||
"fees": 4.5,
|
||||
},
|
||||
)
|
||||
close_md = captured[-1]
|
||||
assert "平仓" in close_md
|
||||
assert TAG_CLOSE in close_md or "`CLOSE`" in close_md
|
||||
assert "等待流动性后全平" in close_md
|
||||
assert "永续盈亏" in close_md
|
||||
assert "期权盈亏" in close_md
|
||||
assert "净利润" in close_md
|
||||
assert "+25.00U" in close_md or "25.00U" in close_md
|
||||
|
||||
Reference in New Issue
Block a user