0%

Bewijs het gedrag van de database · oefening

Weiger een versiemarkering die niet klopt

Een versiemarkering doet een uitspraak over de structuur van een database. Test één database met een kloppende versie 1 die moet migreren en één database waarvan de markering versie 1 aangeeft terwijl members.email al bestaat.

De nieuwe functie op moduleniveau in tests/test_catalog.py wordt meegeleverd met precies deze interface:

write_version_one_database(database_path, include_email=False)

Die opent het meegegeven pad, schrijft de vastgelegde tabellen en markering van versie 1, voegt desgewenst de afwijkende e-mailkolom toe, commit en sluit. Laat deze functie ongewijzigd. Maak in test_schema_guard_checks_marker_and_shape(tmp_path) twee paden en doe precies deze aanroepen voordat je de voorbereidingsfunctie test:

write_version_one_database(exact_path)
write_version_one_database(mismatched_path, include_email=True)

Voeg een gewoon lid toe aan de database met de exacte structuur, sluit haar en roep catalog_setup.prepare_database(exact_path) aan. Open opnieuw en vereis versie 2, de ledenkolommen in volgorde met email achteraan en het behouden lid met Python None in dat nieuwe veld.

Voeg voor het afwijkende pad een herkenbaar controlelid met een e-mailadres toe en leg de versie, de kolommen in volgorde en de rijen vast. Roep catalog_setup.prepare_database(mismatched_path) aan binnen pytest.raises(ValueError). Vergelijk de exacte melding Schema version 1 does not match the expected tables and columns.. Open nogmaals en bewijs dat de markering, kolommen en controlerij gelijk zijn aan de waarden van vóór de aanroep.

Bouw elke geordende kolomlijst met een korte expliciete lus over PRAGMA table_info(members). Zo blijft het bewijs leesbaar zonder hier een nieuwe Python-uitdrukkingsvorm te introduceren.

Beide takken horen in dezelfde test, omdat ze een onjuiste reparatie voorkomen die elke database van versie 1 weigert. Succes bewijst dat migratie nog werkt; weigering bewijst dat de markering alleen niet genoeg is. Accepteer niet elke willekeurige exception. Een OperationalError doordat ALTER TABLE te vroeg wordt geprobeerd, bewijst dat de code het schema probeerde te veranderen voordat het was gevalideerd.

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: 7

Submit controleert een beslissing op alleen de markering en een verzwakte vergelijking van de kolomvolgorde in afzonderlijke nieuwe uitvoeringen. Je bewijs van vóór en na de aanroep moet beide afwijzen terwijl een correct migratiepad blijft werken.

Opdracht

Maak test_schema_guard_checks_marker_and_shape(tmp_path) in tests/test_catalog.py af. Gebruik de meegeleverde functie write_version_one_database(database_path, include_email=False) met beide exacte aanroepen, bewijs dat het pad met de kloppende structuur migreert met behoud van gegevens en bewijs dat het afwijkende pad de exacte ValueError opwerpt zonder de markering, kolommen in volgorde of rijen te veranderen.