"""Migration 0098's data cleanup, DB-lane. The schema half of every migration is checked by test_migrations.py; this one also deletes rows, and a delete that misses a row is invisible there. Its own file so the removed-features guard can name it. """ from alembic import command from alembic.config import Config from sqlalchemy import text from app.db import engine def test_dropping_the_demo_takes_every_audit_row_about_its_reset_job(db): # The reset job's interval could be changed from the scheduler page like any job's; once its # name is gone from the UI, a left-behind row would render as a raw job id. cfg = Config("alembic.ini") command.downgrade(cfg, "0097_drop_messages") try: with engine.begin() as conn: conn.execute( text( "INSERT INTO audit_log (action, target_type, target_id, created_at) VALUES" " ('job_run', 'job', 'demo_reset', now())," " ('scheduler_interval', 'job', 'demo_reset', now())," " ('scheduler_interval', 'job', 'sync_feed', now())" ) ) finally: command.upgrade(cfg, "head") with engine.connect() as conn: left = conn.execute( text("SELECT action, target_id FROM audit_log WHERE target_type = 'job' ORDER BY id") ).all() assert [tuple(r) for r in left] == [("scheduler_interval", "sync_feed")]