110 lines
4.2 KiB
Python
Executable File
110 lines
4.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
from __future__ import annotations
|
||
|
||
import subprocess
|
||
import sys
|
||
import tempfile
|
||
import unittest
|
||
from pathlib import Path
|
||
|
||
|
||
SCRIPT = Path(__file__).with_name("update_change_log.py").resolve()
|
||
|
||
|
||
def run(args: list[str], cwd: Path) -> subprocess.CompletedProcess[str]:
|
||
return subprocess.run(
|
||
args,
|
||
cwd=cwd,
|
||
text=True,
|
||
stdout=subprocess.PIPE,
|
||
stderr=subprocess.PIPE,
|
||
timeout=60,
|
||
)
|
||
|
||
|
||
class AgentChangeLogScriptTest(unittest.TestCase):
|
||
def setUp(self) -> None:
|
||
self.tmp = tempfile.TemporaryDirectory()
|
||
self.root = Path(self.tmp.name)
|
||
run(["git", "init"], self.root).check_returncode()
|
||
run(["git", "config", "user.email", "agent@example.test"], self.root).check_returncode()
|
||
run(["git", "config", "user.name", "Agent"], self.root).check_returncode()
|
||
|
||
def tearDown(self) -> None:
|
||
self.tmp.cleanup()
|
||
|
||
def commit_file(self, subject: str) -> None:
|
||
target = self.root / "file.txt"
|
||
target.write_text(subject, encoding="utf-8")
|
||
run(["git", "add", "file.txt"], self.root).check_returncode()
|
||
run(["git", "commit", "-m", subject], self.root).check_returncode()
|
||
|
||
def test_bug_log_written_under_date_dev_logs_bugs(self) -> None:
|
||
self.commit_file("fix: keep draft preview after save failure")
|
||
|
||
result = run(
|
||
[
|
||
sys.executable,
|
||
str(SCRIPT),
|
||
"--kind",
|
||
"bug",
|
||
"--date",
|
||
"2026-06-25",
|
||
"--bug-title",
|
||
"保存草稿失败后表格消失",
|
||
"--bug-slug",
|
||
"draft-preview-disappears",
|
||
"--event",
|
||
"unit test",
|
||
"--no-fetch",
|
||
],
|
||
self.root,
|
||
)
|
||
|
||
self.assertEqual(result.returncode, 0, result.stderr)
|
||
log_path = self.root / "document/development/2026-06-25/dev-logs/bugs/draft-preview-disappears.md"
|
||
content = log_path.read_text(encoding="utf-8")
|
||
self.assertIn("# 保存草稿失败后表格消失", content)
|
||
self.assertIn("## 修复记录", content)
|
||
self.assertIn("Git 提交检查", content)
|
||
self.assertNotIn("## 遗留问题", content)
|
||
self.assertNotIn("## TODO", content)
|
||
|
||
def test_auto_skips_non_bug_commit(self) -> None:
|
||
self.commit_file("docs: update development guide")
|
||
|
||
result = run([sys.executable, str(SCRIPT), "--kind", "auto", "--date", "2026-06-25", "--no-fetch"], self.root)
|
||
|
||
self.assertEqual(result.returncode, 0, result.stderr)
|
||
self.assertIn("skipped_non_bug_commit", result.stdout)
|
||
self.assertFalse((self.root / "document/development/2026-06-25/dev-logs/bugs").exists())
|
||
|
||
def test_daily_summary_combines_features_and_bugs(self) -> None:
|
||
feature = self.root / "document/development/2026-06-25/feature/receipt-folder-ocr"
|
||
feature.mkdir(parents=True)
|
||
feature.joinpath("CONCEPT.md").write_text(
|
||
"# 票据夹 OCR 概念文档\n\n## 功能一句话\n\n自动识别票据并生成可核对字段。\n",
|
||
encoding="utf-8",
|
||
)
|
||
feature.joinpath("TODO.md").write_text("- [x] 已完成\n- [ ] 待验证\n", encoding="utf-8")
|
||
bug_dir = self.root / "document/development/2026-06-25/dev-logs/bugs"
|
||
bug_dir.mkdir(parents=True)
|
||
bug_dir.joinpath("draft-preview-disappears.md").write_text(
|
||
"# 保存草稿失败后表格消失\n\n## 修复记录\n\n- 09:30:记录 bug 修复。\n",
|
||
encoding="utf-8",
|
||
)
|
||
self.commit_file("fix: create test commit")
|
||
|
||
result = run([sys.executable, str(SCRIPT), "--kind", "summary", "--date", "2026-06-25"], self.root)
|
||
|
||
self.assertEqual(result.returncode, 0, result.stderr)
|
||
summary = self.root.joinpath("document/development/2026-06-25/work-logs.med").read_text(encoding="utf-8")
|
||
self.assertIn("# 2026-06-25 综合工作日志", summary)
|
||
self.assertIn("票据夹 OCR 概念文档", summary)
|
||
self.assertIn("保存草稿失败后表格消失", summary)
|
||
self.assertIn("功能侧沉淀了 1 个功能点,问题侧记录了 1 个 bug 修复", summary)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
unittest.main()
|