Files
sanguo_vnpy_v2/tests/trader/test_shadow_lock_routing.py
T

57 lines
1.7 KiB
Python

"""影子柜台 CLI 路由:--account worker 不抢全局 solo 锁(多账户并存的前提)。"""
import sys
import pytest
def _run_main(monkeypatch, argv):
from sanguo_trader.shadow import __main__ as m
calls = {"lock": 0, "shadow": 0, "auto": 0}
def _no_lock():
calls["lock"] += 1
return object()
def _shadow(*a, **k):
calls["shadow"] += 1
def _auto(*a, **k):
calls["auto"] += 1
import sanguo_trader.shadow.runner as runner_mod
import sanguo_trader.shadow.supervisor as sup
monkeypatch.setattr(m, "_acquire_lock", _no_lock)
# main() 内 lazy import:patch 源模块而非 __main__
monkeypatch.setattr(runner_mod, "run_shadow", _shadow)
monkeypatch.setattr(sup, "run_auto_supervisor", _auto)
monkeypatch.setattr(sys, "argv", ["prog", *argv])
rc = m.main()
return rc, calls
def test_account_worker_skips_global_lock(monkeypatch):
"""--account N:多账户 worker 不碰全局锁(VPS 实录 40/41「锁占用」循环退出)。"""
rc, calls = _run_main(monkeypatch, ["--account", "41"])
assert rc == 0
assert calls["shadow"] == 1
assert calls["lock"] == 0 # 关键:不抢全局 solo 锁
def test_solo_mode_still_locks(monkeypatch):
"""无 --account 的 solo 模式维持全局锁(防双开)。"""
rc, calls = _run_main(monkeypatch, [])
assert rc == 0
assert calls["shadow"] == 1
assert calls["lock"] == 1
def test_auto_mode_no_lock_no_shadow(monkeypatch):
"""--auto 主管:既不抢锁也不起柜台。"""
rc, calls = _run_main(monkeypatch, ["--auto"])
assert rc == 0
assert calls["auto"] == 1
assert calls["lock"] == 0
assert calls["shadow"] == 0