MicroFish/backend/tests/test_db_models.py

86 lines
3.2 KiB
Python

# backend/tests/test_db_models.py
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from backend.app.db import Base, init_db, get_session
from backend.app.models.db_models import (
ProjectModel, TaskModel, OntologyModel, GraphModel,
SimulationModel, ReportModel, UserModel
)
@pytest.fixture
def db_session():
"""Sessió SQLite en memòria per a tests."""
from backend.app import db as db_module
db_module._engine = create_engine("sqlite:///:memory:", connect_args={"check_same_thread": False})
db_module._SessionLocal = sessionmaker(bind=db_module._engine, autocommit=False, autoflush=False)
Base.metadata.create_all(db_module._engine)
session = db_module._SessionLocal()
yield session
session.close()
Base.metadata.drop_all(db_module._engine)
db_module._engine = None
db_module._SessionLocal = None
def test_create_project(db_session):
proj = ProjectModel(id="proj-1", name="Test Project")
db_session.add(proj)
db_session.commit()
result = db_session.get(ProjectModel, "proj-1")
assert result.name == "Test Project"
assert result.status == "created"
assert result.chunk_size == 500
def test_create_task(db_session):
task = TaskModel(id="task-1", task_type="graph_build", entity_type="project", entity_id="proj-1")
db_session.add(task)
db_session.commit()
result = db_session.get(TaskModel, "task-1")
assert result.status == "pending"
assert result.progress == 0
def test_project_cascade_delete(db_session):
proj = ProjectModel(id="proj-del", name="Del Project")
db_session.add(proj)
db_session.flush()
ont = OntologyModel(id="ont-1", project_id="proj-del", version=1)
db_session.add(ont)
db_session.commit()
db_session.delete(proj)
db_session.commit()
assert db_session.get(OntologyModel, "ont-1") is None
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)."""
task = TaskModel(id="task-del", task_type="graph_build")
proj = ProjectModel(id="proj-2", name="P2", active_task_id="task-del")
db_session.add_all([task, 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)
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")
def test_graph_linked_to_ontology(db_session):
proj = ProjectModel(id="proj-g", name="Graph Project")
ont = OntologyModel(id="ont-g", project_id="proj-g", version=1)
graph = GraphModel(id="graph-1", project_id="proj-g", ontology_id="ont-g", backend="zep")
db_session.add_all([proj, ont, graph])
db_session.commit()
result = db_session.get(GraphModel, "graph-1")
assert result.ontology_id == "ont-g"
assert result.backend == "zep"