tests.test_releases module¶

Tests for the GitHub Releases API client.

tests.test_releases.test_get_github_releases_single_page(monkeypatch)[source]¶

A single-page fetch returns all releases as a dict.

tests.test_releases.test_get_github_releases_multi_page_pagination(monkeypatch)[source]¶

Pagination merges results across pages until an empty page.

tests.test_releases.test_get_github_releases_empty_repo(monkeypatch)[source]¶

A repo with no releases returns an empty dict (not an exception).

tests.test_releases.test_get_github_releases_raises_on_url_error(monkeypatch)[source]¶

A URLError on the first page raises GitHubReleasesUnavailable.

Distinguishes “we don’t know” from “no releases” — the legacy behavior returned {} for both, which let transient API failures silently rewrite the changelog.

tests.test_releases.test_get_github_releases_retries_incomplete_read(monkeypatch)[source]¶

A truncated page body is retried before the lookup fails.

tests.test_releases.test_get_github_releases_raises_on_persistent_incomplete_read(monkeypatch)[source]¶

A page truncated on every retry raises GitHubReleasesUnavailable.

tests.test_releases.test_get_github_releases_raises_on_partial_pagination(monkeypatch)[source]¶

A URLError on a later page raises rather than silently truncating.

This is the failure mode behind kdeldycke/click-extra#1702: page 1 succeeded, page 2 timed out, the legacy break returned the partial page-1 result, and the caller treated every missing version as “no GitHub release exists.”

tests.test_releases.test_get_github_releases_raises_on_timeout(monkeypatch)[source]¶

A TimeoutError surfaces as GitHubReleasesUnavailable.

tests.test_releases.test_get_github_releases_raises_on_invalid_json(monkeypatch)[source]¶

An unparsable response surfaces as GitHubReleasesUnavailable.

tests.test_releases.test_get_github_releases_malformed_url_returns_empty()[source]¶

A URL with no owner/repo segment returns an empty dict.

This is a caller-level bug, not an API failure: nothing to fetch and nothing to gate against, so the legacy “return empty” behavior is preserved.

tests.test_releases.test_extract_version(tag, pattern, expected)[source]¶
tests.test_releases.test_fetch_github_release_notes_filters_range_and_sorts()[source]¶
tests.test_releases.test_fetch_github_release_notes_skips_empty_bodies()[source]¶
tests.test_releases.test_fetch_github_release_notes_graceful_when_unavailable()[source]¶
tests.test_releases.test_fetch_github_release_notes_honors_tag_pattern()[source]¶
tests.test_releases.test_edit_release_notes_success()[source]¶

Edits an existing release, title included, and returns True.

tests.test_releases.test_edit_release_notes_keeps_title()[source]¶

Without a title, only the notes are replaced.

tests.test_releases.test_edit_release_notes_not_found()[source]¶

Returns False when the release does not exist.

tests.test_releases.test_dev_release_url_and_previous_version_resolves_both()[source]¶

One fetch yields the draft dev URL and the highest final version.

tests.test_releases.test_dev_release_url_and_previous_version_matches_release_segment()[source]¶

A .dev1 draft still matches by release segment, ignoring drafts’ order.

tests.test_releases.test_dev_release_url_and_previous_version_no_draft()[source]¶

A missing dev draft yields None for the URL but keeps the previous version.

tests.test_releases.test_dev_release_url_and_previous_version_first_release()[source]¶

The very first release has a dev draft but no previous version.

tests.test_releases.test_dev_release_url_and_previous_version_unavailable(monkeypatch)[source]¶

An API failure degrades both lookups to None.