"""Umbenennen von Lagerorten und Einheiten. Bis dahin gab es nur Anlegen und Loeschen. Wer sich vertippt hatte, musste den Eintrag wegwerfen und neu anlegen - und verlor dabei die Zuordnung der Chargen bzw. Produkte. Diese Tests halten fest, dass Umbenennen die Verweise behaelt. """ import pytest from fastapi import HTTPException from app.models import BaseUnit, Lot, Product, Role, Unit, User from app.routers import locations, units from app.schemas import LocationCreate, LocationUpdate, UnitCreate, UnitUpdate @pytest.fixture() def admin(db): person = User(username="chef", password_hash="x", role=Role.admin) db.add(person) db.commit() db.refresh(person) return person # ---- Lagerorte ---- def test_lagerort_umbenennen_behaelt_die_chargen(db, admin, rice): keller = locations.create_location(LocationCreate(name="Keler"), db=db, _=admin) charge = Lot(product_id=rice.id, quantity=500, location_id=keller.id) db.add(charge) db.commit() locations.update_location(keller.id, LocationUpdate(name="Keller"), db=db, _=admin) db.refresh(charge) assert charge.location_id == keller.id assert db.get(type(keller), keller.id).name == "Keller" def test_lagerort_doppelter_name_wird_abgelehnt(db, admin): locations.create_location(LocationCreate(name="Keller"), db=db, _=admin) speis = locations.create_location(LocationCreate(name="Speis"), db=db, _=admin) with pytest.raises(HTTPException) as fehler: # Gross-/Kleinschreibung darf keinen Unterschied machen. locations.update_location(speis.id, LocationUpdate(name="keller"), db=db, _=admin) assert fehler.value.status_code == 409 def test_lagerort_gleicher_name_bleibt_erlaubt(db, admin): """Nur die Schreibweise aendern darf nicht am eigenen Eintrag scheitern.""" keller = locations.create_location(LocationCreate(name="keller"), db=db, _=admin) geaendert = locations.update_location( keller.id, LocationUpdate(name="Keller"), db=db, _=admin ) assert geaendert.name == "Keller" def test_lagerort_unbekannt(db, admin): with pytest.raises(HTTPException) as fehler: locations.update_location(999, LocationUpdate(name="Keller"), db=db, _=admin) assert fehler.value.status_code == 404 # ---- Einheiten ---- def test_einheit_umbenennen_behaelt_die_produkte(db, admin): einheit = units.create_unit( UnitCreate(name="Beutle", kind="weight", factor=1000), db=db, _=admin ) produkt = Product(name="Mehl", base_unit=BaseUnit.gram, display_unit_id=einheit.id) db.add(produkt) db.commit() units.update_unit(einheit.id, UnitUpdate(name="Beutel"), db=db, _=admin) db.refresh(produkt) assert produkt.display_unit_id == einheit.id assert db.get(Unit, einheit.id).name == "Beutel" def test_eingebaute_einheit_laesst_sich_umbenennen(db, admin): """Anders als beim Loeschen ist Umbenennen auch eingebaut erlaubt - genauso wie bei den Gebinden.""" gramm = db.query(Unit).filter(Unit.name == "Gramm").one() assert gramm.is_builtin is True units.update_unit(gramm.id, UnitUpdate(name="Gramm (g)"), db=db, _=admin) assert db.get(Unit, gramm.id).name == "Gramm (g)" def test_einheit_doppelter_name_wird_abgelehnt(db, admin): einheit = units.create_unit( UnitCreate(name="Beutel", kind="weight", factor=1000), db=db, _=admin ) with pytest.raises(HTTPException) as fehler: units.update_unit(einheit.id, UnitUpdate(name="gramm"), db=db, _=admin) assert fehler.value.status_code == 409 def test_einheit_unbekannt(db, admin): with pytest.raises(HTTPException) as fehler: units.update_unit(999, UnitUpdate(name="Beutel"), db=db, _=admin) assert fehler.value.status_code == 404