补齐源快照、资料预演、正式导入及工资核算的依赖链路。 新增版本化输入、逐段 FIFO、生成锁和结构化当月调整, 并提供默认关闭的周期采集、有限重试及 Windows 托管。 原始客户资料、私有配置及首页改动不纳入本次提交。 BREAKING CHANGE: 升级前需应用新增迁移,并通过 PAYROLL_MAKER_USER_ID 绑定实际工资制作人,否则业务只读。 旧单批次核算默认关闭;历史兼容需显式启用 PAYROLL_ALLOW_LEGACY_CALCULATION。生产启用和真实金额待验收。
36 lines
1.3 KiB
Python
36 lines
1.3 KiB
Python
"""停止标记控制真实CLI领取边界,不中断正在完成的单次处理。"""
|
|
|
|
from argparse import Namespace
|
|
from contextlib import nullcontext
|
|
from types import SimpleNamespace
|
|
from unittest.mock import Mock
|
|
|
|
import pytest
|
|
|
|
from app import cli
|
|
from app.core.config import Settings
|
|
|
|
|
|
@pytest.mark.parametrize("already_stopped", [False, True])
|
|
def test_停止后不再领取下一任务(monkeypatch, tmp_path, already_stopped):
|
|
marker = tmp_path / "stop.requested"
|
|
if already_stopped:
|
|
marker.touch()
|
|
settings = Settings(_env_file=None, app_secret_key="x" * 32)
|
|
monkeypatch.setattr(cli, "get_settings", lambda: settings)
|
|
monkeypatch.setattr(cli, "get_session_factory", lambda: lambda: nullcontext(object()))
|
|
|
|
def finish(_session, **_kwargs):
|
|
marker.touch()
|
|
return "completed"
|
|
|
|
consume = Mock(side_effect=finish)
|
|
pulse = Mock()
|
|
monkeypatch.setattr(cli, "run_once", consume)
|
|
monkeypatch.setattr(cli, "get_batch", lambda *_: SimpleNamespace(status="SUCCEEDED"))
|
|
monkeypatch.setattr("app.services.tplus.automation.heartbeat", pulse)
|
|
result = cli._tplus_worker(Namespace(connection_file=None, poll_seconds=2, watch=True, stop_file=str(marker)))
|
|
assert result == 0
|
|
assert consume.call_count == (0 if already_stopped else 1)
|
|
assert pulse.call_args.args[3] == "STOPPED"
|