57 lines
1.7 KiB
Python
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
|