Backup-Import: Bildadresse ging weiterhin verloren
Der vorige Anlauf war wirkungslos. _import_json baut aus jedem JSON-Eintrag eine eigene Zeile fuer _get_or_create_product - und image_url stand in dieser Zeile nicht drin. Die Abfrage lief also immer ins Leere. Zwei Tests gehen jetzt durch _import_json statt nur durch _get_or_create_product, weil die Adresse genau zwischen den beiden herausfiel. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -530,6 +530,10 @@ def _import_json(db: Session, content: bytes, user: User, mode: str) -> dict:
|
|||||||
"barcode": entry.get("barcode") or "",
|
"barcode": entry.get("barcode") or "",
|
||||||
"name": entry.get("name") or "",
|
"name": entry.get("name") or "",
|
||||||
"marke": entry.get("brand") 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",
|
"einheit": entry.get("unit") or "Stück",
|
||||||
"packungsgroesse": entry.get("package_size") or "",
|
"packungsgroesse": entry.get("package_size") or "",
|
||||||
"gebinde": entry.get("package_label") or "",
|
"gebinde": entry.get("package_label") or "",
|
||||||
|
|||||||
@@ -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
|
from app.services import images
|
||||||
|
|
||||||
EIN_PIXEL = b"\x89PNG\r\n\x1a\n-nicht-echt-aber-egal"
|
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
|
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):
|
def test_fetch_geht_nur_an_http_adressen(monkeypatch):
|
||||||
"""Ohne diese Schranke waere eine 'file://'-Adresse ein Weg ins Dateisystem."""
|
"""Ohne diese Schranke waere eine 'file://'-Adresse ein Weg ins Dateisystem."""
|
||||||
monkeypatch.setattr(
|
monkeypatch.setattr(
|
||||||
|
|||||||
Reference in New Issue
Block a user