Compare commits

..

No commits in common. "b4a3a87e6e15c1724f1861f4fe41f893156cc62d" and "ca9dd84ab5e0ab3549f633f3a10cbf80dccd8aef" have entirely different histories.

7 changed files with 38 additions and 43 deletions

View File

@ -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

View File

@ -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())

View File

@ -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)

View File

@ -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:

View File

@ -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"
]

View File

@ -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")

View File

@ -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