signal-bot/tests/test_changelog.py
2026-08-30 21:28:41 +02:00

80 lines
2.4 KiB
Python

# Copyright (c) 2026 Krzysztof Rudnicki. MIT licence.
"""DOCS-changelog.md is the only copy, so the parser has to earn that."""
from __future__ import annotations
from pathlib import Path
from signal_bot.changelog import Release, load, parse, since
from signal_bot.versioning import __version__, latin_name
DOCUMENT = """\
# Changelog
Prose between releases is ignored.
- a bullet before any heading belongs to no release
## 0.0.1 — Linus
- druga zmiana
- trzecia zmiana
Some more prose.
## 0.0.0 — Święty Piotr Apostoł
- pierwsza zmiana
"""
def test_parse_reads_headings_and_their_bullets() -> None:
releases = parse(DOCUMENT)
assert [r.version for r in releases] == ["0.0.0", "0.0.1"]
assert releases[0].pope == "Święty Piotr Apostoł"
assert releases[1].lines == ("druga zmiana", "trzecia zmiana")
def test_a_bullet_above_every_heading_belongs_to_nobody() -> None:
"""Otherwise the file's own format documentation becomes a changelog entry."""
assert all("belongs to no release" not in line for r in parse(DOCUMENT) for line in r.lines)
def test_parse_of_nothing_is_nothing() -> None:
assert parse("# Changelog\n\njust prose\n") == ()
def test_releases_come_back_oldest_first_whatever_the_file_order() -> None:
assert [r.ordinal for r in parse(DOCUMENT)] == [1, 2]
def test_since_returns_only_what_the_group_has_not_seen() -> None:
releases = parse(DOCUMENT)
assert [r.version for r in since(releases, "0.0.0")] == ["0.0.1"]
assert since(releases, "0.0.1") == ()
def test_since_an_unknown_version_announces_nothing() -> None:
"""A hand-edited or downgraded record must not dump the whole backlog."""
assert since(parse(DOCUMENT), "9.9.9") == ()
def test_a_missing_changelog_costs_an_announcement_not_the_process() -> None:
assert load(Path("/nonexistent/DOCS-changelog.md")) == ()
def test_the_real_changelog_covers_the_running_version() -> None:
"""A release with no entry would announce a version and then say nothing."""
versions = [release.version for release in load()]
assert __version__ in versions
def test_release_knows_its_ordinal() -> None:
assert Release("2.13.7", "Jan Paweł II", ()).ordinal == 264
def test_every_heading_name_matches_the_derived_latin_one() -> None:
"""The doc is checked, not trusted: a typo here fails here, not in a group."""
for release in load():
assert release.pope == latin_name(release.pope_entry), release.version