diff --git a/backend/app/routers/transfer.py b/backend/app/routers/transfer.py index 38df096..709b11e 100644 --- a/backend/app/routers/transfer.py +++ b/backend/app/routers/transfer.py @@ -530,6 +530,10 @@ def _import_json(db: Session, content: bytes, user: User, mode: str) -> dict: "barcode": entry.get("barcode") or "", "name": entry.get("name") or "", "marke": entry.get("brand") or "", + # Ohne diesen Eintrag laeuft die Bildadresse ins Leere: Das + # Backup enthaelt sie, aber _get_or_create_product sieht nur + # diese Zeile - nicht den urspruenglichen JSON-Eintrag. + "image_url": entry.get("image_url") or "", "einheit": entry.get("unit") or "Stück", "packungsgroesse": entry.get("package_size") or "", "gebinde": entry.get("package_label") or "", diff --git a/backend/tests/test_product_images.py b/backend/tests/test_product_images.py index 4e186fa..211a5b4 100644 --- a/backend/tests/test_product_images.py +++ b/backend/tests/test_product_images.py @@ -1,4 +1,9 @@ -from app.models import BaseUnit, Product, ProductImage +import json + +import pytest + +from app.models import BaseUnit, Product, ProductImage, Role, User +from app.routers import transfer from app.services import images EIN_PIXEL = b"\x89PNG\r\n\x1a\n-nicht-echt-aber-egal" @@ -44,6 +49,56 @@ def test_ein_nicht_erreichbares_bild_bleibt_folgenlos(db, monkeypatch): assert db.get(ProductImage, artikel.id) is None +@pytest.fixture() +def user(db): + person = User(username="tester", password_hash="x", role=Role.admin) + db.add(person) + db.commit() + db.refresh(person) + return person + + +def test_backup_import_uebernimmt_die_bildadresse(db, user): + """Sie stand im Backup, ging beim Einlesen aber verloren. + + Der Test geht bewusst durch _import_json und nicht nur durch + _get_or_create_product: Genau zwischen beiden fiel die Adresse heraus. + """ + backup = { + "products": [ + { + "name": "Pesto", + "brand": "Barilla", + "image_url": "https://example.org/pesto.jpg", + "unit": "Gramm", + "package_size": 195, + "lots": [], + } + ] + } + transfer._import_json(db, json.dumps(backup).encode("utf-8"), user, "add") + db.commit() + + artikel = db.query(Product).filter(Product.name == "Pesto").one() + assert artikel.image_url == "https://example.org/pesto.jpg" + + +def test_import_ueberschreibt_kein_vorhandenes_bild(db, user): + vorhanden = Product( + name="Pesto", base_unit=BaseUnit.gram, image_url="https://eigenes.example/bild.jpg" + ) + db.add(vorhanden) + db.commit() + + backup = {"products": [{"name": "Pesto", "image_url": "https://off.example/anderes.jpg", + "unit": "Gramm", "lots": []}]} + transfer._import_json(db, json.dumps(backup).encode("utf-8"), user, "add") + db.commit() + + db.refresh(vorhanden) + assert vorhanden.image_url == "https://eigenes.example/bild.jpg" + + def test_fetch_geht_nur_an_http_adressen(monkeypatch): """Ohne diese Schranke waere eine 'file://'-Adresse ein Weg ins Dateisystem.""" monkeypatch.setattr(