Das Datenbankverhalten belegen · Übung
Ein Rollback mitten im Import belegen
Ein Import-Rollback ist nur aussagekräftig, wenn der Fehler auftritt, nachdem neue Arbeit begonnen hat. Setze eine tatsächlich neue CSV-Zeile zuerst, eine Abweichung an die zweite Stelle und belege dann, dass die frühere Zeile nicht erhalten blieb.
Arbeite weiter in tests/test_catalog.py. Vervollständige test_failed_import_rolls_back_every_new_item(tmp_path) mit import-rollback.db und late-conflict.csv, beide unterhalb von tmp_path. Bereite in der Datenbank einen gespeicherten Gegenstand vor, etwa mit Inventarkennzeichen KEPT-7 und seinem ursprünglichen Namen, und schreibe ihn fest. Schließe diese Verbindung, bevor du die für den Pfad verantwortliche Importschnittstelle aufrufst.
Schreibe eine gültige CSV-Datei mit fünf Spalten. Ihre erste Zeile soll eine neue ID und ein neues Kennzeichen haben. Die zweite soll KEPT-7 wiederverwenden, aber ein vom CSV verwaltetes Feld ändern, etwa den Namen. Reader und Validierung sollen die ganze Datei akzeptieren. Die Abweichung erscheint erst, wenn der vorbereitete Datenstapel mit dem gespeicherten Zustand verglichen wird.
Rufe genau catalog_import.import_items_csv(database_path, csv_path) innerhalb von pytest.raises(ValueError) auf. Vergleiche die exakte Meldung CSV item KEPT-7 disagrees with the stored item.. Öffne dann die Datenbank erneut und wähle alle fünf Gegenstandsfelder in ID-Reihenfolge aus. Das vollständige Ergebnis soll nur die ursprüngliche gespeicherte Zeile enthalten. Diese Zusicherung belegt beide Hälften der Transaktionszusage: Die frühe neue Zeile fehlt, und die alte wurde weder ersetzt noch bearbeitet.
Wenn die konfliktbehaftete Zeile zuerst kommt, ist vor dem Fehler noch kein Schreibzugriff passiert. Dann kann selbst ein fehlerhafter Commit pro Zeile bestehen. Eine reine Zeilenanzahl-Zusicherung ist ebenfalls zu schwach, weil eine gelöschte und eine unerwünscht erhaltene Zeile dieselbe Anzahl ergeben könnten. Vergleiche die Werte, auf die es ankommt.
Klicke auf Run. Der feste Einstieg ruft pytest.main(["-q", "-p", "no:cacheprovider", "tests/test_catalog.py"]) auf und sollte Folgendes melden:
Database tests passed: 6
Submit prüft zwei fehlerhafte Transaktionszeitpunkte separat: das Festschreiben jeder Einfügung und das Festschreiben, bevor die nächste Zeile eingeordnet wird. Jeder Durchlauf beginnt in einem neuen Projekt und sammelt dieselben sechs Tests. Deine Vorbereitung mit spätem Konflikt sollte beide aufdecken, ohne sich auf IDs oder Texte aus dem Startkatalog zu verlassen.
Aufgabe
Vervollständige test_failed_import_rolls_back_every_new_item(tmp_path) in tests/test_catalog.py. Setze eine neue CSV-Zeile vor eine spätere Abweichung bei KEPT-7, verlange den exakten ValueError, schließe und öffne erneut und vergleiche jedes relevante gespeicherte Gegenstandsfeld, sodass die neue Zeile fehlt und die alte unverändert ist.