# 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__ 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