govorov/backend/tests/test_calculation_api.py

97 lines
4.9 KiB
Python
Raw Permalink Normal View History

2025-04-07 09:02:54 +02:00
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session
import pytest
# Импортируем модели и схемы (если нужно для assert'ов)
from app.models.calculation import Calculation
from app.schemas.calculation import CalculationRead
# Используем фикстуры client и db_session из conftest.py
def test_create_calculation(client: TestClient, db_session: Session):
"""Тест успешного создания расчета."""
input_data = {
"input_params": {"width": 1000, "height": 800, "pieces": [1, 2, 3]},
"model_name": "test_model"
}
response = client.post("/calculation/", json=input_data)
assert response.status_code == 201
data = response.json()
assert data["input_params"] == input_data["input_params"]
assert data["model_name"] == input_data["model_name"]
assert "id" in data
assert "timestamp" in data
assert "output_results" in data # Заглушка должна вернуть результаты
assert data["output_results"] is not None
# Можно добавить более детальные проверки output_results, если заглушка детерминирована
# assert "waste_percentage" in data["output_results"]
assert "objective_score" in data # waste_percentage используется как objective_score
# Проверяем, что запись действительно появилась в тестовой БД
calc_id = data["id"]
db_calc = db_session.query(Calculation).filter(Calculation.id == calc_id).first()
assert db_calc is not None
assert db_calc.input_params == input_data["input_params"]
assert db_calc.model_name == input_data["model_name"]
assert db_calc.output_results is not None
def test_read_calculation(client: TestClient, db_session: Session):
"""Тест получения расчета по ID."""
# Сначала создаем расчет для теста
input_data = {"input_params": {"size": "large"}, "model_name": "reader_test"}
response_create = client.post("/calculation/", json=input_data)
assert response_create.status_code == 201
created_data = response_create.json()
calc_id = created_data["id"]
# Теперь запрашиваем созданный расчет
response_read = client.get(f"/calculation/{calc_id}")
assert response_read.status_code == 200
read_data = response_read.json()
assert read_data["id"] == calc_id
assert read_data["input_params"] == input_data["input_params"]
assert read_data["model_name"] == input_data["model_name"]
assert read_data["output_results"] == created_data["output_results"] # Сравниваем с тем, что вернул POST
assert read_data["timestamp"] is not None
assert read_data["objective_score"] is not None
def test_read_calculation_not_found(client: TestClient):
"""Тест получения несуществующего расчета."""
response = client.get("/calculation/99999") # Используем ID, которого точно нет
assert response.status_code == 404
assert response.json() == {"detail": "Calculation not found"}
def test_read_calculation_history(client: TestClient, db_session: Session):
"""Тест получения истории расчетов."""
# Очистим таблицу на всякий случай (хотя фикстура должна это делать)
# db_session.query(Calculation).delete()
# db_session.commit()
# Создаем несколько расчетов
client.post("/calculation/", json={"input_params": {"test": 1}})
client.post("/calculation/", json={"input_params": {"test": 2}})
# Запрашиваем историю
response = client.get("/calculation/history/")
assert response.status_code == 200
history_data = response.json()
assert isinstance(history_data, list)
assert len(history_data) >= 2 # Проверяем, что созданные расчеты есть в истории
# Проверяем структуру элементов истории
if len(history_data) > 0:
item = history_data[0]
assert "id" in item
assert "input_params" in item
assert "output_results" in item
assert "timestamp" in item
assert "model_name" in item
assert "objective_score" in item
def test_create_calculation_invalid_input(client: TestClient):
"""Тест создания расчета с невалидными данными (проверка Pydantic)."""
# Отправляем данные без обязательного поля input_params
response = client.post("/calculation/", json={"model_name": "invalid"})
assert response.status_code == 422 # Ошибка валидации Pydantic
# Можно проверить тело ошибки, если нужно