gabriel / musehub public
test_musehub_release_packager.py python
102 lines 3.7 KB
7923a405 test(supercharge): comprehensive test suite overhaul — all 11 points Gabriel Cardona <gabriel@tellurstori.com> 6d ago
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