MicroFish/backend/tests/test_graph_api_project.py

144 lines
4.8 KiB
Python

"""Tests d'integració per als endpoints de projecte de graph.py."""
import pytest
from unittest.mock import MagicMock, patch
@pytest.fixture
def mock_storage():
s = MagicMock()
s.exists.return_value = False
s.delete_prefix.return_value = None
return s
@pytest.fixture
def app(in_memory_db, mock_storage):
"""Flask app amb BD en memòria i storage mock.
in_memory_db ja ha configurat db_module._engine i _SessionLocal.
Passem un DATABASE_URL de sqlite en memòria perquè create_app() cridi
init_db() amb el mateix engine; però com que in_memory_db ja ha establert
els mòduls globals, parchegem init_db per evitar que sobreescrigui l'engine.
"""
import backend.app.db as db_module
# Guardem les referències que in_memory_db ja ha configurat
saved_engine = db_module._engine
saved_session = db_module._SessionLocal
def _noop_init_db(url):
# Restaurem per si create_app() reseteja el mòdul
db_module._engine = saved_engine
db_module._SessionLocal = saved_session
with patch('backend.app.db.init_db', side_effect=_noop_init_db):
from backend.app import create_app
application = create_app()
application.config['TESTING'] = True
application.extensions['storage'] = mock_storage
# Assegurem que el mòdul db segueix apuntant a l'engine en memòria
db_module._engine = saved_engine
db_module._SessionLocal = saved_session
return application
@pytest.fixture
def client(app):
with app.test_client() as c:
yield c
# ──────────────────────────────────────────────
# Tests
# ──────────────────────────────────────────────
def test_list_projects_empty(client):
res = client.get('/api/graph/project/list')
assert res.status_code == 200
data = res.get_json()
assert data['success'] is True
assert data['data'] == []
assert data['count'] == 0
def test_get_project_not_found(client):
res = client.get('/api/graph/project/nonexistent-id')
assert res.status_code == 404
data = res.get_json()
assert data['success'] is False
def test_create_and_get_project(client, in_memory_db):
from backend.app.models.project import ProjectManager
proj = ProjectManager.create_project(name="Test Project")
project_id = proj['project_id']
res = client.get(f'/api/graph/project/{project_id}')
assert res.status_code == 200
data = res.get_json()
assert data['success'] is True
assert data['data']['name'] == 'Test Project'
assert data['data']['graph_id'] is None
assert data['data']['ontology'] is None
def test_list_projects_returns_created(client, in_memory_db):
from backend.app.models.project import ProjectManager
ProjectManager.create_project(name="Alpha")
ProjectManager.create_project(name="Beta")
res = client.get('/api/graph/project/list')
assert res.status_code == 200
data = res.get_json()
assert data['count'] == 2
names = [p['name'] for p in data['data']]
assert 'Alpha' in names
assert 'Beta' in names
def test_delete_project(client, in_memory_db, mock_storage):
from backend.app.models.project import ProjectManager
proj = ProjectManager.create_project(name="ToDelete")
project_id = proj['project_id']
res = client.delete(f'/api/graph/project/{project_id}')
assert res.status_code == 200
assert res.get_json()['success'] is True
res2 = client.get(f'/api/graph/project/{project_id}')
assert res2.status_code == 404
def test_reset_project_to_created(client, in_memory_db):
from backend.app.models.project import ProjectManager
proj = ProjectManager.create_project(name="ToReset")
project_id = proj['project_id']
ProjectManager.save_project({"id": project_id, "status": "graph_completed"})
res = client.post(f'/api/graph/project/{project_id}/reset')
assert res.status_code == 200
data = res.get_json()
assert data['success'] is True
assert data['data']['status'] == 'created' # sense ontologia → torna a 'created'
def test_reset_project_to_ontology_generated(client, in_memory_db):
from backend.app.models.project import ProjectManager
proj = ProjectManager.create_project(name="ToReset2")
project_id = proj['project_id']
ProjectManager.save_project({"id": project_id, "status": "graph_completed"})
ProjectManager.save_ontology(project_id, [{"name": "Person"}], [{"name": "KNOWS"}])
res = client.post(f'/api/graph/project/{project_id}/reset')
assert res.status_code == 200
data = res.get_json()
assert data['data']['status'] == 'ontology_generated'
def test_reset_nonexistent_project(client):
res = client.post('/api/graph/project/nonexistent/reset')
assert res.status_code == 404