def test_rollback_happens_on_step_failure(backend): with migrations_dir(""" step("", "CREATE TABLE yoyo_is_rolledback (i INT)"), step("CREATE TABLE yoyo_test (s VARCHAR(100))", "DROP TABLE yoyo_test") step("invalid sql!")""") as tmpdir: migrations = read_migrations(tmpdir) with pytest.raises(backend.DatabaseError): backend.apply_migrations(migrations) # The yoyo_test table should have either been deleted (transactional ddl) # or dropped (non-transactional-ddl) with pytest.raises(backend.DatabaseError): backend.execute("SELECT * FROM yoyo_test") # Transactional DDL: rollback steps not executed if backend.has_transactional_ddl: with pytest.raises(backend.DatabaseError): backend.execute("SELECT * FROM yoyo_is_rolledback") # Non-transactional DDL: ensure the rollback steps were executed else: cursor = backend.execute("SELECT * FROM yoyo_is_rolledback") assert list(cursor.fetchall()) == []
def test_post_apply_hooks_are_run_every_time(self): backend = get_backend(dburi) migrations = migrations_dir( **{ "a": "step('create table postapply (i int)')", "post-apply": "step('insert into postapply values (1)')", }) with migrations as tmp: def count_postapply_calls(): cursor = backend.cursor() cursor.execute("SELECT count(1) FROM postapply") return cursor.fetchone()[0] def _apply_migrations(): backend.apply_migrations(backend.to_apply( read_migrations(tmp))) # Should apply migration 'a' and call the post-apply hook _apply_migrations() assert count_postapply_calls() == 1 # No outstanding migrations: post-apply hook should not be called _apply_migrations() assert count_postapply_calls() == 1 # New migration added: post-apply should be called a second time migrations.add_migration("b", "") _apply_migrations() assert count_postapply_calls() == 2
def test_migration_is_committed(backend): with migrations_dir('step("CREATE TABLE yoyo_test (id INT)")') as tmpdir: migrations = read_migrations(tmpdir) backend.apply_migrations(migrations) backend.rollback() rows = backend.execute("SELECT * FROM yoyo_test").fetchall() assert list(rows) == []