|
@@ -0,0 +1,172 @@
|
|
|
|
|
+import pytest
|
|
|
|
|
+from sqlalchemy import create_engine, text
|
|
|
|
|
+from sqlalchemy.orm import sessionmaker
|
|
|
|
|
+from fastapi.testclient import TestClient
|
|
|
|
|
+
|
|
|
|
|
+import models, schemas
|
|
|
|
|
+from main import app, get_db
|
|
|
|
|
+from database import engine, Base
|
|
|
|
|
+
|
|
|
|
|
+# Используем основную базу данных для тестов
|
|
|
|
|
+TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
|
|
|
+
|
|
|
|
|
+def override_get_db():
|
|
|
|
|
+ db = TestingSessionLocal()
|
|
|
|
|
+ try:
|
|
|
|
|
+ yield db
|
|
|
|
|
+ finally:
|
|
|
|
|
+ db.close()
|
|
|
|
|
+
|
|
|
|
|
+app.dependency_overrides[get_db] = override_get_db
|
|
|
|
|
+
|
|
|
|
|
+client = TestClient(app)
|
|
|
|
|
+
|
|
|
|
|
+@pytest.fixture(scope="session", autouse=True)
|
|
|
|
|
+def setup_database():
|
|
|
|
|
+ # Удаляем и создаем таблицы заново для учета изменений схемы
|
|
|
|
|
+ Base.metadata.drop_all(bind=engine)
|
|
|
|
|
+ Base.metadata.create_all(bind=engine)
|
|
|
|
|
+ yield
|
|
|
|
|
+
|
|
|
|
|
+@pytest.fixture(scope="function", autouse=True)
|
|
|
|
|
+def clean_database():
|
|
|
|
|
+ """Очистка записей в базе данных перед каждым тестом."""
|
|
|
|
|
+ db = TestingSessionLocal()
|
|
|
|
|
+ try:
|
|
|
|
|
+ # Удаляем все записи из таблиц
|
|
|
|
|
+ db.execute(text("DELETE FROM posts"))
|
|
|
|
|
+ db.execute(text("DELETE FROM users"))
|
|
|
|
|
+ db.commit()
|
|
|
|
|
+ finally:
|
|
|
|
|
+ db.close()
|
|
|
|
|
+ yield
|
|
|
|
|
+
|
|
|
|
|
+# 1.5.1 Тесты до начала основного сценария (проверка доступности базы данных)
|
|
|
|
|
+def test_database_connection():
|
|
|
|
|
+ """Проверяет доступность базы данных."""
|
|
|
|
|
+ db = TestingSessionLocal()
|
|
|
|
|
+ try:
|
|
|
|
|
+ # Простой запрос для проверки соединения
|
|
|
|
|
+ result = db.execute(text("SELECT 1"))
|
|
|
|
|
+ assert result.fetchone()[0] == 1
|
|
|
|
|
+ finally:
|
|
|
|
|
+ db.close()
|
|
|
|
|
+
|
|
|
|
|
+# 1.5.2 Основные тесты для CRUD операций
|
|
|
|
|
+
|
|
|
|
|
+# Пользователи
|
|
|
|
|
+def test_create_user():
|
|
|
|
|
+ """Проверяет добавление новой записи в таблицу пользователей."""
|
|
|
|
|
+ user_data = {"name": "Test User", "email": "test@example.com", "password": "password123"}
|
|
|
|
|
+ response = client.post("/users/", json=user_data)
|
|
|
|
|
+ assert response.status_code == 200
|
|
|
|
|
+ data = response.json()
|
|
|
|
|
+ assert data["name"] == user_data["name"]
|
|
|
|
|
+ assert data["email"] == user_data["email"]
|
|
|
|
|
+ assert "id" in data
|
|
|
|
|
+
|
|
|
|
|
+def test_get_users():
|
|
|
|
|
+ """Проверяет просмотр всех записей пользователей."""
|
|
|
|
|
+ response = client.get("/users/")
|
|
|
|
|
+ assert response.status_code == 200
|
|
|
|
|
+ data = response.json()
|
|
|
|
|
+ assert isinstance(data, list)
|
|
|
|
|
+
|
|
|
|
|
+def test_get_user():
|
|
|
|
|
+ """Проверяет просмотр конкретного пользователя."""
|
|
|
|
|
+ # Сначала создадим пользователя
|
|
|
|
|
+ user_data = {"name": "Another User", "email": "another@example.com", "password": "pass456"}
|
|
|
|
|
+ create_response = client.post("/users/", json=user_data)
|
|
|
|
|
+ user_id = create_response.json()["id"]
|
|
|
|
|
+
|
|
|
|
|
+ response = client.get(f"/users/{user_id}")
|
|
|
|
|
+ assert response.status_code == 200
|
|
|
|
|
+ data = response.json()
|
|
|
|
|
+ assert data["id"] == user_id
|
|
|
|
|
+ assert data["name"] == user_data["name"]
|
|
|
|
|
+
|
|
|
|
|
+def test_update_user():
|
|
|
|
|
+ """Проверяет редактирование данных пользователя."""
|
|
|
|
|
+ # Создаем пользователя
|
|
|
|
|
+ user_data = {"name": "Update User", "email": "update@example.com", "password": "oldpass"}
|
|
|
|
|
+ create_response = client.post("/users/", json=user_data)
|
|
|
|
|
+ user_id = create_response.json()["id"]
|
|
|
|
|
+
|
|
|
|
|
+ # Обновляем
|
|
|
|
|
+ update_data = {"name": "Updated User", "email": "updated@example.com", "password": "newpass"}
|
|
|
|
|
+ response = client.put(f"/users/{user_id}", json=update_data)
|
|
|
|
|
+ assert response.status_code == 200
|
|
|
|
|
+ data = response.json()
|
|
|
|
|
+ assert data["name"] == update_data["name"]
|
|
|
|
|
+ assert data["email"] == update_data["email"]
|
|
|
|
|
+
|
|
|
|
|
+def test_delete_user():
|
|
|
|
|
+ """Проверяет удаление записи пользователя."""
|
|
|
|
|
+ # Создаем пользователя
|
|
|
|
|
+ user_data = {"name": "Delete User", "email": "delete@example.com", "password": "delpass"}
|
|
|
|
|
+ create_response = client.post("/users/", json=user_data)
|
|
|
|
|
+ user_id = create_response.json()["id"]
|
|
|
|
|
+
|
|
|
|
|
+ # Удаляем
|
|
|
|
|
+ response = client.delete(f"/users/{user_id}")
|
|
|
|
|
+ assert response.status_code == 200
|
|
|
|
|
+
|
|
|
|
|
+ # Проверяем, что больше не существует
|
|
|
|
|
+ response = client.get(f"/users/{user_id}")
|
|
|
|
|
+ assert response.status_code == 404
|
|
|
|
|
+
|
|
|
|
|
+# Посты
|
|
|
|
|
+def test_create_post():
|
|
|
|
|
+ """Проверяет добавление новой записи в таблицу постов."""
|
|
|
|
|
+ user_data = {"name": "Post User", "email": "post@example.com", "password": "postpass"}
|
|
|
|
|
+ user_response = client.post("/users/", json=user_data)
|
|
|
|
|
+ user_id = user_response.json()["id"]
|
|
|
|
|
+
|
|
|
|
|
+ post_data = {"title": "Test Post", "content": "Test content", "user_id": user_id}
|
|
|
|
|
+ response = client.post("/posts/", json=post_data)
|
|
|
|
|
+ assert response.status_code == 200
|
|
|
|
|
+ data = response.json()
|
|
|
|
|
+ assert data["title"] == post_data["title"]
|
|
|
|
|
+ assert data["content"] == post_data["content"]
|
|
|
|
|
+ assert data["user_id"] == user_id
|
|
|
|
|
+
|
|
|
|
|
+def test_get_posts():
|
|
|
|
|
+ """Проверяет просмотр всех записей постов."""
|
|
|
|
|
+ response = client.get("/posts/")
|
|
|
|
|
+ assert response.status_code == 200
|
|
|
|
|
+ data = response.json()
|
|
|
|
|
+ assert isinstance(data, list)
|
|
|
|
|
+
|
|
|
|
|
+def test_get_post():
|
|
|
|
|
+ """Проверяет просмотр конкретного поста."""
|
|
|
|
|
+ user_data = {"name": "Post User 2", "email": "post2@example.com", "password": "post2pass"}
|
|
|
|
|
+ user_response = client.post("/users/", json=user_data)
|
|
|
|
|
+ user_id = user_response.json()["id"]
|
|
|
|
|
+
|
|
|
|
|
+ post_data = {"title": "Another Post", "content": "Another content", "user_id": user_id}
|
|
|
|
|
+ create_response = client.post("/posts/", json=post_data)
|
|
|
|
|
+ post_id = create_response.json()["id"]
|
|
|
|
|
+
|
|
|
|
|
+ response = client.get(f"/posts/{post_id}")
|
|
|
|
|
+ assert response.status_code == 200
|
|
|
|
|
+ data = response.json()
|
|
|
|
|
+ assert data["id"] == post_id
|
|
|
|
|
+ assert data["title"] == post_data["title"]
|
|
|
|
|
+
|
|
|
|
|
+def test_update_post():
|
|
|
|
|
+ """Проверяет редактирование данных поста."""
|
|
|
|
|
+ user_data = {"name": "Update Post User", "email": "updatepost@example.com", "password": "updatepostpass"}
|
|
|
|
|
+ user_response = client.post("/users/", json=user_data)
|
|
|
|
|
+ user_id = user_response.json()["id"]
|
|
|
|
|
+
|
|
|
|
|
+ post_data = {"title": "Update Post", "content": "Update content", "user_id": user_id}
|
|
|
|
|
+ create_response = client.post("/posts/", json=post_data)
|
|
|
|
|
+ post_id = create_response.json()["id"]
|
|
|
|
|
+
|
|
|
|
|
+ # Обновляем
|
|
|
|
|
+ update_data = {"title": "Updated Post", "content": "Updated content", "user_id": user_id}
|
|
|
|
|
+ response = client.put(f"/posts/{post_id}", json=update_data)
|
|
|
|
|
+ assert response.status_code == 200
|
|
|
|
|
+ data = response.json()
|
|
|
|
|
+ assert data["title"] == update_data["title"]
|
|
|
|
|
+ assert data["content"] == update_data["content"]
|