Andrchest's picture
Single commit for HF2
365de9c
from app.backend.models.users import User # noqa: F401
from app.backend.models.chats import Chat # noqa: F401
from app.backend.models.messages import Message # noqa: F401
import os
from uuid import uuid4
import httpx
import pytest
from app.backend.models.messages import get_messages_by_chat_id
from app.settings import BASE_DIR
BASE_URL = os.environ.get('HF1_URL')
# --- Fixtures for Setup ---
@pytest.fixture
def artificial_user():
"""Fixture to create and log in an artificial user, returning user data."""
email = f"Test{uuid4()}@test.com"
password = "Goida123!"
payload = {"email": email, "password": password}
with httpx.Client(verify=False) as client:
# Create user
response = client.post(url=BASE_URL + "/new_user", json=payload, timeout=30.0)
if response.status_code != 200:
raise RuntimeError(f"Failed to create artificial user: {response.status_code} - {response.text}")
id = response.json().get("id", -1)
# Log in to get access token
headers = {"Content-Type": "application/json", "Accept": "application/json"}
response = client.post(url=BASE_URL + "/login", json=payload, headers=headers, timeout=30.0)
if response.status_code != 200:
raise RuntimeError(f"Login failed: {response.status_code} - {response.text}")
# Extract access token from set-cookie header
set_cookie_header = response.headers.get("set-cookie")
access_token = None
if set_cookie_header and "access_token=" in set_cookie_header:
access_token = set_cookie_header.split("access_token=")[1].split(";")[0]
if not access_token:
raise RuntimeError("No access token received from login")
return {"id": id, "email": email, "password": password, "access_token": access_token}
@pytest.fixture
def chat_data(artificial_user):
"""Fixture to create a chat for the artificial user, returning chat data."""
cookie = {"access_token": artificial_user["access_token"]}
with httpx.Client(verify=False, cookies=cookie) as client:
# Create chat
response = client.post(url=BASE_URL + "/new_chat", timeout=30.0)
if response.status_code != 303:
raise RuntimeError(f"Error while trying to create chat: {response.status_code} - {response.text}")
redirect_to = response.headers.get("location")
if not redirect_to or "login" in redirect_to:
raise RuntimeError(f"Authentication failed, redirected to: {redirect_to}")
# Follow redirect
response = client.get(url=BASE_URL + redirect_to)
if response.status_code != 200:
raise RuntimeError(f"Error while accessing chat: {response.status_code} - {response.text}")
try:
chat_id = int(redirect_to.split("/")[-1].split("id=")[-1])
except ValueError as e:
raise RuntimeError(f"Failed to parse chat_id from URL: {redirect_to} - {e}")
return {"chat_id": chat_id, "cookie": cookie}
# --- Test Functions ---
def test_create_artificial_user(artificial_user):
"""Test that an artificial user can be created and logged in."""
assert artificial_user["email"] is not None
assert artificial_user["password"] == "Goida123!"
assert artificial_user["access_token"] is not None
def test_validate_chat_creation(chat_data):
"""Test that a chat can be created successfully."""
assert chat_data["chat_id"] > 0
assert "access_token" in chat_data["cookie"]
def test_validate_message_sending(chat_data):
"""Test that a message can be sent to the chat."""
with httpx.Client(verify=False, cookies=chat_data["cookie"]) as client:
payload = {"prompt": "How is your day?", "chat_id": chat_data["chat_id"]}
response = client.post(
url=BASE_URL + "/message_with_docs",
data=payload,
timeout=180,
)
assert response.status_code == 200, f"Failed to send message: {response.status_code} - {response.text}"
def test_validate_docs_uploading(chat_data):
"""Test that a document can be uploaded with a message."""
file_path = os.path.join(BASE_DIR, "app", "tests", "integration", "testfile.txt")
# Create a test file if it doesn't exist
if not os.path.exists(file_path):
with open(file_path, "w") as f:
f.write("This is a test file for validation.")
with httpx.Client(verify=False, cookies=chat_data["cookie"]) as client:
with open(file_path, "rb") as f:
form_fields = {
"prompt": "How is your day?",
"chat_id": str(chat_data["chat_id"]),
}
files = [("files", ("testfile.txt", f, "text/plain"))]
response = client.post(
url=BASE_URL + "/message_with_docs",
data=form_fields,
files=files,
timeout=180,
)
assert response.status_code == 200, f"Failed to upload docs: {response.status_code} - {response.text}"
def test_validate_message_registration(chat_data):
"""Test that a sent message is registered in the chat."""
with httpx.Client(verify=False, cookies=chat_data["cookie"]) as client:
initial = get_messages_by_chat_id(chat_data["chat_id"]).count()
payload = {"prompt": "How is your day?", "chat_id": chat_data["chat_id"]}
response = client.post(
url=BASE_URL + "/message_with_docs",
data=payload,
timeout=180,
)
assert response.status_code == 200, f"Failed to send message: {response.status_code} - {response.text}"
after_sending = get_messages_by_chat_id(chat_data["chat_id"]).count()
assert after_sending - initial == 1, "Message was not registered"