Moved to requests_mock fixtures:

- Renamed image_response_mocker to image_request_mock
- Use requests_mock.mocker.Mocker instead of responses.RequestsMock
- Renamed function add to get
This commit is contained in:
Sebastian Mohr
2026-05-16 16:14:37 +02:00
parent 59ba8ad21b
commit d90f22f8e5
3 changed files with 153 additions and 129 deletions

View File

@@ -37,11 +37,10 @@ from enum import Enum
from functools import cached_property
from pathlib import Path
from tempfile import gettempdir, mkdtemp, mkstemp
from typing import Any, ClassVar
from typing import TYPE_CHECKING, Any, ClassVar
from unittest.mock import Mock, patch
import pytest
import responses
from mediafile import Image, MediaFile
import beets
@@ -59,6 +58,9 @@ from beets.util import (
syspath,
)
if TYPE_CHECKING:
from requests_mock.mocker import Mocker
class LogCapture(logging.Handler):
def __init__(self):
@@ -404,6 +406,8 @@ class BeetsTestCase(unittest.TestCase, TestHelper):
modifications that will then be automatically removed when the test
completes. Also provides some additional assertion methods, a
temporary directory, and a DummyIO.
DEPRECATED: Use pytest + PytestTestHelper instead.
"""
def setUp(self):
@@ -831,9 +835,10 @@ class AutotagImportTestCase(ImportTestCase):
@dataclass(slots=True)
class ImageResponseMocker:
responses_mock: responses.RequestsMock
class ImageRequestMocker:
mocker: Mocker
# Image types and their file headers
IMAGE_HEADERS: ClassVar[dict[str, bytes]] = {
"image/jpeg": b"\xff\xd8\xff\x00\x00\x00JFIF",
"image/png": b"\211PNG\r\n\032\n",
@@ -846,19 +851,21 @@ class ImageResponseMocker:
),
}
def add(
def get(
self,
url: str,
*,
content_type: str = "image/jpeg",
file_type: str | None = None,
body: str | bytes | None = None,
content: str | bytes | None = None,
) -> None:
actual_file_type = file_type or content_type
if body is None:
if content is None:
try:
body = self.IMAGE_HEADERS[actual_file_type].ljust(32, b"\x00")
content = self.IMAGE_HEADERS[actual_file_type].ljust(
32, b"\x00"
)
except KeyError as exc:
# If we can't return a file that looks like real file of the requested
# type, better fail the test than returning something else, which might
@@ -867,11 +874,15 @@ class ImageResponseMocker:
f"Mocking {actual_file_type!r} responses not supported"
) from exc
self.responses_mock.add(
responses.GET,
if isinstance(content, str):
content = content.encode()
self.mocker.get(
url,
content_type=content_type,
body=body,
headers={
"Content-Type": content_type,
},
content=content,
)
@@ -879,11 +890,8 @@ class FetchImageHelper:
"""Pytest mixin providing image response mocking utilities."""
@pytest.fixture
def image_response_mocker(self):
with responses.RequestsMock(
assert_all_requests_are_fired=False
) as rsps:
yield ImageResponseMocker(rsps)
def image_request_mock(self, requests_mock):
return ImageRequestMocker(requests_mock)
class CleanupModulesMixin:

View File

@@ -24,7 +24,8 @@ from unittest.mock import patch
import confuse
import pytest
import responses
from requests_mock import ANY as ANYREEQUEST
from requests_mock.exceptions import NoMockAddress
from beets import config, importer, logging, util
from beets.autotag.distance import Distance
@@ -43,7 +44,9 @@ if TYPE_CHECKING:
from collections.abc import Iterator, Sequence
from unittest.mock import MagicMock
from beets.test.helper import ImageResponseMocker
from requests_mock.mocker import Mocker
from beets.test.helper import ImageRequestMocker
class Settings(fetchart.FetchArtPlugin):
@@ -76,6 +79,22 @@ class UseThePlugin(PytestTestHelper):
def setup_plugin(self, setup):
self.plugin = fetchart.FetchArtPlugin()
@pytest.fixture(autouse=True)
def requests_mock_all(self, requests_mock):
"""Will disable all outgoing requests and raise an error!
Tests need to mock all requests!
"""
# Register some “safe” mocks you actually want to allow, if any:
# requests_mock.get("https://example.com/health", json={"status": "ok"})
# Optional: disable any URL not explicitly mocked
requests_mock.register_uri(
ANYREEQUEST,
ANYREEQUEST,
exc=NoMockAddress,
)
@pytest.fixture(autouse=True, scope="class")
def cleanup(self):
try:
@@ -205,7 +224,7 @@ class CAAData:
class TestFetchImage(UseThePlugin, FetchImageHelper):
URL: str = "http://example.com/test.jpg"
URL = "http://example.com/test.jpg"
@pytest.fixture
def settings(self) -> Settings:
@@ -224,9 +243,9 @@ class TestFetchImage(UseThePlugin, FetchImageHelper):
source: DummyRemoteArtSource,
candidate: fetchart.Candidate,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
) -> None:
image_response_mocker.add(self.URL, content_type="image/watercolour")
image_request_mock.get(self.URL, content_type="image/watercolour")
source.fetch_image(candidate, settings)
assert candidate.path is None
@@ -235,9 +254,12 @@ class TestFetchImage(UseThePlugin, FetchImageHelper):
source: DummyRemoteArtSource,
candidate: fetchart.Candidate,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
) -> None:
image_response_mocker.add(self.URL, content_type="image/jpeg")
image_request_mock.get(
self.URL,
content_type="image/jpeg",
)
source.fetch_image(candidate, settings)
assert candidate.path is not None
@@ -246,9 +268,9 @@ class TestFetchImage(UseThePlugin, FetchImageHelper):
source: DummyRemoteArtSource,
candidate: fetchart.Candidate,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
) -> None:
image_response_mocker.add(self.URL, content_type="image/png")
image_request_mock.get(self.URL, content_type="image/png")
source.fetch_image(candidate, settings)
assert candidate.path is not None
assert os.path.splitext(candidate.path)[1] == b".png"
@@ -259,9 +281,9 @@ class TestFetchImage(UseThePlugin, FetchImageHelper):
source: DummyRemoteArtSource,
candidate: fetchart.Candidate,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
) -> None:
image_response_mocker.add(
image_request_mock.get(
self.URL, content_type="image/jpeg", file_type="image/png"
)
source.fetch_image(candidate, settings)
@@ -394,9 +416,9 @@ class TestCombined(UseThePlugin, FetchImageHelper, CAAData):
def test_main_interface_returns_amazon_art(
self,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
image_response_mocker.add(self.AMAZON_URL)
image_request_mock.get(self.AMAZON_URL)
album = Album(asin=self.ASIN)
candidate = self.plugin.art_for_album(album, None)
assert candidate is not None
@@ -409,10 +431,10 @@ class TestCombined(UseThePlugin, FetchImageHelper, CAAData):
def test_main_interface_gives_precedence_to_fs_art(
self,
dpath: bytes,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
_common.touch(os.path.join(dpath, b"art.jpg"))
image_response_mocker.add(self.AMAZON_URL)
image_request_mock.get(self.AMAZON_URL)
album = Album(asin=self.ASIN)
candidate = self.plugin.art_for_album(album, [dpath])
assert candidate is not None
@@ -421,9 +443,9 @@ class TestCombined(UseThePlugin, FetchImageHelper, CAAData):
def test_main_interface_falls_back_to_amazon(
self,
dpath: bytes,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
image_response_mocker.add(self.AMAZON_URL)
image_request_mock.get(self.AMAZON_URL)
album = Album(asin=self.ASIN)
candidate = self.plugin.art_for_album(album, [dpath])
assert candidate is not None
@@ -432,41 +454,38 @@ class TestCombined(UseThePlugin, FetchImageHelper, CAAData):
def test_main_interface_tries_amazon_before_aao(
self,
dpath: bytes,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
image_response_mocker.add(self.AMAZON_URL)
image_request_mock.get(self.AMAZON_URL)
album = Album(asin=self.ASIN)
self.plugin.art_for_album(album, [dpath])
assert len(image_response_mocker.responses_mock.calls) == 1
assert image_request_mock.mocker.called_once
assert (
image_response_mocker.responses_mock.calls[0].request.url
== self.AMAZON_URL
image_request_mock.mocker.request_history[0].url == self.AMAZON_URL
)
def test_main_interface_falls_back_to_aao(
self,
dpath: bytes,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
image_response_mocker.add(self.AMAZON_URL, content_type="text/html")
image_request_mock.get(self.AMAZON_URL, content_type="text/html")
image_request_mock.get(self.AAO_URL, content_type="image/jpeg")
album = Album(asin=self.ASIN)
self.plugin.art_for_album(album, [dpath])
assert (
image_response_mocker.responses_mock.calls[-1].request.url
== self.AAO_URL
)
assert image_request_mock.mocker.request_history[-1].url == self.AAO_URL
def test_main_interface_uses_caa_when_mbid_available(
self,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
image_response_mocker.add(self.RELEASE_URL, body=self.RESPONSE_RELEASE)
image_response_mocker.add(self.GROUP_URL, body=self.RESPONSE_GROUP)
image_response_mocker.add(
image_request_mock.get(self.RELEASE_URL, content=self.RESPONSE_RELEASE)
image_request_mock.get(self.GROUP_URL, content=self.RESPONSE_GROUP)
image_request_mock.get(
"http://coverartarchive.org/release/rid/12345.gif",
content_type="image/gif",
)
image_response_mocker.add(
image_request_mock.get(
"http://coverartarchive.org/release/rid/12345.jpg",
content_type="image/jpeg",
)
@@ -477,31 +496,30 @@ class TestCombined(UseThePlugin, FetchImageHelper, CAAData):
)
candidate = self.plugin.art_for_album(album, None)
assert candidate is not None
assert len(image_response_mocker.responses_mock.calls) == 3
assert image_request_mock.mocker.call_count == 3
assert (
image_response_mocker.responses_mock.calls[0].request.url
== self.RELEASE_URL
image_request_mock.mocker.request_history[0].url == self.RELEASE_URL
)
def test_local_only_does_not_access_network(
self,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
album = Album(mb_albumid=self.MBID, asin=self.ASIN)
self.plugin.art_for_album(album, None, local_only=True)
assert len(image_response_mocker.responses_mock.calls) == 0
assert not image_request_mock.mocker.called
def test_local_only_gets_fs_image(
self,
dpath: bytes,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
_common.touch(os.path.join(dpath, b"art.jpg"))
album = Album(mb_albumid=self.MBID, asin=self.ASIN)
candidate = self.plugin.art_for_album(album, [dpath], local_only=True)
assert candidate is not None
assert candidate.path == os.path.join(dpath, b"art.jpg")
assert len(image_response_mocker.responses_mock.calls) == 0
assert not image_request_mock.mocker.called
class TestAAO(UseThePlugin, FetchImageHelper):
@@ -520,7 +538,7 @@ class TestAAO(UseThePlugin, FetchImageHelper):
self,
source: fetchart.AlbumArtOrg,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
) -> None:
body = """
<br />
@@ -529,8 +547,8 @@ class TestAAO(UseThePlugin, FetchImageHelper):
<img src="http://www.albumart.org/images/zoom-icon.jpg"
alt="View larger image" width="17" height="15" border="0"/></a>
"""
image_response_mocker.add(
self.AAO_URL, body=body, content_type="text/html"
image_request_mock.get(
self.AAO_URL, content=body, content_type="text/html"
)
album = Album(asin=self.ASIN)
candidate = next(source.get(album, settings, []))
@@ -540,10 +558,10 @@ class TestAAO(UseThePlugin, FetchImageHelper):
self,
source: fetchart.AlbumArtOrg,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
) -> None:
image_response_mocker.add(
self.AAO_URL, body="blah blah", content_type="text/html"
image_request_mock.get(
self.AAO_URL, content="blah blah", content_type="text/html"
)
album = Album(asin=self.ASIN)
with pytest.raises(StopIteration):
@@ -568,7 +586,7 @@ class TestITunesStore(UseThePlugin, FetchImageHelper):
source: fetchart.ITunesStore,
settings: Settings,
album,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
json = """{
"results":
@@ -580,9 +598,9 @@ class TestITunesStore(UseThePlugin, FetchImageHelper):
}
]
}"""
image_response_mocker.add(
image_request_mock.get(
fetchart.ITunesStore.API_URL,
body=json,
content=json,
content_type="application/json",
)
candidate = next(source.get(album, settings, []))
@@ -594,13 +612,13 @@ class TestITunesStore(UseThePlugin, FetchImageHelper):
source: fetchart.ITunesStore,
settings: Settings,
album: Album,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
caplog: pytest.LogCaptureFixture,
):
json = '{"results": []}'
image_response_mocker.add(
image_request_mock.get(
fetchart.ITunesStore.API_URL,
body=json,
content=json,
content_type="application/json",
)
expected = "got no results"
@@ -615,14 +633,13 @@ class TestITunesStore(UseThePlugin, FetchImageHelper):
source: fetchart.ITunesStore,
settings: Settings,
album: Album,
image_response_mocker: ImageResponseMocker,
requests_mock: Mocker,
caplog: pytest.LogCaptureFixture,
):
image_response_mocker.responses_mock.add(
responses.GET,
requests_mock.get(
fetchart.ITunesStore.API_URL,
json={"error": "not found"},
status=404,
status_code=404,
)
expected = "iTunes search failed: 404 Client Error"
@@ -636,7 +653,7 @@ class TestITunesStore(UseThePlugin, FetchImageHelper):
source: fetchart.ITunesStore,
settings: Settings,
album: Album,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
json = """{
"results":
@@ -647,9 +664,9 @@ class TestITunesStore(UseThePlugin, FetchImageHelper):
}
]
}"""
image_response_mocker.add(
image_request_mock.get(
fetchart.ITunesStore.API_URL,
body=json,
content=json,
content_type="application/json",
)
candidate = next(source.get(album, settings, []))
@@ -661,7 +678,7 @@ class TestITunesStore(UseThePlugin, FetchImageHelper):
source: fetchart.ITunesStore,
settings: Settings,
album: Album,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
caplog: pytest.LogCaptureFixture,
):
json = """{
@@ -673,9 +690,9 @@ class TestITunesStore(UseThePlugin, FetchImageHelper):
}
]
}"""
image_response_mocker.add(
image_request_mock.get(
fetchart.ITunesStore.API_URL,
body=json,
content=json,
content_type="application/json",
)
expected = "Malformed itunes candidate"
@@ -690,13 +707,13 @@ class TestITunesStore(UseThePlugin, FetchImageHelper):
source: fetchart.ITunesStore,
settings: Settings,
album: Album,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
caplog: pytest.LogCaptureFixture,
):
json = '{"error": {"errors": [{"reason": "some reason"}]}}'
image_response_mocker.add(
image_request_mock.get(
fetchart.ITunesStore.API_URL,
body=json,
content=json,
content_type="application/json",
)
expected = "not found in json. Fields are"
@@ -711,13 +728,13 @@ class TestITunesStore(UseThePlugin, FetchImageHelper):
source: fetchart.ITunesStore,
settings: Settings,
album: Album,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
caplog: pytest.LogCaptureFixture,
):
json = """bla blup"""
image_response_mocker.add(
image_request_mock.get(
fetchart.ITunesStore.API_URL,
body=json,
content=json,
content_type="application/json",
)
expected = "Could not decode json response:"
@@ -741,13 +758,13 @@ class TestGoogleImage(UseThePlugin, FetchImageHelper):
self,
source: fetchart.GoogleImages,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
album = Album(albumartist="some artist", album="some album")
json = '{"items": [{"link": "url_to_the_image"}]}'
image_response_mocker.add(
image_request_mock.get(
fetchart.GoogleImages.URL,
body=json,
content=json,
content_type="application/json",
)
candidate = next(source.get(album, settings, []))
@@ -757,13 +774,13 @@ class TestGoogleImage(UseThePlugin, FetchImageHelper):
self,
source: fetchart.GoogleImages,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
album = Album(albumartist="some artist", album="some album")
json = '{"error": {"errors": [{"reason": "some reason"}]}}'
image_response_mocker.add(
image_request_mock.get(
fetchart.GoogleImages.URL,
body=json,
content=json,
content_type="application/json",
)
with pytest.raises(StopIteration):
@@ -773,13 +790,13 @@ class TestGoogleImage(UseThePlugin, FetchImageHelper):
self,
source: fetchart.GoogleImages,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
album = Album(albumartist="some artist", album="some album")
json = """bla blup"""
image_response_mocker.add(
image_request_mock.get(
fetchart.GoogleImages.URL,
body=json,
content=json,
content_type="application/json",
)
with pytest.raises(StopIteration):
@@ -799,25 +816,24 @@ class TestCoverArtArchive(UseThePlugin, FetchImageHelper, CAAData):
self,
source: fetchart.CoverArtArchive,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
album = Album(
mb_albumid=self.MBID_RELASE, mb_releasegroupid=self.MBID_GROUP
)
image_response_mocker.add(self.RELEASE_URL, body=self.RESPONSE_RELEASE)
image_response_mocker.add(self.GROUP_URL, body=self.RESPONSE_GROUP)
image_request_mock.get(self.RELEASE_URL, content=self.RESPONSE_RELEASE)
image_request_mock.get(self.GROUP_URL, content=self.RESPONSE_GROUP)
candidates = list(source.get(album, settings, []))
assert len(candidates) == 3
assert len(image_response_mocker.responses_mock.calls) == 2
assert image_request_mock.mocker.call_count == 2
assert (
image_response_mocker.responses_mock.calls[0].request.url
== self.RELEASE_URL
image_request_mock.mocker.request_history[0].url == self.RELEASE_URL
)
def test_fetchart_uses_caa_pre_sized_maxwidth_thumbs(
self,
source: fetchart.CoverArtArchive,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
# CAA provides pre-sized thumbnails of width 250px, 500px, and 1200px
# We only test with one of them here
@@ -827,8 +843,8 @@ class TestCoverArtArchive(UseThePlugin, FetchImageHelper, CAAData):
album = Album(
mb_albumid=self.MBID_RELASE, mb_releasegroupid=self.MBID_GROUP
)
image_response_mocker.add(self.RELEASE_URL, body=self.RESPONSE_RELEASE)
image_response_mocker.add(self.GROUP_URL, body=self.RESPONSE_GROUP)
image_request_mock.get(self.RELEASE_URL, content=self.RESPONSE_RELEASE)
image_request_mock.get(self.GROUP_URL, content=self.RESPONSE_GROUP)
candidates = list(source.get(album, settings, []))
assert len(candidates) == 3
for candidate in candidates:
@@ -838,7 +854,7 @@ class TestCoverArtArchive(UseThePlugin, FetchImageHelper, CAAData):
def test_caa_finds_image_if_maxwidth_is_set_and_thumbnails_is_empty(
self,
source: fetchart.CoverArtArchive,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
# CAA provides pre-sized thumbnails of width 250px, 500px, and 1200px
# We only test with one of them here
@@ -848,11 +864,11 @@ class TestCoverArtArchive(UseThePlugin, FetchImageHelper, CAAData):
album = Album(
mb_albumid=self.MBID_RELASE, mb_releasegroupid=self.MBID_GROUP
)
image_response_mocker.add(
self.RELEASE_URL, body=self.RESPONSE_RELEASE_WITHOUT_THUMBNAILS
image_request_mock.get(
self.RELEASE_URL, content=self.RESPONSE_RELEASE_WITHOUT_THUMBNAILS
)
image_response_mocker.add(
self.GROUP_URL, body=self.RESPONSE_GROUP_WITHOUT_THUMBNAILS
image_request_mock.get(
self.GROUP_URL, content=self.RESPONSE_GROUP_WITHOUT_THUMBNAILS
)
candidates = list(source.get(album, settings, []))
assert len(candidates) == 3
@@ -931,12 +947,12 @@ class TestFanartTV(UseThePlugin, FetchImageHelper):
self,
source: fetchart.FanartTV,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
album: Album = Album(mb_releasegroupid="thereleasegroupid")
image_response_mocker.add(
image_request_mock.get(
f"{fetchart.FanartTV.API_ALBUMS}thereleasegroupid",
body=self.RESPONSE_MULTIPLE,
content=self.RESPONSE_MULTIPLE,
content_type="application/json",
)
candidate = next(source.get(album, settings, []))
@@ -946,12 +962,12 @@ class TestFanartTV(UseThePlugin, FetchImageHelper):
self,
source: fetchart.FanartTV,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
album = Album(mb_releasegroupid="thereleasegroupid")
image_response_mocker.add(
image_request_mock.get(
f"{fetchart.FanartTV.API_ALBUMS}thereleasegroupid",
body=self.RESPONSE_ERROR,
content=self.RESPONSE_ERROR,
content_type="application/json",
)
with pytest.raises(StopIteration):
@@ -961,12 +977,12 @@ class TestFanartTV(UseThePlugin, FetchImageHelper):
self,
source: fetchart.FanartTV,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
album = Album(mb_releasegroupid="thereleasegroupid")
image_response_mocker.add(
image_request_mock.get(
f"{fetchart.FanartTV.API_ALBUMS}thereleasegroupid",
body=self.RESPONSE_MALFORMED,
content=self.RESPONSE_MALFORMED,
content_type="application/json",
)
with pytest.raises(StopIteration):
@@ -976,13 +992,13 @@ class TestFanartTV(UseThePlugin, FetchImageHelper):
self,
source: fetchart.FanartTV,
settings: Settings,
image_response_mocker: ImageResponseMocker,
image_request_mock: ImageRequestMocker,
):
# The source used to fail when there were images present, but no cover
album = Album(mb_releasegroupid="thereleasegroupid")
image_response_mocker.add(
image_request_mock.get(
f"{fetchart.FanartTV.API_ALBUMS}thereleasegroupid",
body=self.RESPONSE_NO_ART,
content=self.RESPONSE_NO_ART,
content_type="application/json",
)
with pytest.raises(StopIteration):

View File

@@ -41,7 +41,7 @@ from beetsplug._utils import art
from test.test_art_resize import DummyIMBackend
if TYPE_CHECKING:
from beets.test.helper import ImageResponseMocker
from beets.test.helper import ImageRequestMocker
def require_artresizer_compare(test):
@@ -278,43 +278,43 @@ class TestEmbedartCli(PytestImportHelper, IOMixin, FetchImageHelper):
assert mediafile.images[0].data == self.image_data
def test_embed_art_from_url_with_yes_input(
self, image_response_mocker: ImageResponseMocker
self, image_request_mock: ImageRequestMocker
):
self._setup_data()
album = self.add_album_fixture()
item = album.items()[0]
image_response_mocker.add(
image_request_mock.get(
"http://example.com/test.jpg", content_type="image/jpeg"
)
self.io.addinput("y")
self.run_command("embedart", "-u", "http://example.com/test.jpg")
mediafile = MediaFile(syspath(item.path))
assert mediafile.images[0].data == image_response_mocker.IMAGE_HEADERS[
assert mediafile.images[0].data == image_request_mock.IMAGE_HEADERS[
"image/jpeg"
].ljust(32, b"\x00")
def test_embed_art_from_url_png(
self, image_response_mocker: ImageResponseMocker
self, image_request_mock: ImageRequestMocker
):
self._setup_data()
album = self.add_album_fixture()
item = album.items()[0]
image_response_mocker.add(
image_request_mock.get(
"http://example.com/test.png", content_type="image/png"
)
self.run_command("embedart", "-y", "-u", "http://example.com/test.png")
mediafile = MediaFile(syspath(item.path))
assert mediafile.images[0].data == image_response_mocker.IMAGE_HEADERS[
assert mediafile.images[0].data == image_request_mock.IMAGE_HEADERS[
"image/png"
].ljust(32, b"\x00")
def test_embed_art_from_url_not_image(
self, image_response_mocker: ImageResponseMocker
self, image_request_mock: ImageRequestMocker
):
self._setup_data()
album = self.add_album_fixture()
item = album.items()[0]
image_response_mocker.add(
image_request_mock.get(
"http://example.com/test.html", content_type="text/html"
)
self.run_command("embedart", "-y", "-u", "http://example.com/test.html")