Das Datenbankverhalten belegen · Übung
Beide Ausleihregeln schützen
Fremdschlüssel können nicht jede Verleihentscheidung ausdrücken. Ein Gegenstand kann bereits einen aktiven Ausleihvorgang haben, und ein gültiges Mitglied kann sein gespeichertes Ausleihlimit bereits erreicht haben. Ein öffentlicher Ausleihtest soll beide Konflikte vorbereiten und jeweils die eigene Erklärung verlangen.
Arbeite weiter in tests/test_catalog.py. Vervollständige test_checkout_refuses_active_items_and_full_members(tmp_path) mit create_fresh_database(tmp_path, "checkout-rules.db") und catalog_db.open_database(database_path). Füge drei Gegenstände einzeln oder in einer kleinen Schleife sowie zwei Mitglieder ein. Lass dem ersten Mitglied Platz für einen weiteren Ausleihvorgang. Gib dem zweiten Mitglied ein Limit von 1 und einen aktiven Ausleihvorgang. Ergänze für einen der Gegenstände des ersten Mitglieds einen separaten aktiven Ausleihvorgang und schreibe dann die Vorbereitung fest.
Rufe für den aktiven Gegenstand nur die öffentliche Schnittstelle auf:
catalog_db.checkout_item(connection, loan_id, item_id, member_id, checked_out_on)
Fange dessen ValueError mit pytest.raises auf und vergleiche den exakten Text That item is already checked out.. Versuche als Nächstes einen anderen verfügbaren Gegenstand für das Mitglied mit ausgeschöpftem Limit und verlange den exakten Text That member has reached the loan limit.. Die Formulierung zum Mitgliedslimit enthält „the loan limit“; behalte diese vollständige Meldung bei.
Schließe die ausführende Verbindung und öffne denselben Pfad erneut. Wähle jedes Ausleihfeld in ID-Reihenfolge aus und vergleiche die Zeilen mit den beiden festgeschriebenen Ausleihvorgängen deiner Vorbereitung. Dieser vollständige Vergleich belegt, dass keine Ablehnung eine Zeile eingefügt oder eine ältere geändert hat.
Der Test soll keine private Validierungsfunktion aufrufen und die Entscheidung nicht mit einem eigenen SELECT COUNT(*) wiederholen. Deine Vorbereitung schafft die Bedingungen; checkout_item trifft die Entscheidung. Auch irgendeinen ValueError zu testen ist zu breit, weil dadurch die beiden Bedeutungen vertauscht werden könnten.
Klicke auf Run. Der feste Einstieg ruft pytest.main(["-q", "-p", "no:cacheprovider", "tests/test_catalog.py"]) auf und sollte Folgendes ausgeben:
Database tests passed: 4
Submit prüft das Verhalten für aktive Gegenstände und Mitgliedslimits separat. Das Entfernen einer der Regeln muss die Testsuite fehlschlagen lassen, während alle vier Tests weiterhin erkannt werden. Du schützt zwei öffentliche Bedeutungen, nicht einen allgemeinen Fehlerzweig.
Aufgabe
Vervollständige test_checkout_refuses_active_items_and_full_members(tmp_path) in tests/test_catalog.py. Bereite beide Konflikte mit wiederholten execute()-Aufrufen oder kleinen Schleifen vor, rufe für jeden Versuch nur catalog_db.checkout_item auf, vergleiche die beiden exakten ValueError-Meldungen, schließe dann, öffne erneut und belege, dass jede frühere Ausleihzeile unverändert ist.