2d-game-backend / test_api.py
Student Hub
Initial backend for Hugging Face Spaces
2f4298a
import requests
import json
from time import sleep
BASE_URL = "http://localhost:8000"
def print_response(title, response):
"""Красивый вывод ответа"""
print(f"\n{'='*60}")
print(f"🔹 {title}")
print(f"{'='*60}")
print(f"Status: {response.status_code}")
try:
print(json.dumps(response.json(), indent=2, ensure_ascii=False))
except:
print(response.text)
def test_api():
"""Тестирование всех эндпоинтов API"""
# 1. Проверка корневого эндпоинта
print("\n🚀 НАЧАЛО ТЕСТИРОВАНИЯ API")
response = requests.get(f"{BASE_URL}/")
print_response("GET / - Корневой эндпоинт", response)
# 2. Health check
response = requests.get(f"{BASE_URL}/health")
print_response("GET /health - Проверка здоровья", response)
# 3. Регистрация нового пользователя
user_data = {
"username": "testuser",
"email": "test@example.com",
"password": "password123"
}
response = requests.post(f"{BASE_URL}/api/auth/register", json=user_data)
print_response("POST /api/auth/register - Регистрация", response)
# 4. Вход пользователя
login_data = {
"username": "testuser",
"password": "password123"
}
response = requests.post(
f"{BASE_URL}/api/auth/login",
data=login_data,
headers={"Content-Type": "application/x-www-form-urlencoded"}
)
print_response("POST /api/auth/login - Вход пользователя", response)
if response.status_code == 200:
user_token = response.json()["access_token"]
print(f"✅ Получен токен пользователя")
else:
print("❌ Не удалось получить токен")
return
# 5. Информация о текущем пользователе
headers = {"Authorization": f"Bearer {user_token}"}
response = requests.get(f"{BASE_URL}/api/auth/me", headers=headers)
print_response("GET /api/auth/me - Текущий пользователь", response)
# 6. Получение статистики игрока
response = requests.get(f"{BASE_URL}/api/game/stats", headers=headers)
print_response("GET /api/game/stats - Статистика игрока", response)
# 7. Начало игровой сессии
response = requests.post(f"{BASE_URL}/api/game/session/start", headers=headers)
print_response("POST /api/game/session/start - Начало сессии", response)
# 8. Расход энергии
response = requests.post(f"{BASE_URL}/api/game/stats/consume-energy?amount=10", headers=headers)
print_response("POST /api/game/stats/consume-energy - Расход энергии", response)
# 9. Восстановление энергии
response = requests.post(f"{BASE_URL}/api/game/stats/restore-energy?amount=5", headers=headers)
print_response("POST /api/game/stats/restore-energy - Восстановление энергии", response)
# 10. Расход сытости
response = requests.post(f"{BASE_URL}/api/game/stats/consume-hunger?amount=15", headers=headers)
print_response("POST /api/game/stats/consume-hunger - Расход сытости", response)
# 11. Восстановление сытости (еда)
response = requests.post(f"{BASE_URL}/api/game/stats/restore-hunger?amount=20", headers=headers)
print_response("POST /api/game/stats/restore-hunger - Еда", response)
# 12. Обновление статистики
stats_update = {
"experience": 50,
"coins": 100,
"rooms_visited": 5,
"items_collected": 10,
"enemies_defeated": 3
}
response = requests.patch(f"{BASE_URL}/api/game/stats", json=stats_update, headers=headers)
print_response("PATCH /api/game/stats - Обновление статистики", response)
# 13. Логирование действия
response = requests.post(
f"{BASE_URL}/api/game/action/move?action_data=room_1_to_room_2",
headers=headers
)
print_response("POST /api/game/action/move - Логирование действия", response)
# Подождем 2 секунды для сессии
print("\n⏳ Ждем 2 секунды для статистики сессии...")
sleep(2)
# 14. Завершение сессии
response = requests.post(f"{BASE_URL}/api/game/session/end", headers=headers)
print_response("POST /api/game/session/end - Завершение сессии", response)
# 15. История сессий
response = requests.get(f"{BASE_URL}/api/game/sessions?limit=5", headers=headers)
print_response("GET /api/game/sessions - История сессий", response)
# ТЕСТИРОВАНИЕ АДМИНКИ
print("\n" + "="*60)
print("👨‍💼 ТЕСТИРОВАНИЕ АДМИН-ПАНЕЛИ")
print("="*60)
# 16. Вход администратора
admin_login = {
"username": "admin",
"password": "admin123"
}
response = requests.post(
f"{BASE_URL}/api/auth/login",
data=admin_login,
headers={"Content-Type": "application/x-www-form-urlencoded"}
)
print_response("POST /api/auth/login - Вход администратора", response)
if response.status_code == 200:
admin_token = response.json()["access_token"]
print(f"✅ Получен токен администратора")
else:
print("❌ Не удалось получить токен администратора")
return
admin_headers = {"Authorization": f"Bearer {admin_token}"}
# 17. Общая статистика
response = requests.get(f"{BASE_URL}/api/admin/stats/overview", headers=admin_headers)
print_response("GET /api/admin/stats/overview - Общая статистика", response)
# 18. Список пользователей
response = requests.get(f"{BASE_URL}/api/admin/users", headers=admin_headers)
print_response("GET /api/admin/users - Список пользователей", response)
# 19. Топ игроков
response = requests.get(f"{BASE_URL}/api/admin/stats/top-players?metric=level&limit=5", headers=admin_headers)
print_response("GET /api/admin/stats/top-players - Топ по уровню", response)
# 20. График сессий
response = requests.get(f"{BASE_URL}/api/admin/stats/sessions-timeline?days=7", headers=admin_headers)
print_response("GET /api/admin/stats/sessions-timeline - График сессий", response)
# 21. Тепловая карта активности
response = requests.get(f"{BASE_URL}/api/admin/stats/activity-heatmap", headers=admin_headers)
print_response("GET /api/admin/stats/activity-heatmap - Тепловая карта", response)
# 22. Удержание пользователей
response = requests.get(f"{BASE_URL}/api/admin/stats/user-retention", headers=admin_headers)
print_response("GET /api/admin/stats/user-retention - Удержание", response)
# 23. Игровые метрики
response = requests.get(f"{BASE_URL}/api/admin/stats/game-metrics", headers=admin_headers)
print_response("GET /api/admin/stats/game-metrics - Игровые метрики", response)
# 24. Последние действия
response = requests.get(f"{BASE_URL}/api/admin/actions/recent?limit=10", headers=admin_headers)
print_response("GET /api/admin/actions/recent - Последние действия", response)
# Итоги
print("\n" + "="*60)
print("✅ ТЕСТИРОВАНИЕ ЗАВЕРШЕНО!")
print("="*60)
print("\n📊 Проверьте документацию API: http://localhost:8000/docs")
print("📊 Альтернативная документация: http://localhost:8000/redoc")
if __name__ == "__main__":
try:
test_api()
except requests.exceptions.ConnectionError:
print("\n❌ Ошибка: Не удалось подключиться к серверу")
print("Убедитесь, что сервер запущен на http://localhost:8000")
except Exception as e:
print(f"\n❌ Ошибка: {e}")