feat(bot): модель данных, миграции Alembic, FSM в БД, TTL-чистка
- app/db/models.py: 13 таблиц (ARCHITECTURE §2.10); перечисления — VARCHAR + CHECK, JSON → JSONB на Postgres, BIGINT/INTEGER-ключи для SQLite - миграция 0001 (автогенерация + ручная чистка: импорт sa.Text, дубли CHECK) - миграции применяются при старте бота программно (app.db.migrate), script_location из пакета - SqlStorage: FSM aiogram поверх fsm_state — состояние переживает рестарт (перенесено из #4) - cleanup_loop: истёкшие черновики, снимки контейнеров и попытки входа старше суток - тесты: upgrade/downgrade, дрейф моделей и миграций, CHECK, CASCADE, FSM, чистка Refs #5 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -23,8 +23,9 @@ def test_age_decides(tmp_path: Path) -> None:
|
||||
async def test_heartbeat_touches_file(tmp_path: Path) -> None:
|
||||
hb = tmp_path / "hb"
|
||||
task = asyncio.create_task(health.heartbeat(hb, interval=10))
|
||||
await asyncio.sleep(0)
|
||||
assert hb.exists()
|
||||
async with asyncio.timeout(2):
|
||||
while not hb.exists(): # noqa: ASYNC110 - polling the filesystem; touch runs in a worker thread
|
||||
await asyncio.sleep(0.01)
|
||||
task.cancel()
|
||||
with contextlib.suppress(asyncio.CancelledError):
|
||||
await task
|
||||
|
||||
Reference in New Issue
Block a user