"""Gefahrenbereich: die drei Löschstufen. Wichtig ist nicht nur, dass gelöscht wird, sondern auch, was stehen bleibt – Benutzer und Zugänge dürfen nie verschwinden, sonst sperrt man sich aus. """ from app.models import Barcode, Category, Group, Location, Lot, Movement, MovementType, Product, Unit from app.routers.maintenance import _delete_products, _delete_stock from app.seed import ensure_builtin_categories def _bestand(db, rice): """Ein Artikel mit Charge, Bewegung, EAN-Code, Gruppe und Lagerort.""" gruppe = Group(name="Mehl") ort = Location(name="Keller") db.add_all([gruppe, ort]) db.flush() rice.group_id = gruppe.id lot = Lot(product_id=rice.id, quantity=500) db.add(lot) db.flush() db.add(Movement(product_id=rice.id, lot_id=lot.id, type=MovementType.in_, quantity=500, unit_used="g")) db.add(Barcode(code="4001", product_id=rice.id)) db.add(Barcode(code="4002", group_id=gruppe.id)) db.commit() def test_bestaende_loeschen_laesst_artikel_stehen(db, rice): _bestand(db, rice) _delete_stock(db) db.commit() assert db.query(Lot).count() == 0 assert db.query(Movement).count() == 0 # Der Katalog bleibt vollstaendig erhalten. assert db.query(Product).count() == 1 assert db.query(Group).count() == 1 assert db.query(Barcode).count() == 2 def test_artikel_loeschen_laesst_gruppen_und_einheiten_stehen(db, rice): _bestand(db, rice) _delete_products(db) db.commit() assert db.query(Product).count() == 0 assert db.query(Lot).count() == 0 # Der Artikel-Code ist weg, der Gruppen-Code bleibt. assert [b.code for b in db.query(Barcode).all()] == ["4002"] assert db.query(Group).count() == 1 assert db.query(Location).count() == 1 assert db.query(Unit).count() > 0 def test_startkategorien_kommen_nach_dem_leeren_zurueck(db): ensure_builtin_categories(db) assert db.query(Category).count() > 0 db.query(Category).delete(synchronize_session=False) db.commit() assert db.query(Category).count() == 0 # Genau das macht /maintenance/reset/all im Anschluss. ensure_builtin_categories(db) assert db.query(Category).count() > 0