基于 skill-template 脚手架开发,包含: - payroll_config(费率配置,可编辑)+ payslip_snapshots(解析历史,只读)2 张业务表 - 全国默认 + 北上广 4 套费率(社保/公积金/个税起征点/7 级税率表) - 5 个业务 Action:calculate-payslip-simple / calculate-payslip-full / explain-term / view-config / edit-config - 个税累计预扣法计算,支持多月历史累加 - 20 个薪资名词库(社保/公积金/个税/全勤/加班费等) - 完整市场文档(README/TUTORIAL/DEMO/CHANGELOG) - 296 测试全部通过
69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""通过 subprocess 调用 ``python scripts/main.py``,验证真实入口(非仅 import main)。"""
|
||
from __future__ import annotations
|
||
|
||
import json
|
||
import os
|
||
import subprocess
|
||
import sys
|
||
import unittest
|
||
|
||
from _support import IsolatedDataRoot, get_skill_root
|
||
|
||
import importlib.metadata as metadata
|
||
|
||
from jiangchang_skill_core import version_ge
|
||
from util.constants import PLATFORM_KIT_MIN_VERSION
|
||
|
||
|
||
def _platform_kit_meets_template_minimum() -> bool:
|
||
try:
|
||
installed = metadata.version("jiangchang-platform-kit")
|
||
except metadata.PackageNotFoundError:
|
||
return False
|
||
return version_ge(installed, PLATFORM_KIT_MIN_VERSION)
|
||
|
||
|
||
def _run_main(args: list[str], timeout: int = 15) -> subprocess.CompletedProcess[str]:
|
||
root = get_skill_root()
|
||
main_py = os.path.join(root, "scripts", "main.py")
|
||
env = os.environ.copy()
|
||
env.setdefault("PYTHONIOENCODING", "utf-8")
|
||
env["PYTHONDONTWRITEBYTECODE"] = "1"
|
||
return subprocess.run(
|
||
[sys.executable, main_py, *args],
|
||
cwd=root,
|
||
env=env,
|
||
capture_output=True,
|
||
text=True,
|
||
encoding="utf-8",
|
||
errors="replace",
|
||
timeout=timeout,
|
||
)
|
||
|
||
|
||
class TestEntrypointSubprocess(unittest.TestCase):
|
||
@unittest.skipUnless(
|
||
_platform_kit_meets_template_minimum(),
|
||
f"installed jiangchang-platform-kit below template minimum {PLATFORM_KIT_MIN_VERSION}",
|
||
)
|
||
def test_health_exit_zero(self) -> None:
|
||
with IsolatedDataRoot():
|
||
cp = _run_main(["health"])
|
||
self.assertEqual(cp.returncode, 0, msg=cp.stderr + cp.stdout)
|
||
|
||
def test_version_json_and_skill_slug(self) -> None:
|
||
with IsolatedDataRoot():
|
||
cp = _run_main(["version"])
|
||
self.assertEqual(cp.returncode, 0, msg=cp.stderr + cp.stdout)
|
||
payload = json.loads(cp.stdout.strip())
|
||
self.assertIn("version", payload)
|
||
self.assertIn("skill", payload)
|
||
from util.constants import SKILL_SLUG
|
||
|
||
self.assertEqual(payload["skill"], SKILL_SLUG)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
unittest.main()
|