510:    def test_delete_and_clear_all(self, api, db):
561:    def test_preview_renders_real_messages(self, api, db):
    def test_delete_and_clear_all(self, api, db):
        f = _seed_campaign_fixture(db, user_id_of(api))
        c1 = api.post("/campaigns/create", headers=H(api),
                      json=_cIn(f, name="D1")).json()["id"]
        c2 = api.post("/campaigns/create", headers=H(api),
                      json=_cIn(f, name="D2")).json()["id"]
        r = api.post(f"/campaigns/{c1}/delete", headers=H(api))
        assert r.status_code == 200 and r.json()["deleted"] == c1
        # running campaign cannot be deleted
        from app.models import Campaign
        c = db.get(Campaign, c2)
        c.status = "running"
        db.commit()
        r2 = api.post(f"/campaigns/{c2}/delete", headers=H(api))
        assert r2.status_code == 409
        # clear-all skips running, deletes the rest
        r3 = api.post("/campaigns/clear-all", headers=H(api))
        assert r3.status_code == 200
        d = r3.json()
        assert d["deleted"] >= 1 and d["skipped"] >= 1
        assert api.get("/campaigns/list").json()["total"] == 0

    def test_list_filters(self, api, db):
