Files
blog.pyaqa.ru/tests/integration/test_migrations.py
Sergey Vanyushkin 9cc2f6284d feat: add alembic migrations, integration tests, and CI support
- Add alembic dependency and initialize migration framework
- Configure async alembic env.py for SQLAlchemy 2.0
- Create initial migration for PostORM table
- Gate init_db() with SKIP_INIT_DB env var for CI/production
- Add PostgreSQL service to Woodpecker CI pipeline
- Create integration tests for migrations (TC-INT-001..002)
- Create integration tests for SQLAlchemyPostRepository (TC-INT-003..009)
- Add unit test for init_db skip behavior (TC-UNIT-901)
- All 176 tests pass, coverage 72.59%
2026-05-10 12:47:30 +03:00

45 lines
1.7 KiB
Python

from typing import cast
import pytest
from sqlalchemy import inspect
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession
class TestMigrations:
@pytest.mark.asyncio
async def test_initial_migration_creates_post_table(self, db_session: AsyncSession) -> None:
engine = cast(AsyncEngine, db_session.bind)
async with engine.connect() as conn:
tables = await conn.run_sync(lambda sync_conn: inspect(sync_conn).get_table_names())
assert "posts" in tables
@pytest.mark.asyncio
async def test_posts_table_has_expected_columns(self, db_session: AsyncSession) -> None:
engine = cast(AsyncEngine, db_session.bind)
async with engine.connect() as conn:
columns = await conn.run_sync(lambda sync_conn: inspect(sync_conn).get_columns("posts"))
column_names = [col["name"] for col in columns]
expected = [
"id",
"title",
"content",
"slug",
"author_id",
"published",
"tags",
"created_at",
"updated_at",
]
for col in expected:
assert col in column_names
@pytest.mark.asyncio
async def test_posts_table_has_indexes(self, db_session: AsyncSession) -> None:
engine = cast(AsyncEngine, db_session.bind)
async with engine.connect() as conn:
indexes = await conn.run_sync(lambda sync_conn: inspect(sync_conn).get_indexes("posts"))
index_names = [idx["name"] for idx in indexes]
assert "ix_posts_slug" in index_names
assert "ix_posts_author_id" in index_names
assert "ix_posts_published" in index_names