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:
Scarriffle
2026-07-23 13:52:04 +02:00
parent 3763f2f114
commit 2fa274eae8
2 changed files with 60 additions and 1 deletions

View File

@@ -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 "",

View File

@@ -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(