fix: improve test isolation and configuration

- Use in-memory SQLite for tests to prevent conflicts
- Add try/finally for robust test cleanup
- Make database URL configurable via env var
- Make CORS origins configurable via env var
- Make SQL echo configurable via env var
This commit is contained in:
2026-05-11 21:25:35 +02:00
parent 878e303cc6
commit 55ba9b62d6
3 changed files with 17 additions and 14 deletions
+3 -2
View File
@@ -1,9 +1,10 @@
import os
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
from sqlalchemy.orm import declarative_base from sqlalchemy.orm import declarative_base
DATABASE_URL = "sqlite+aiosqlite:///./backup_tool.db" DATABASE_URL = os.environ.get("DATABASE_URL", "sqlite+aiosqlite:///./backup_tool.db")
engine = create_async_engine(DATABASE_URL, echo=True) engine = create_async_engine(DATABASE_URL, echo=os.environ.get("SQL_ECHO", "false").lower() == "true")
AsyncSessionLocal = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) AsyncSessionLocal = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
Base = declarative_base() Base = declarative_base()
+2 -1
View File
@@ -1,3 +1,4 @@
import os
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
@@ -18,7 +19,7 @@ app = FastAPI(
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origins=["http://localhost:3000"], allow_origins=os.environ.get("CORS_ORIGINS", "http://localhost:3000").split(","),
allow_credentials=True, allow_credentials=True,
allow_methods=["*"], allow_methods=["*"],
allow_headers=["*"], allow_headers=["*"],
+12 -11
View File
@@ -5,21 +5,22 @@ from app.database import Base, get_db
from app.main import app from app.main import app
from httpx import AsyncClient from httpx import AsyncClient
TEST_DATABASE_URL = "sqlite+aiosqlite:///./test.db" TEST_DATABASE_URL = "sqlite+aiosqlite:///:memory:"
@pytest_asyncio.fixture @pytest_asyncio.fixture
async def db(): async def db():
engine = create_async_engine(TEST_DATABASE_URL, echo=False) engine = create_async_engine(TEST_DATABASE_URL, echo=False)
async with engine.begin() as conn: try:
await conn.run_sync(Base.metadata.create_all) async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async_session = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async with async_session() as session: async_session = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
yield session async with async_session() as session:
yield session
async with engine.begin() as conn: finally:
await conn.run_sync(Base.metadata.drop_all) async with engine.begin() as conn:
await engine.dispose() await conn.run_sync(Base.metadata.drop_all)
await engine.dispose()
@pytest_asyncio.fixture @pytest_asyncio.fixture
async def client(db): async def client(db):