test_musehub_release_packager.py
python
| 1 | """Unit tests for musehub_release_packager.py. |
| 2 | |
| 3 | The packager is a pure URL-builder with no DB access — ideal for fast, |
| 4 | zero-fixture unit tests that run without any test DB setup. |
| 5 | """ |
| 6 | from __future__ import annotations |
| 7 | |
| 8 | import pytest |
| 9 | |
| 10 | from musehub.services.musehub_release_packager import ( |
| 11 | build_download_urls, |
| 12 | build_empty_download_urls, |
| 13 | ) |
| 14 | |
| 15 | REPO_ID = "repo-abc123" |
| 16 | RELEASE_ID = "rel-xyz789" |
| 17 | BASE = f"/api/v1/musehub/repos/{REPO_ID}/releases/{RELEASE_ID}/packages" |
| 18 | |
| 19 | |
| 20 | class TestBuildDownloadUrls: |
| 21 | def test_all_false_returns_all_none(self) -> None: |
| 22 | urls = build_download_urls(REPO_ID, RELEASE_ID) |
| 23 | assert urls.midi_bundle is None |
| 24 | assert urls.stems is None |
| 25 | assert urls.mp3 is None |
| 26 | assert urls.musicxml is None |
| 27 | assert urls.metadata is None |
| 28 | |
| 29 | def test_midi_only(self) -> None: |
| 30 | urls = build_download_urls(REPO_ID, RELEASE_ID, has_midi=True) |
| 31 | assert urls.midi_bundle == f"{BASE}/midi" |
| 32 | assert urls.stems is None |
| 33 | assert urls.mp3 is None |
| 34 | assert urls.musicxml is None |
| 35 | assert urls.metadata == f"{BASE}/metadata" |
| 36 | |
| 37 | def test_stems_only(self) -> None: |
| 38 | urls = build_download_urls(REPO_ID, RELEASE_ID, has_stems=True) |
| 39 | assert urls.stems == f"{BASE}/stems" |
| 40 | assert urls.midi_bundle is None |
| 41 | assert urls.metadata == f"{BASE}/metadata" |
| 42 | |
| 43 | def test_mp3_only(self) -> None: |
| 44 | urls = build_download_urls(REPO_ID, RELEASE_ID, has_mp3=True) |
| 45 | assert urls.mp3 == f"{BASE}/mp3" |
| 46 | assert urls.metadata == f"{BASE}/metadata" |
| 47 | |
| 48 | def test_musicxml_only(self) -> None: |
| 49 | urls = build_download_urls(REPO_ID, RELEASE_ID, has_musicxml=True) |
| 50 | assert urls.musicxml == f"{BASE}/musicxml" |
| 51 | assert urls.metadata == f"{BASE}/metadata" |
| 52 | |
| 53 | def test_all_true_all_urls_present(self) -> None: |
| 54 | urls = build_download_urls( |
| 55 | REPO_ID, RELEASE_ID, |
| 56 | has_midi=True, has_stems=True, has_mp3=True, has_musicxml=True, |
| 57 | ) |
| 58 | assert urls.midi_bundle == f"{BASE}/midi" |
| 59 | assert urls.stems == f"{BASE}/stems" |
| 60 | assert urls.mp3 == f"{BASE}/mp3" |
| 61 | assert urls.musicxml == f"{BASE}/musicxml" |
| 62 | assert urls.metadata == f"{BASE}/metadata" |
| 63 | |
| 64 | def test_metadata_absent_when_nothing_available(self) -> None: |
| 65 | urls = build_download_urls(REPO_ID, RELEASE_ID) |
| 66 | assert urls.metadata is None |
| 67 | |
| 68 | def test_metadata_present_when_any_flag_true(self) -> None: |
| 69 | for flag in ("has_midi", "has_stems", "has_mp3", "has_musicxml"): |
| 70 | urls = build_download_urls(REPO_ID, RELEASE_ID, **{flag: True}) |
| 71 | assert urls.metadata is not None, f"metadata should exist when {flag}=True" |
| 72 | |
| 73 | @pytest.mark.parametrize("flag,attr,suffix", [ |
| 74 | ("has_midi", "midi_bundle", "midi"), |
| 75 | ("has_stems", "stems", "stems"), |
| 76 | ("has_mp3", "mp3", "mp3"), |
| 77 | ("has_musicxml", "musicxml", "musicxml"), |
| 78 | ]) |
| 79 | def test_url_pattern_matches_expected_suffix( |
| 80 | self, flag: str, attr: str, suffix: str, |
| 81 | ) -> None: |
| 82 | urls = build_download_urls(REPO_ID, RELEASE_ID, **{flag: True}) |
| 83 | url = getattr(urls, attr) |
| 84 | assert url is not None |
| 85 | assert url.endswith(f"/{suffix}") |
| 86 | assert REPO_ID in url |
| 87 | assert RELEASE_ID in url |
| 88 | |
| 89 | def test_different_repo_and_release_ids(self) -> None: |
| 90 | other = build_download_urls("repo-other", "rel-other", has_midi=True) |
| 91 | assert "repo-other" in (other.midi_bundle or "") |
| 92 | assert "rel-other" in (other.midi_bundle or "") |
| 93 | |
| 94 | |
| 95 | class TestBuildEmptyDownloadUrls: |
| 96 | def test_all_fields_none(self) -> None: |
| 97 | urls = build_empty_download_urls() |
| 98 | assert urls.midi_bundle is None |
| 99 | assert urls.stems is None |
| 100 | assert urls.mp3 is None |
| 101 | assert urls.musicxml is None |
| 102 | assert urls.metadata is None |