fix: isolate tests on in-memory SQLite to protect production database
Tests were importing the production engine and dropping all tables on teardown, corrupting topology.db in the Docker volume. Set DATABASE_URL to sqlite:///:memory: before any import in the test file, and use StaticPool in database.py when running against :memory: so all connections share the same in-memory database. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+6
-4
@@ -9,10 +9,12 @@ os.makedirs("data", exist_ok=True)
|
|||||||
|
|
||||||
_DATABASE_URL = os.environ.get("DATABASE_URL", "sqlite:///./data/topology.db")
|
_DATABASE_URL = os.environ.get("DATABASE_URL", "sqlite:///./data/topology.db")
|
||||||
|
|
||||||
engine = create_engine(
|
_engine_kwargs: dict = {"connect_args": {"check_same_thread": False}}
|
||||||
_DATABASE_URL,
|
if ":memory:" in _DATABASE_URL:
|
||||||
connect_args={"check_same_thread": False}
|
from sqlalchemy.pool import StaticPool
|
||||||
)
|
_engine_kwargs["poolclass"] = StaticPool
|
||||||
|
|
||||||
|
engine = create_engine(_DATABASE_URL, **_engine_kwargs)
|
||||||
|
|
||||||
|
|
||||||
@event.listens_for(Engine, "connect")
|
@event.listens_for(Engine, "connect")
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ from sqlalchemy import text
|
|||||||
import sys, os
|
import sys, os
|
||||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
|
# Redirect to an in-memory database so tests never touch the production volume.
|
||||||
|
os.environ["DATABASE_URL"] = "sqlite:///:memory:"
|
||||||
|
|
||||||
from database import engine, Base
|
from database import engine, Base
|
||||||
from main import app, _migrate_users_must_change_password, _migrate_users_token_version, _migrate_users
|
from main import app, _migrate_users_must_change_password, _migrate_users_token_version, _migrate_users
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user