zcbot/tests/test_changelog.py

51 lines
1.5 KiB
Python

"""用户版更新日志:CHANGELOG.md 解析器(web/app.py::_parse_changelog)。"""
import unittest
from web.app import _CHANGELOG_PATH, _parse_changelog
SAMPLE = """# 更新日志
> 导语在首个条目前,应被丢弃。
## 0.55.0 — 2026-07-09
- 条目 A
## v0.54.1 - 2026-07-09
- 条目 B
- 条目 C
## 0.53.0
- 无日期条目
"""
class ChangelogParseTests(unittest.TestCase):
def test_sample_parses_versions_dates_and_bodies(self) -> None:
es = _parse_changelog(SAMPLE)
self.assertEqual([e["version"] for e in es], ["0.55.0", "0.54.1", "0.53.0"])
self.assertEqual(es[0]["date"], "2026-07-09")
self.assertEqual(es[1]["date"], "2026-07-09") # v 前缀 + 单横线也认
self.assertIsNone(es[2]["date"]) # 日期可省
self.assertEqual(es[0]["body_md"], "- 条目 A")
self.assertIn("条目 C", es[1]["body_md"])
def test_preamble_before_first_entry_is_dropped(self) -> None:
es = _parse_changelog(SAMPLE)
self.assertNotIn("导语", es[0]["body_md"])
def test_real_changelog_file_parses(self) -> None:
# 仓库里的真文件:格式坏了(条目头打错 / 空正文)在 CI 就翻车,不等用户点开才发现
es = _parse_changelog(_CHANGELOG_PATH.read_text(encoding="utf-8"))
self.assertGreater(len(es), 0)
for e in es:
self.assertRegex(e["version"], r"^\d+\.\d+")
self.assertTrue(e["body_md"], f"empty body for {e['version']}")
if __name__ == "__main__":
unittest.main()