test_main.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import pytest
  2. from sqlalchemy import create_engine, text
  3. from sqlalchemy.orm import sessionmaker
  4. from fastapi.testclient import TestClient
  5. import models, schemas
  6. from main import app, get_db
  7. from database import engine, Base
  8. # Используем основную базу данных для тестов
  9. TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  10. def override_get_db():
  11. db = TestingSessionLocal()
  12. try:
  13. yield db
  14. finally:
  15. db.close()
  16. app.dependency_overrides[get_db] = override_get_db
  17. client = TestClient(app)
  18. @pytest.fixture(scope="session", autouse=True)
  19. def setup_database():
  20. # Удаляем и создаем таблицы заново для учета изменений схемы
  21. Base.metadata.drop_all(bind=engine)
  22. Base.metadata.create_all(bind=engine)
  23. yield
  24. @pytest.fixture(scope="function", autouse=True)
  25. def clean_database():
  26. """Очистка записей в базе данных перед каждым тестом."""
  27. db = TestingSessionLocal()
  28. try:
  29. # Удаляем все записи из таблиц
  30. db.execute(text("DELETE FROM posts"))
  31. db.execute(text("DELETE FROM users"))
  32. db.commit()
  33. finally:
  34. db.close()
  35. yield
  36. # 1.5.1 Тесты до начала основного сценария (проверка доступности базы данных)
  37. def test_database_connection():
  38. """Проверяет доступность базы данных."""
  39. db = TestingSessionLocal()
  40. try:
  41. # Простой запрос для проверки соединения
  42. result = db.execute(text("SELECT 1"))
  43. assert result.fetchone()[0] == 1
  44. finally:
  45. db.close()
  46. # 1.5.2 Основные тесты для CRUD операций
  47. # Пользователи
  48. def test_create_user():
  49. """Проверяет добавление новой записи в таблицу пользователей."""
  50. user_data = {"name": "Test User", "email": "test@example.com", "password": "password123"}
  51. response = client.post("/users/", json=user_data)
  52. assert response.status_code == 200
  53. data = response.json()
  54. assert data["name"] == user_data["name"]
  55. assert data["email"] == user_data["email"]
  56. assert "id" in data
  57. def test_get_users():
  58. """Проверяет просмотр всех записей пользователей."""
  59. response = client.get("/users/")
  60. assert response.status_code == 200
  61. data = response.json()
  62. assert isinstance(data, list)
  63. def test_get_user():
  64. """Проверяет просмотр конкретного пользователя."""
  65. # Сначала создадим пользователя
  66. user_data = {"name": "Another User", "email": "another@example.com", "password": "pass456"}
  67. create_response = client.post("/users/", json=user_data)
  68. user_id = create_response.json()["id"]
  69. response = client.get(f"/users/{user_id}")
  70. assert response.status_code == 200
  71. data = response.json()
  72. assert data["id"] == user_id
  73. assert data["name"] == user_data["name"]
  74. def test_update_user():
  75. """Проверяет редактирование данных пользователя."""
  76. # Создаем пользователя
  77. user_data = {"name": "Update User", "email": "update@example.com", "password": "oldpass"}
  78. create_response = client.post("/users/", json=user_data)
  79. user_id = create_response.json()["id"]
  80. # Обновляем
  81. update_data = {"name": "Updated User", "email": "updated@example.com", "password": "newpass"}
  82. response = client.put(f"/users/{user_id}", json=update_data)
  83. assert response.status_code == 200
  84. data = response.json()
  85. assert data["name"] == update_data["name"]
  86. assert data["email"] == update_data["email"]
  87. def test_delete_user():
  88. """Проверяет удаление записи пользователя."""
  89. # Создаем пользователя
  90. user_data = {"name": "Delete User", "email": "delete@example.com", "password": "delpass"}
  91. create_response = client.post("/users/", json=user_data)
  92. user_id = create_response.json()["id"]
  93. # Удаляем
  94. response = client.delete(f"/users/{user_id}")
  95. assert response.status_code == 200
  96. # Проверяем, что больше не существует
  97. response = client.get(f"/users/{user_id}")
  98. assert response.status_code == 404
  99. # Посты
  100. def test_create_post():
  101. """Проверяет добавление новой записи в таблицу постов."""
  102. user_data = {"name": "Post User", "email": "post@example.com", "password": "postpass"}
  103. user_response = client.post("/users/", json=user_data)
  104. user_id = user_response.json()["id"]
  105. post_data = {"title": "Test Post", "content": "Test content", "user_id": user_id}
  106. response = client.post("/posts/", json=post_data)
  107. assert response.status_code == 200
  108. data = response.json()
  109. assert data["title"] == post_data["title"]
  110. assert data["content"] == post_data["content"]
  111. assert data["user_id"] == user_id
  112. def test_get_posts():
  113. """Проверяет просмотр всех записей постов."""
  114. response = client.get("/posts/")
  115. assert response.status_code == 200
  116. data = response.json()
  117. assert isinstance(data, list)
  118. def test_get_post():
  119. """Проверяет просмотр конкретного поста."""
  120. user_data = {"name": "Post User 2", "email": "post2@example.com", "password": "post2pass"}
  121. user_response = client.post("/users/", json=user_data)
  122. user_id = user_response.json()["id"]
  123. post_data = {"title": "Another Post", "content": "Another content", "user_id": user_id}
  124. create_response = client.post("/posts/", json=post_data)
  125. post_id = create_response.json()["id"]
  126. response = client.get(f"/posts/{post_id}")
  127. assert response.status_code == 200
  128. data = response.json()
  129. assert data["id"] == post_id
  130. assert data["title"] == post_data["title"]
  131. def test_update_post():
  132. """Проверяет редактирование данных поста."""
  133. user_data = {"name": "Update Post User", "email": "updatepost@example.com", "password": "updatepostpass"}
  134. user_response = client.post("/users/", json=user_data)
  135. user_id = user_response.json()["id"]
  136. post_data = {"title": "Update Post", "content": "Update content", "user_id": user_id}
  137. create_response = client.post("/posts/", json=post_data)
  138. post_id = create_response.json()["id"]
  139. # Обновляем
  140. update_data = {"title": "Updated Post", "content": "Updated content", "user_id": user_id}
  141. response = client.put(f"/posts/{post_id}", json=update_data)
  142. assert response.status_code == 200
  143. data = response.json()
  144. assert data["title"] == update_data["title"]
  145. assert data["content"] == update_data["content"]