test(db): enable SQLite PRAGMA foreign_keys=ON in fixture for strict FK assertions

This commit is contained in:
Ubuntu 2026-05-02 23:56:58 +00:00
parent 773cc250c9
commit 999f6efa4f
1 changed files with 17 additions and 7 deletions

View File

@ -12,8 +12,16 @@ from backend.app.models.db_models import (
@pytest.fixture
def db_session():
"""Sessió SQLite en memòria per a tests."""
from sqlalchemy import event
from backend.app import db as db_module
db_module._engine = create_engine("sqlite:///:memory:", connect_args={"check_same_thread": False})
@event.listens_for(db_module._engine, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record):
cursor = dbapi_connection.cursor()
cursor.execute("PRAGMA foreign_keys=ON")
cursor.close()
db_module._SessionLocal = sessionmaker(bind=db_module._engine, autocommit=False, autoflush=False)
Base.metadata.create_all(db_module._engine)
session = db_module._SessionLocal()
@ -56,22 +64,24 @@ def test_project_cascade_delete(db_session):
def test_task_set_null_on_delete(db_session):
"""SQLite no aplica FK ON DELETE SET NULL sense PRAGMA foreign_keys=ON.
El test verifica que el TaskModel s'elimina correctament i que el ProjectModel
manté la seva integritat (active_task_id pot no quedar NULL en SQLite sense PRAGMA)."""
"""SQLite applies FK ON DELETE SET NULL with PRAGMA foreign_keys=ON.
Test verifies that when a TaskModel is deleted, the ProjectModel's active_task_id
is set to NULL due to the ON DELETE SET NULL constraint."""
task = TaskModel(id="task-del", task_type="graph_build")
db_session.add(task)
db_session.flush() # Ensure task is persisted before project references it
proj = ProjectModel(id="proj-2", name="P2", active_task_id="task-del")
db_session.add_all([task, proj])
db_session.add(proj)
db_session.commit()
db_session.delete(task)
db_session.commit()
# Verify task is deleted
assert db_session.get(TaskModel, "task-del") is None
# Verify project still exists (SQLite may not NULL the FK without PRAGMA)
# Verify project still exists
refreshed = db_session.get(ProjectModel, "proj-2")
assert refreshed is not None
# active_task_id may be None (with FK enforcement) or still "task-del" (SQLite default)
assert refreshed.active_task_id in (None, "task-del")
# With PRAGMA foreign_keys=ON, active_task_id should be NULL
assert refreshed.active_task_id is None
def test_graph_linked_to_ontology(db_session):