117 lines
4.4 KiB
Python
117 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""通用 CLI 冒烟:用法、health、version、logs、log-get(不触网、不深测 run 占位)。"""
|
||
from __future__ import annotations
|
||
|
||
import io
|
||
import json
|
||
import os
|
||
import unittest
|
||
from contextlib import redirect_stderr, redirect_stdout
|
||
|
||
from _support import IsolatedDataRoot, platform_kit_version_patch
|
||
|
||
from jiangchang_skill_core import config
|
||
|
||
# scripts/ 已由 _support 注入 sys.path
|
||
from cli.app import main
|
||
from util.constants import SKILL_SLUG
|
||
|
||
|
||
class TestCliSmoke(unittest.TestCase):
|
||
def test_main_empty_argv_shows_usage_and_nonzero(self) -> None:
|
||
buf = io.StringIO()
|
||
err = io.StringIO()
|
||
with redirect_stdout(buf), redirect_stderr(err):
|
||
rc = main([])
|
||
self.assertEqual(rc, 1)
|
||
out = buf.getvalue()
|
||
self.assertIn("Amazon 结算报表", out)
|
||
self.assertIn("health", out)
|
||
|
||
def test_health_zero(self) -> None:
|
||
old_record = os.environ.get("OPENCLAW_RECORD_VIDEO")
|
||
os.environ["OPENCLAW_RECORD_VIDEO"] = "0"
|
||
try:
|
||
buf = io.StringIO()
|
||
with platform_kit_version_patch(), redirect_stdout(buf), redirect_stderr(io.StringIO()):
|
||
rc = main(["health"])
|
||
self.assertEqual(rc, 0)
|
||
out = buf.getvalue()
|
||
self.assertIn("health:", out)
|
||
self.assertIn("python_executable:", out)
|
||
self.assertIn("platform_kit_version:", out)
|
||
self.assertIn("jiangchang_skill_core_file:", out)
|
||
finally:
|
||
if old_record is None:
|
||
os.environ.pop("OPENCLAW_RECORD_VIDEO", None)
|
||
else:
|
||
os.environ["OPENCLAW_RECORD_VIDEO"] = old_record
|
||
|
||
def test_version_json_and_matches_constants_slug(self) -> None:
|
||
buf = io.StringIO()
|
||
with redirect_stdout(buf), redirect_stderr(io.StringIO()):
|
||
rc = main(["version"])
|
||
self.assertEqual(rc, 0)
|
||
payload = json.loads(buf.getvalue().strip())
|
||
self.assertIn("version", payload)
|
||
self.assertIn("skill", payload)
|
||
self.assertEqual(payload["skill"], SKILL_SLUG)
|
||
|
||
def test_logs_empty_returns_zero(self) -> None:
|
||
with IsolatedDataRoot():
|
||
buf = io.StringIO()
|
||
with redirect_stdout(buf), redirect_stderr(io.StringIO()):
|
||
rc = main(["logs"])
|
||
self.assertEqual(rc, 0)
|
||
self.assertIn("暂无", buf.getvalue())
|
||
|
||
def test_log_get_non_numeric_returns_nonzero(self) -> None:
|
||
buf = io.StringIO()
|
||
with redirect_stdout(buf), redirect_stderr(io.StringIO()):
|
||
rc = main(["log-get", "not-a-number"])
|
||
self.assertNotEqual(rc, 0)
|
||
self.assertIn("数字", buf.getvalue())
|
||
|
||
def test_run_mock_returns_ok_json(self) -> None:
|
||
"""mock 档位 run:返回 ok JSON,退出码 0。"""
|
||
old_auth = os.environ.pop("JIANGCHANG_AUTH_BASE_URL", None)
|
||
old_record = os.environ.get("OPENCLAW_RECORD_VIDEO")
|
||
old_target = os.environ.get("OPENCLAW_TEST_TARGET")
|
||
os.environ["OPENCLAW_RECORD_VIDEO"] = "0"
|
||
os.environ["OPENCLAW_TEST_TARGET"] = "mock"
|
||
try:
|
||
with IsolatedDataRoot(user_id="_cli_run"):
|
||
config.reset_cache()
|
||
buf = io.StringIO()
|
||
with redirect_stdout(buf), redirect_stderr(io.StringIO()):
|
||
rc = main(
|
||
[
|
||
"run",
|
||
"--date-from",
|
||
"2025-12-01",
|
||
"--date-to",
|
||
"2025-12-31",
|
||
]
|
||
)
|
||
self.assertEqual(rc, 0)
|
||
payload = json.loads(buf.getvalue().strip().splitlines()[-1])
|
||
self.assertTrue(payload.get("ok"))
|
||
self.assertIn("job_id", payload)
|
||
self.assertIn("file_path", payload)
|
||
finally:
|
||
if old_auth is not None:
|
||
os.environ["JIANGCHANG_AUTH_BASE_URL"] = old_auth
|
||
if old_record is None:
|
||
os.environ.pop("OPENCLAW_RECORD_VIDEO", None)
|
||
else:
|
||
os.environ["OPENCLAW_RECORD_VIDEO"] = old_record
|
||
if old_target is None:
|
||
os.environ.pop("OPENCLAW_TEST_TARGET", None)
|
||
else:
|
||
os.environ["OPENCLAW_TEST_TARGET"] = old_target
|
||
config.reset_cache()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
unittest.main()
|