379 lines
12 KiB
Python
379 lines
12 KiB
Python
"""Integration tests for analysis session endpoints."""
|
|
|
|
import pytest
|
|
|
|
|
|
@pytest.mark.integration
|
|
class TestAnalysisIntegration:
|
|
"""Integration tests for analysis session management."""
|
|
|
|
def test_create_session_success(self, client, auth_headers, clean_test_sessions):
|
|
"""Test creating analysis session with real DB API."""
|
|
session_data = {
|
|
"environment": "ift",
|
|
"api_mode": "bench",
|
|
"request": [
|
|
{"body": "Test question 1", "with_docs": True},
|
|
{"body": "Test question 2", "with_docs": False}
|
|
],
|
|
"response": {
|
|
"answers": [
|
|
{"answer": "Test answer 1", "docs": []},
|
|
{"answer": "Test answer 2", "docs": []}
|
|
]
|
|
},
|
|
"annotations": {
|
|
"duration_ms": 1234,
|
|
"model": "test-model",
|
|
"test_run": True
|
|
}
|
|
}
|
|
|
|
response = client.post(
|
|
"/api/v1/analysis/sessions",
|
|
json=session_data,
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert response.status_code == 201
|
|
|
|
data = response.json()
|
|
assert "session_id" in data
|
|
assert "user_id" in data
|
|
assert data["environment"] == "ift"
|
|
assert data["api_mode"] == "bench"
|
|
assert len(data["request"]) == 2
|
|
assert "created_at" in data
|
|
assert "updated_at" in data
|
|
|
|
def test_get_sessions_list(self, client, auth_headers, clean_test_sessions):
|
|
"""Test getting list of sessions."""
|
|
|
|
for env in ["ift", "psi", "prod"]:
|
|
session_data = {
|
|
"environment": env,
|
|
"api_mode": "bench",
|
|
"request": [{"body": f"Question for {env}"}],
|
|
"response": {"answer": f"Answer for {env}"},
|
|
"annotations": {}
|
|
}
|
|
client.post(
|
|
"/api/v1/analysis/sessions",
|
|
json=session_data,
|
|
headers=auth_headers
|
|
)
|
|
|
|
|
|
response = client.get("/api/v1/analysis/sessions", headers=auth_headers)
|
|
|
|
assert response.status_code == 200
|
|
|
|
data = response.json()
|
|
assert "sessions" in data
|
|
assert "total" in data
|
|
assert data["total"] >= 3
|
|
assert len(data["sessions"]) >= 3
|
|
|
|
|
|
for session in data["sessions"]:
|
|
assert "session_id" in session
|
|
assert "environment" in session
|
|
assert "created_at" in session
|
|
assert session["environment"] in ["ift", "psi", "prod"]
|
|
|
|
def test_get_sessions_with_filter(self, client, auth_headers, clean_test_sessions):
|
|
"""Test filtering sessions by environment."""
|
|
|
|
for env in ["ift", "psi"]:
|
|
for i in range(2):
|
|
session_data = {
|
|
"environment": env,
|
|
"api_mode": "bench",
|
|
"request": [{"body": f"Question {i}"}],
|
|
"response": {},
|
|
"annotations": {}
|
|
}
|
|
client.post(
|
|
"/api/v1/analysis/sessions",
|
|
json=session_data,
|
|
headers=auth_headers
|
|
)
|
|
|
|
|
|
response = client.get(
|
|
"/api/v1/analysis/sessions?environment=ift",
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
|
|
data = response.json()
|
|
assert data["total"] >= 2
|
|
|
|
|
|
for session in data["sessions"]:
|
|
assert session["environment"] == "ift"
|
|
|
|
def test_get_sessions_pagination(self, client, auth_headers, clean_test_sessions):
|
|
"""Test session pagination."""
|
|
|
|
for i in range(5):
|
|
session_data = {
|
|
"environment": "ift",
|
|
"api_mode": "bench",
|
|
"request": [{"body": f"Question {i}"}],
|
|
"response": {},
|
|
"annotations": {}
|
|
}
|
|
client.post(
|
|
"/api/v1/analysis/sessions",
|
|
json=session_data,
|
|
headers=auth_headers
|
|
)
|
|
|
|
|
|
response = client.get(
|
|
"/api/v1/analysis/sessions?limit=3&offset=0",
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert len(data["sessions"]) <= 3
|
|
|
|
|
|
response = client.get(
|
|
"/api/v1/analysis/sessions?limit=3&offset=3",
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
|
|
def test_get_session_by_id(self, client, auth_headers, clean_test_sessions):
|
|
"""Test getting specific session by ID."""
|
|
|
|
session_data = {
|
|
"environment": "psi",
|
|
"api_mode": "backend",
|
|
"request": [
|
|
{"body": "Detailed question", "with_docs": True}
|
|
],
|
|
"response": {
|
|
"answer": "Detailed answer",
|
|
"confidence": 0.95
|
|
},
|
|
"annotations": {
|
|
"duration_ms": 5678,
|
|
"tokens_used": 1234
|
|
}
|
|
}
|
|
|
|
create_response = client.post(
|
|
"/api/v1/analysis/sessions",
|
|
json=session_data,
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert create_response.status_code == 201
|
|
session_id = create_response.json()["session_id"]
|
|
|
|
|
|
get_response = client.get(
|
|
f"/api/v1/analysis/sessions/{session_id}",
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert get_response.status_code == 200
|
|
|
|
data = get_response.json()
|
|
assert data["session_id"] == session_id
|
|
assert data["environment"] == "psi"
|
|
assert data["api_mode"] == "backend"
|
|
assert data["request"][0]["body"] == "Detailed question"
|
|
assert data["response"]["answer"] == "Detailed answer"
|
|
assert data["annotations"]["duration_ms"] == 5678
|
|
|
|
def test_delete_session(self, client, auth_headers, clean_test_sessions):
|
|
"""Test deleting a session."""
|
|
|
|
session_data = {
|
|
"environment": "prod",
|
|
"api_mode": "bench",
|
|
"request": [{"body": "To be deleted"}],
|
|
"response": {},
|
|
"annotations": {}
|
|
}
|
|
|
|
create_response = client.post(
|
|
"/api/v1/analysis/sessions",
|
|
json=session_data,
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert create_response.status_code == 201
|
|
session_id = create_response.json()["session_id"]
|
|
|
|
|
|
delete_response = client.delete(
|
|
f"/api/v1/analysis/sessions/{session_id}",
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert delete_response.status_code == 204
|
|
|
|
|
|
get_response = client.get(
|
|
f"/api/v1/analysis/sessions/{session_id}",
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert get_response.status_code == 404
|
|
|
|
def test_delete_nonexistent_session(self, client, auth_headers):
|
|
"""Test deleting non-existent session."""
|
|
fake_session_id = "00000000-0000-0000-0000-000000000000"
|
|
|
|
response = client.delete(
|
|
f"/api/v1/analysis/sessions/{fake_session_id}",
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert response.status_code == 404
|
|
|
|
def test_create_session_invalid_environment(self, client, auth_headers):
|
|
"""Test creating session with invalid environment."""
|
|
session_data = {
|
|
"environment": "invalid",
|
|
"api_mode": "bench",
|
|
"request": [],
|
|
"response": {},
|
|
"annotations": {}
|
|
}
|
|
|
|
response = client.post(
|
|
"/api/v1/analysis/sessions",
|
|
json=session_data,
|
|
headers=auth_headers
|
|
)
|
|
|
|
|
|
assert response.status_code in [400, 422]
|
|
|
|
def test_sessions_require_authentication(self, client):
|
|
"""Test that session endpoints require authentication."""
|
|
|
|
response = client.post(
|
|
"/api/v1/analysis/sessions",
|
|
json={"environment": "ift", "api_mode": "bench", "request": [], "response": {}, "annotations": {}}
|
|
)
|
|
assert response.status_code == 401
|
|
|
|
|
|
response = client.get("/api/v1/analysis/sessions")
|
|
assert response.status_code == 401
|
|
|
|
|
|
response = client.get("/api/v1/analysis/sessions/some-id")
|
|
assert response.status_code == 401
|
|
|
|
|
|
response = client.delete("/api/v1/analysis/sessions/some-id")
|
|
assert response.status_code == 401
|
|
|
|
def test_create_multiple_sessions_same_user(self, client, auth_headers, clean_test_sessions):
|
|
"""Test creating multiple sessions for same user."""
|
|
session_ids = []
|
|
|
|
for i in range(3):
|
|
session_data = {
|
|
"environment": "ift",
|
|
"api_mode": "bench",
|
|
"request": [{"body": f"Question {i}"}],
|
|
"response": {"answer": f"Answer {i}"},
|
|
"annotations": {"iteration": i}
|
|
}
|
|
|
|
response = client.post(
|
|
"/api/v1/analysis/sessions",
|
|
json=session_data,
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert response.status_code == 201
|
|
session_ids.append(response.json()["session_id"])
|
|
|
|
|
|
list_response = client.get("/api/v1/analysis/sessions", headers=auth_headers)
|
|
assert list_response.status_code == 200
|
|
assert list_response.json()["total"] >= 3
|
|
|
|
|
|
assert len(set(session_ids)) == 3
|
|
|
|
def test_session_data_integrity(self, client, auth_headers, clean_test_sessions):
|
|
"""Test that session data is stored and retrieved without corruption."""
|
|
complex_data = {
|
|
"environment": "psi",
|
|
"api_mode": "backend",
|
|
"request": [
|
|
{
|
|
"body": "Complex question with special chars: Привет! 你好 こんにちは",
|
|
"with_docs": True,
|
|
"metadata": {
|
|
"source": "test",
|
|
"priority": 1,
|
|
"tags": ["integration", "test", "unicode"]
|
|
}
|
|
}
|
|
],
|
|
"response": {
|
|
"answer": "Complex answer with nested data",
|
|
"confidence": 0.98,
|
|
"sources": [
|
|
{"doc_id": "doc1", "relevance": 0.95},
|
|
{"doc_id": "doc2", "relevance": 0.87}
|
|
],
|
|
"metadata": {
|
|
"model": "gpt-4",
|
|
"temperature": 0.7,
|
|
"tokens": {"prompt": 100, "completion": 200}
|
|
}
|
|
},
|
|
"annotations": {
|
|
"test_type": "integration",
|
|
"special_chars": "!@#$%^&*()",
|
|
"unicode": "Тест 测试 テスト",
|
|
"nested": {
|
|
"level1": {
|
|
"level2": {
|
|
"value": "deep nested value"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
create_response = client.post(
|
|
"/api/v1/analysis/sessions",
|
|
json=complex_data,
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert create_response.status_code == 201
|
|
session_id = create_response.json()["session_id"]
|
|
|
|
|
|
get_response = client.get(
|
|
f"/api/v1/analysis/sessions/{session_id}",
|
|
headers=auth_headers
|
|
)
|
|
|
|
assert get_response.status_code == 200
|
|
retrieved_data = get_response.json()
|
|
|
|
|
|
assert "Привет" in retrieved_data["request"][0]["body"]
|
|
assert retrieved_data["response"]["sources"][0]["doc_id"] == "doc1"
|
|
assert retrieved_data["annotations"]["nested"]["level1"]["level2"]["value"] == "deep nested value"
|