diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 7f17dd0..382bc76 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -27,17 +27,16 @@ jobs: services: postgres: image: postgres:14 + env: + POSTGRES_DB: didier_action + POSTGRES_PASSWORD: postgres options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - - 5433:5432 - env: - POSTGRES_DB: didier_pytest - POSTGRES_USER: pytest - POSTGRES_PASSWORD: pytest + - 5432:5432 steps: - uses: actions/checkout@v3 - name: Setup Python @@ -55,6 +54,10 @@ jobs: run: pip3 install -r requirements.txt -r requirements-dev.txt - name: Run Pytest run: pytest tests + env: + DB_TEST_SQLITE: false + DB_NAME: didier_action + DB_PASSWORD: postgres linting: needs: [dependencies] runs-on: ubuntu-latest diff --git a/alembic/env.py b/alembic/env.py index 82eae2b..f28faf3 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -68,10 +68,4 @@ async def run_migrations_online() -> None: if context.is_offline_mode(): run_migrations_offline() else: - # Wonky way to use the Pytest event loop instead of another one - try: - loop = asyncio.get_running_loop() - if loop and loop.is_running(): - loop.create_task(run_migrations_online()) - except RuntimeError: - asyncio.run(run_migrations_online()) + asyncio.run(run_migrations_online()) diff --git a/database/engine.py b/database/engine.py index fbdbfd2..70c70fe 100644 --- a/database/engine.py +++ b/database/engine.py @@ -6,17 +6,27 @@ from sqlalchemy.orm import sessionmaker import settings -encoded_password = quote_plus(settings.DB_PASSWORD) -engine = create_async_engine( - URL.create( - drivername="postgresql+asyncpg", - username=settings.DB_USERNAME, - password=encoded_password, - host=settings.DB_HOST, - port=settings.DB_PORT, - database=settings.DB_NAME, - ), - pool_pre_ping=True, -) +# Run local tests against SQLite instead of Postgres +if settings.TESTING and settings.DB_TEST_SQLITE: + engine = create_async_engine( + URL.create( + drivername="sqlite+aiosqlite", + database="tests.db", + ), + connect_args={"check_same_thread": False}, + ) +else: + encoded_password = quote_plus(settings.DB_PASSWORD) + engine = create_async_engine( + URL.create( + drivername="postgresql+asyncpg", + username=settings.DB_USERNAME, + password=encoded_password, + host=settings.DB_HOST, + port=settings.DB_PORT, + database=settings.DB_NAME, + ), + pool_pre_ping=True, + ) DBSession = sessionmaker(autocommit=False, autoflush=False, bind=engine, class_=AsyncSession, expire_on_commit=False) diff --git a/docker-compose.yml b/docker-compose.yml index 25cd531..d34f4a7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,15 +12,5 @@ services: - "${DB_PORT:-5432}:${DB_PORT:-5432}" volumes: - db:/var/lib/postgresql/data - db-pytest: - image: postgres:14 - container_name: didier-pytest - restart: always - environment: - - POSTGRES_DB=didier_pytest - - POSTGRES_USER=pytest - - POSTGRES_PASSWORD=pytest - ports: - - "5433:5432" volumes: db: diff --git a/pyproject.toml b/pyproject.toml index 5263a7b..bfc1ced 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,10 +24,9 @@ good-names = ["i", "dt"] [tool.pytest.ini_options] asyncio_mode = "auto" env = [ - "DB_NAME = didier_pytest", - "DB_USERNAME = pytest", - "DB_PASSWORD = pytest", + "TESTING = true", + "DB_NAME = didier_action", + "DB_USERNAME = postgres", "DB_HOST = localhost", - "DB_PORT = 5433", "DISC_TOKEN = token" ] diff --git a/settings.py b/settings.py index d850eb8..797b052 100644 --- a/settings.py +++ b/settings.py @@ -9,6 +9,7 @@ env.read_env() """General config""" SANDBOX: bool = env.bool("SANDBOX", True) LOGFILE: str = env.str("LOGFILE", "didier.log") +TESTING: bool = env.bool("TESTING", False) """Database""" DB_NAME: str = env.str("DB_NAME", "didier") @@ -16,6 +17,7 @@ DB_USERNAME: str = env.str("DB_USERNAME", "postgres") DB_PASSWORD: str = env.str("DB_PASSWORD", "") DB_HOST: str = env.str("DB_HOST", "localhost") DB_PORT: int = env.int("DB_PORT", "5432") +DB_TEST_SQLITE: bool = env.bool("DB_TEST_SQLITE", True) """Discord""" DISCORD_TOKEN: str = env.str("DISC_TOKEN") diff --git a/tests/conftest.py b/tests/conftest.py index ded04d5..799c3bc 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,7 +5,6 @@ from unittest.mock import MagicMock import pytest from sqlalchemy.ext.asyncio import AsyncSession -from alembic import config, command from database.engine import engine from database.models import Base from didier import Didier @@ -21,10 +20,8 @@ def event_loop() -> Generator: @pytest.fixture(scope="session") async def tables(event_loop): """Initialize a database before the tests, and then tear it down again""" - alembic_config: config.Config = config.Config("alembic.ini") - command.upgrade(alembic_config, "head") - yield - command.downgrade(alembic_config, "base") + async with engine.begin() as connection: + await connection.run_sync(Base.metadata.create_all) @pytest.fixture