from app.models import BaseUnit, Product, ProductImage from app.services import images EIN_PIXEL = b"\x89PNG\r\n\x1a\n-nicht-echt-aber-egal" def _artikel(db, url=None): p = Product(name="Pesto", base_unit=BaseUnit.gram, package_size=195, image_url=url) db.add(p) db.commit() db.refresh(p) return p def test_ohne_bildadresse_gibt_es_nichts_zu_holen(db, monkeypatch): monkeypatch.setattr(images, "fetch", lambda url: (_ for _ in ()).throw(AssertionError)) assert images.ensure(db, _artikel(db)) is None def test_bild_wird_einmal_geholt_und_danach_lokal_geliefert(db, monkeypatch): aufrufe = [] def gefaelscht(url): aufrufe.append(url) return EIN_PIXEL, "image/png" monkeypatch.setattr(images, "fetch", gefaelscht) artikel = _artikel(db, "https://example.org/pesto.png") erstes = images.ensure(db, artikel) assert erstes is not None assert erstes.data == EIN_PIXEL assert erstes.content_type == "image/png" # Zweiter Aufruf darf nicht erneut ins Netz gehen - genau das ist der Zweck. images.ensure(db, artikel) assert aufrufe == ["https://example.org/pesto.png"] def test_ein_nicht_erreichbares_bild_bleibt_folgenlos(db, monkeypatch): monkeypatch.setattr(images, "fetch", lambda url: None) artikel = _artikel(db, "https://example.org/weg.png") assert images.ensure(db, artikel) is None assert db.get(ProductImage, artikel.id) is None def test_fetch_geht_nur_an_http_adressen(monkeypatch): """Ohne diese Schranke waere eine 'file://'-Adresse ein Weg ins Dateisystem.""" monkeypatch.setattr( images.httpx, "get", lambda *a, **k: (_ for _ in ()).throw(AssertionError) ) assert images.fetch("file:///etc/passwd") is None assert images.fetch("") is None