feat: retry MusicBrainz barcode lookup with random delay on empty result
Up to 3 retries with 2–6 s random wait between attempts, as MusicBrainz occasionally returns no results on the first try. retries parameter is configurable (default: 3). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
468fac6d2b
commit
65164d428c
2 changed files with 58 additions and 10 deletions
|
|
@ -171,9 +171,42 @@ class TestLookupByBarcode:
|
|||
with (
|
||||
patch("musiksammlung.musicbrainz.httpx.get", return_value=empty),
|
||||
patch("musiksammlung.musicbrainz.time.sleep"),
|
||||
patch("musiksammlung.musicbrainz.random.uniform", return_value=0.0),
|
||||
pytest.raises(ValueError, match="Kein MusicBrainz-Eintrag"),
|
||||
):
|
||||
lookup_by_barcode("0000000000000")
|
||||
lookup_by_barcode("0000000000000", retries=0)
|
||||
|
||||
def test_retries_on_empty_result(self) -> None:
|
||||
"""Bei leerem Ergebnis wird bis zu retries-mal wiederholt."""
|
||||
empty = _mock_response({"releases": []})
|
||||
hit = _mock_response(_BARCODE_RESPONSE)
|
||||
# Erste zwei Versuche leer, dritter Versuch Treffer
|
||||
responses = [empty, empty, hit, _mock_response(_RELEASE_RESPONSE)]
|
||||
with (
|
||||
patch("musiksammlung.musicbrainz.httpx.get", side_effect=responses) as mock_get,
|
||||
patch("musiksammlung.musicbrainz.time.sleep"),
|
||||
patch("musiksammlung.musicbrainz.random.uniform", return_value=0.0),
|
||||
):
|
||||
album = lookup_by_barcode("0602557360561", retries=3)
|
||||
|
||||
assert album.artist == "The Beatles"
|
||||
# 3 Barcode-Requests + 1 Release-Request
|
||||
assert mock_get.call_count == 4
|
||||
|
||||
def test_retry_sleep_is_called_between_attempts(self) -> None:
|
||||
"""Zwischen den Versuchen wird time.sleep aufgerufen."""
|
||||
empty = _mock_response({"releases": []})
|
||||
responses = [empty, _mock_response(_BARCODE_RESPONSE), _mock_response(_RELEASE_RESPONSE)]
|
||||
with (
|
||||
patch("musiksammlung.musicbrainz.httpx.get", side_effect=responses),
|
||||
patch("musiksammlung.musicbrainz.time.sleep") as mock_sleep,
|
||||
patch("musiksammlung.musicbrainz.random.uniform", return_value=2.5),
|
||||
):
|
||||
lookup_by_barcode("0602557360561", retries=2)
|
||||
|
||||
# Einmal Retry-Sleep (2.5 s) + einmal Rate-Limit-Sleep (≥1.1 s)
|
||||
assert mock_sleep.call_count == 2
|
||||
assert mock_sleep.call_args_list[0][0][0] == 2.5
|
||||
|
||||
def test_uses_first_release(self) -> None:
|
||||
barcode_data = {"releases": [{"id": "first-id"}, {"id": "second-id"}]}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue