2025-12-18 08:00:04 +01:00
|
|
|
|
"""End-to-End tests for RAG backend interactions.
|
|
|
|
|
|
|
|
|
|
|
|
Tests environment-specific RAG backend communication, mTLS handling,
|
|
|
|
|
|
and query mode compatibility.
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.e2e
|
|
|
|
|
|
class TestRagBackendsE2E:
|
|
|
|
|
|
"""Test RAG backend communication across environments."""
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.e2e_ift
|
|
|
|
|
|
@pytest.mark.usefixtures("check_prerequisites")
|
|
|
|
|
|
def test_ift_bench_mode_query(
|
|
|
|
|
|
self,
|
|
|
|
|
|
e2e_client,
|
|
|
|
|
|
e2e_auth_headers,
|
|
|
|
|
|
setup_test_settings,
|
|
|
|
|
|
cleanup_test_sessions
|
|
|
|
|
|
):
|
|
|
|
|
|
"""Test IFT RAG backend with bench mode queries."""
|
|
|
|
|
|
query_data = {
|
|
|
|
|
|
"environment": "ift",
|
|
|
|
|
|
"questions": [
|
|
|
|
|
|
{"body": "Тест IFT bench режима вопрос 1", "with_docs": True},
|
|
|
|
|
|
{"body": "Тест IFT bench режима вопрос 2", "with_docs": False},
|
|
|
|
|
|
{"body": "Тест IFT bench режима вопрос 3", "with_docs": True}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response = e2e_client.post(
|
|
|
|
|
|
"/api/v1/query/bench",
|
|
|
|
|
|
json=query_data,
|
|
|
|
|
|
headers=e2e_auth_headers,
|
|
|
|
|
|
timeout=120.0
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
result = response.json()
|
|
|
|
|
|
|
2025-12-18 09:36:24 +01:00
|
|
|
|
|
2025-12-18 08:00:04 +01:00
|
|
|
|
assert result["environment"] == "ift"
|
|
|
|
|
|
assert "request_id" in result
|
|
|
|
|
|
assert "response" in result
|
|
|
|
|
|
assert "timestamp" in result
|
|
|
|
|
|
|
2025-12-18 09:36:24 +01:00
|
|
|
|
|
2025-12-18 08:00:04 +01:00
|
|
|
|
assert isinstance(result["response"], (dict, list))
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.e2e_psi
|
|
|
|
|
|
@pytest.mark.usefixtures("check_prerequisites")
|
|
|
|
|
|
def test_psi_backend_mode_query(
|
|
|
|
|
|
self,
|
|
|
|
|
|
e2e_client,
|
|
|
|
|
|
e2e_auth_headers,
|
|
|
|
|
|
setup_test_settings,
|
|
|
|
|
|
cleanup_test_sessions
|
|
|
|
|
|
):
|
|
|
|
|
|
"""Test PSI RAG backend with backend mode queries."""
|
|
|
|
|
|
query_data = {
|
|
|
|
|
|
"environment": "psi",
|
|
|
|
|
|
"questions": [
|
|
|
|
|
|
{"body": "Тест PSI backend режима", "with_docs": True}
|
|
|
|
|
|
],
|
|
|
|
|
|
"reset_session": False
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response = e2e_client.post(
|
|
|
|
|
|
"/api/v1/query/backend",
|
|
|
|
|
|
json=query_data,
|
|
|
|
|
|
headers=e2e_auth_headers,
|
|
|
|
|
|
timeout=120.0
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
result = response.json()
|
|
|
|
|
|
|
|
|
|
|
|
assert result["environment"] == "psi"
|
|
|
|
|
|
assert "response" in result
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.e2e_psi
|
|
|
|
|
|
@pytest.mark.usefixtures("check_prerequisites")
|
|
|
|
|
|
def test_psi_backend_mode_with_session_reset(
|
|
|
|
|
|
self,
|
|
|
|
|
|
e2e_client,
|
|
|
|
|
|
e2e_auth_headers,
|
|
|
|
|
|
setup_test_settings,
|
|
|
|
|
|
cleanup_test_sessions
|
|
|
|
|
|
):
|
|
|
|
|
|
"""Test PSI backend mode with session reset."""
|
2025-12-18 09:36:24 +01:00
|
|
|
|
|
2025-12-18 08:00:04 +01:00
|
|
|
|
query_data_1 = {
|
|
|
|
|
|
"environment": "psi",
|
|
|
|
|
|
"questions": [{"body": "Первый вопрос с контекстом", "with_docs": True}],
|
|
|
|
|
|
"reset_session": False
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response_1 = e2e_client.post(
|
|
|
|
|
|
"/api/v1/query/backend",
|
|
|
|
|
|
json=query_data_1,
|
|
|
|
|
|
headers=e2e_auth_headers,
|
|
|
|
|
|
timeout=120.0
|
|
|
|
|
|
)
|
|
|
|
|
|
assert response_1.status_code == 200
|
|
|
|
|
|
|
2025-12-18 09:36:24 +01:00
|
|
|
|
|
2025-12-18 08:00:04 +01:00
|
|
|
|
query_data_2 = {
|
|
|
|
|
|
"environment": "psi",
|
|
|
|
|
|
"questions": [{"body": "Второй вопрос после сброса", "with_docs": True}],
|
|
|
|
|
|
"reset_session": True
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response_2 = e2e_client.post(
|
|
|
|
|
|
"/api/v1/query/backend",
|
|
|
|
|
|
json=query_data_2,
|
|
|
|
|
|
headers=e2e_auth_headers,
|
|
|
|
|
|
timeout=120.0
|
|
|
|
|
|
)
|
|
|
|
|
|
assert response_2.status_code == 200
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.e2e_prod
|
|
|
|
|
|
@pytest.mark.usefixtures("check_prerequisites")
|
|
|
|
|
|
def test_prod_bench_mode_query(
|
|
|
|
|
|
self,
|
|
|
|
|
|
e2e_client,
|
|
|
|
|
|
e2e_auth_headers,
|
|
|
|
|
|
setup_test_settings,
|
|
|
|
|
|
cleanup_test_sessions
|
|
|
|
|
|
):
|
|
|
|
|
|
"""Test PROD RAG backend with bench mode queries."""
|
|
|
|
|
|
query_data = {
|
|
|
|
|
|
"environment": "prod",
|
|
|
|
|
|
"questions": [
|
|
|
|
|
|
{"body": "Тест PROD окружения", "with_docs": True}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response = e2e_client.post(
|
|
|
|
|
|
"/api/v1/query/bench",
|
|
|
|
|
|
json=query_data,
|
|
|
|
|
|
headers=e2e_auth_headers,
|
|
|
|
|
|
timeout=120.0
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
result = response.json()
|
|
|
|
|
|
assert result["environment"] == "prod"
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.e2e
|
|
|
|
|
|
@pytest.mark.usefixtures("check_prerequisites")
|
|
|
|
|
|
def test_query_with_docs_parameter(
|
|
|
|
|
|
self,
|
|
|
|
|
|
e2e_client,
|
|
|
|
|
|
e2e_auth_headers,
|
|
|
|
|
|
setup_test_settings,
|
|
|
|
|
|
cleanup_test_sessions
|
|
|
|
|
|
):
|
|
|
|
|
|
"""Test that with_docs parameter is properly handled."""
|
|
|
|
|
|
query_data = {
|
|
|
|
|
|
"environment": "ift",
|
|
|
|
|
|
"questions": [
|
|
|
|
|
|
{"body": "Вопрос с документами", "with_docs": True},
|
|
|
|
|
|
{"body": "Вопрос без документов", "with_docs": False}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response = e2e_client.post(
|
|
|
|
|
|
"/api/v1/query/bench",
|
|
|
|
|
|
json=query_data,
|
|
|
|
|
|
headers=e2e_auth_headers,
|
|
|
|
|
|
timeout=120.0
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.e2e
|
|
|
|
|
|
@pytest.mark.usefixtures("check_prerequisites")
|
|
|
|
|
|
def test_multiple_sequential_queries(
|
|
|
|
|
|
self,
|
|
|
|
|
|
e2e_client,
|
|
|
|
|
|
e2e_auth_headers,
|
|
|
|
|
|
setup_test_settings,
|
|
|
|
|
|
cleanup_test_sessions
|
|
|
|
|
|
):
|
|
|
|
|
|
"""Test multiple sequential queries to same environment."""
|
|
|
|
|
|
for i in range(3):
|
|
|
|
|
|
query_data = {
|
|
|
|
|
|
"environment": "ift",
|
|
|
|
|
|
"questions": [
|
|
|
|
|
|
{"body": f"Последовательный запрос #{i+1}", "with_docs": True}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response = e2e_client.post(
|
|
|
|
|
|
"/api/v1/query/bench",
|
|
|
|
|
|
json=query_data,
|
|
|
|
|
|
headers=e2e_auth_headers,
|
|
|
|
|
|
timeout=120.0
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
result = response.json()
|
|
|
|
|
|
assert "request_id" in result
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.e2e
|
|
|
|
|
|
@pytest.mark.usefixtures("check_prerequisites")
|
|
|
|
|
|
def test_cross_environment_queries(
|
|
|
|
|
|
self,
|
|
|
|
|
|
e2e_client,
|
|
|
|
|
|
e2e_auth_headers,
|
|
|
|
|
|
setup_test_settings,
|
|
|
|
|
|
cleanup_test_sessions
|
|
|
|
|
|
):
|
|
|
|
|
|
"""Test queries to different environments in sequence."""
|
2025-12-18 09:36:24 +01:00
|
|
|
|
environments = ["ift", "prod"]
|
2025-12-18 08:00:04 +01:00
|
|
|
|
|
|
|
|
|
|
for env in environments:
|
|
|
|
|
|
query_data = {
|
|
|
|
|
|
"environment": env,
|
|
|
|
|
|
"questions": [
|
|
|
|
|
|
{"body": f"Тест окружения {env.upper()}", "with_docs": True}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response = e2e_client.post(
|
|
|
|
|
|
"/api/v1/query/bench",
|
|
|
|
|
|
json=query_data,
|
|
|
|
|
|
headers=e2e_auth_headers,
|
|
|
|
|
|
timeout=120.0
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
result = response.json()
|
|
|
|
|
|
assert result["environment"] == env
|