Bewijs het gedrag van de database · oefening
Bescherm beide uitleenregels
Verwijzende sleutels kunnen niet elke uitleenbeslissing uitdrukken. Een voorwerp kan al een actieve uitlening hebben en een geldig lid kan al aan de opgeslagen uitleenlimiet zitten. Eén test van de publieke uitleenfunctie moet beide conflicten opzetten en voor elk de eigen uitleg vereisen.
Ga verder in tests/test_catalog.py. Maak test_checkout_refuses_active_items_and_full_members(tmp_path) af met create_fresh_database(tmp_path, "checkout-rules.db") en catalog_db.open_database(database_path). Voeg drie voorwerpen één voor één of in een korte lus in, plus twee leden. Geef het eerste lid ruimte voor nog een uitlening. Geef het tweede lid een limiet van 1 en één actieve uitlening. Voeg een afzonderlijke actieve uitlening toe voor een voorwerp van het eerste lid en commit daarna de beginsituatie.
Roep voor het actieve voorwerp alleen de publieke functie aan:
catalog_db.checkout_item(connection, loan_id, item_id, member_id, checked_out_on)
Vang de ValueError op met pytest.raises en vergelijk de exacte tekst That item is already checked out.. Probeer daarna een ander, beschikbaar voorwerp uit te lenen aan het lid dat aan zijn limiet zit en vereis de exacte tekst That member has reached the loan limit.. De melding over de ledenlimiet bevat “the loan limit”; behoud die volledige melding.
Sluit de verbinding die de handelingen uitvoerde en open hetzelfde pad opnieuw. Selecteer elk uitleenveld op volgorde van ID en vergelijk de rijen met de twee gecommitte uitleningen die je had klaargezet. Die volledige vergelijking bewijst dat geen van beide weigeringen een rij invoegde of een oudere rij veranderde.
De test mag geen private validatiefunctie aanroepen of de beslissing herhalen met een eigen SELECT COUNT(*). Jouw voorbereiding legt de omstandigheden vast; checkout_item neemt de beslissing. Elke willekeurige ValueError accepteren is ook te ruim, omdat de twee betekenissen dan verwisseld mogen worden.
Druk op Run. Het vaste startpunt roept pytest.main(["-q", "-p", "no:cacheprovider", "tests/test_catalog.py"]) aan en moet dit afdrukken:
Database tests passed: 4
Submit controleert het gedrag voor actieve voorwerpen en ledenlimieten afzonderlijk. Het verwijderen van een van de regels moet de suite laten mislukken terwijl alle vier de tests nog steeds worden gevonden. Je beschermt twee publieke betekenissen, niet één algemeen foutpad.
Opdracht
Maak test_checkout_refuses_active_items_and_full_members(tmp_path) in tests/test_catalog.py af. Zet beide conflicten op met herhaalde aanroepen van execute() of korte lussen, roep voor elke poging alleen catalog_db.checkout_item aan, vergelijk de twee exacte ValueError-meldingen, sluit daarna, open opnieuw en bewijs dat elke eerdere uitleenrij ongewijzigd is.