All checks were successful
continuous-integration/drone/push Build is passing
347 lines
13 KiB
Python
Executable File
347 lines
13 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""
|
||
Скрипт для тестирования API сервиса питания (Nutrition Service)
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import json
|
||
import requests
|
||
from datetime import datetime
|
||
from dotenv import load_dotenv
|
||
|
||
# Загружаем .env файл
|
||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||
env_path = os.path.join(current_dir, ".env")
|
||
load_dotenv(env_path)
|
||
print(f"✅ Загружен .env из: {env_path}")
|
||
|
||
# Базовый URL API
|
||
BASE_URL = os.environ.get("NUTRITION_API_URL", "http://localhost:8006/api/v1/nutrition")
|
||
AUTH_URL = os.environ.get("AUTH_API_URL", "http://localhost:8001/api/v1/auth")
|
||
|
||
# Настройки для тестовых данных
|
||
TEST_USER = {
|
||
"username": "test_nutrition_user",
|
||
"password": "Test123!",
|
||
"email": "test_nutrition@example.com",
|
||
"first_name": "Test",
|
||
"last_name": "Nutrition",
|
||
"phone": "+79991234999"
|
||
}
|
||
|
||
def get_auth_token():
|
||
"""Получение токена авторизации"""
|
||
print("\n🔑 Получаем токен авторизации...")
|
||
|
||
# Пытаемся сначала войти
|
||
try:
|
||
login_data = {
|
||
"username": TEST_USER["username"],
|
||
"password": TEST_USER["password"]
|
||
}
|
||
|
||
login_response = requests.post(
|
||
f"{AUTH_URL}/login",
|
||
json=login_data
|
||
)
|
||
|
||
if login_response.status_code == 200:
|
||
token = login_response.json().get("access_token")
|
||
print("✅ Успешный вход в систему!")
|
||
return token
|
||
except Exception as e:
|
||
print(f"⚠️ Ошибка при попытке входа: {e}")
|
||
|
||
# Если вход не удался, пробуем регистрацию
|
||
try:
|
||
register_response = requests.post(
|
||
f"{AUTH_URL}/register",
|
||
json=TEST_USER
|
||
)
|
||
|
||
if register_response.status_code == 201:
|
||
print("✅ Пользователь успешно зарегистрирован!")
|
||
|
||
# Теперь входим с новыми учетными данными
|
||
login_data = {
|
||
"username": TEST_USER["username"],
|
||
"password": TEST_USER["password"]
|
||
}
|
||
|
||
login_response = requests.post(
|
||
f"{AUTH_URL}/login",
|
||
json=login_data
|
||
)
|
||
|
||
if login_response.status_code == 200:
|
||
token = login_response.json().get("access_token")
|
||
print("✅ Успешный вход в систему!")
|
||
return token
|
||
except Exception as e:
|
||
print(f"❌ Ошибка при регистрации: {e}")
|
||
|
||
print("❌ Не удалось получить токен авторизации")
|
||
return None
|
||
|
||
def search_food(token, query="apple", max_results=5):
|
||
"""Поиск продуктов питания"""
|
||
print(f"\n🔍 Поиск продуктов по запросу '{query}'...")
|
||
|
||
headers = {"Authorization": f"Bearer {token}"}
|
||
data = {
|
||
"query": query,
|
||
"max_results": max_results
|
||
}
|
||
|
||
try:
|
||
response = requests.post(
|
||
f"{BASE_URL}/search",
|
||
json=data,
|
||
headers=headers
|
||
)
|
||
|
||
print(f"📥 Код ответа: {response.status_code}")
|
||
|
||
if response.status_code == 200:
|
||
results = response.json()
|
||
print(f"✅ Найдено продуктов: {len(results)}")
|
||
|
||
# Выводим первые 3 результата
|
||
for i, food in enumerate(results[:3]):
|
||
print(f" {i+1}. [{food.get('id')}] {food.get('name')}")
|
||
print(f" {food.get('description')}")
|
||
print(f" Калории: {food.get('calories')} ккал/100г")
|
||
|
||
return results
|
||
else:
|
||
print(f"❌ Ошибка при поиске: {response.status_code}")
|
||
print(response.text)
|
||
return None
|
||
except Exception as e:
|
||
print(f"❌ Исключение при поиске: {e}")
|
||
return None
|
||
|
||
def add_diary_entry(token, food_id=1):
|
||
"""Добавление записи в дневник питания"""
|
||
print(f"\n📝 Добавление записи в дневник питания (продукт ID: {food_id})...")
|
||
|
||
headers = {"Authorization": f"Bearer {token}"}
|
||
today = datetime.now().strftime("%Y-%m-%d")
|
||
|
||
data = {
|
||
"food_item_id": food_id,
|
||
"entry_date": today,
|
||
"meal_type": "breakfast",
|
||
"quantity": 1.0,
|
||
"unit": "piece",
|
||
"notes": "Тестовая запись"
|
||
}
|
||
|
||
try:
|
||
response = requests.post(
|
||
f"{BASE_URL}/diary",
|
||
json=data,
|
||
headers=headers
|
||
)
|
||
|
||
print(f"📥 Код ответа: {response.status_code}")
|
||
|
||
if response.status_code in [200, 201]:
|
||
result = response.json()
|
||
print("✅ Запись успешно добавлена в дневник питания!")
|
||
print(f" ID записи: {result.get('id')}")
|
||
print(f" Калории: {result.get('calories')} ккал")
|
||
return result
|
||
else:
|
||
print(f"❌ Ошибка при добавлении записи: {response.status_code}")
|
||
print(response.text)
|
||
return None
|
||
except Exception as e:
|
||
print(f"❌ Исключение при добавлении записи: {e}")
|
||
return None
|
||
|
||
def get_diary_entries(token):
|
||
"""Получение записей дневника за текущий день"""
|
||
print("\n📋 Получение записей дневника питания...")
|
||
|
||
headers = {"Authorization": f"Bearer {token}"}
|
||
today = datetime.now().strftime("%Y-%m-%d")
|
||
|
||
try:
|
||
response = requests.get(
|
||
f"{BASE_URL}/diary?date={today}",
|
||
headers=headers
|
||
)
|
||
|
||
print(f"📥 Код ответа: {response.status_code}")
|
||
|
||
if response.status_code == 200:
|
||
results = response.json()
|
||
print(f"✅ Получено записей: {len(results)}")
|
||
|
||
# Выводим записи
|
||
for i, entry in enumerate(results):
|
||
print(f" {i+1}. Прием пищи: {entry.get('meal_type')}")
|
||
print(f" Продукт ID: {entry.get('food_item_id')}")
|
||
print(f" Калории: {entry.get('calories')} ккал")
|
||
|
||
return results
|
||
else:
|
||
print(f"❌ Ошибка при получении записей: {response.status_code}")
|
||
print(response.text)
|
||
return None
|
||
except Exception as e:
|
||
print(f"❌ Исключение при получении записей: {e}")
|
||
return None
|
||
|
||
def add_water_entry(token, amount_ml=250):
|
||
"""Добавление записи о потреблении воды"""
|
||
print(f"\n💧 Добавление записи о потреблении воды ({amount_ml} мл)...")
|
||
|
||
headers = {"Authorization": f"Bearer {token}"}
|
||
today = datetime.now().strftime("%Y-%m-%d")
|
||
|
||
data = {
|
||
"amount_ml": amount_ml,
|
||
"entry_date": today,
|
||
"notes": "Тестовая запись"
|
||
}
|
||
|
||
try:
|
||
response = requests.post(
|
||
f"{BASE_URL}/water",
|
||
json=data,
|
||
headers=headers
|
||
)
|
||
|
||
print(f"📥 Код ответа: {response.status_code}")
|
||
|
||
if response.status_code in [200, 201]:
|
||
result = response.json()
|
||
print("✅ Запись о потреблении воды успешно добавлена!")
|
||
print(f" ID записи: {result.get('id')}")
|
||
print(f" Объем: {result.get('amount_ml')} мл")
|
||
return result
|
||
else:
|
||
print(f"❌ Ошибка при добавлении записи о воде: {response.status_code}")
|
||
print(response.text)
|
||
return None
|
||
except Exception as e:
|
||
print(f"❌ Исключение при добавлении записи о воде: {e}")
|
||
return None
|
||
|
||
def add_activity_entry(token):
|
||
"""Добавление записи о физической активности"""
|
||
print("\n🏃♀️ Добавление записи о физической активности...")
|
||
|
||
headers = {"Authorization": f"Bearer {token}"}
|
||
today = datetime.now().strftime("%Y-%m-%d")
|
||
|
||
data = {
|
||
"entry_date": today,
|
||
"activity_type": "walking",
|
||
"duration_minutes": 30,
|
||
"distance_km": 2.5,
|
||
"intensity": "medium",
|
||
"notes": "Тестовая активность"
|
||
}
|
||
|
||
try:
|
||
response = requests.post(
|
||
f"{BASE_URL}/activity",
|
||
json=data,
|
||
headers=headers
|
||
)
|
||
|
||
print(f"📥 Код ответа: {response.status_code}")
|
||
|
||
if response.status_code in [200, 201]:
|
||
result = response.json()
|
||
print("✅ Запись о физической активности успешно добавлена!")
|
||
print(f" ID записи: {result.get('id')}")
|
||
print(f" Тип: {result.get('activity_type')}")
|
||
print(f" Продолжительность: {result.get('duration_minutes')} мин")
|
||
print(f" Потрачено калорий: {result.get('calories_burned')} ккал")
|
||
return result
|
||
else:
|
||
print(f"❌ Ошибка при добавлении записи об активности: {response.status_code}")
|
||
print(response.text)
|
||
return None
|
||
except Exception as e:
|
||
print(f"❌ Исключение при добавлении записи об активности: {e}")
|
||
return None
|
||
|
||
def get_daily_summary(token):
|
||
"""Получение дневной сводки"""
|
||
print("\n📊 Получение сводки за день...")
|
||
|
||
headers = {"Authorization": f"Bearer {token}"}
|
||
today = datetime.now().strftime("%Y-%m-%d")
|
||
|
||
try:
|
||
response = requests.get(
|
||
f"{BASE_URL}/summary?date={today}",
|
||
headers=headers
|
||
)
|
||
|
||
print(f"📥 Код ответа: {response.status_code}")
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
print("✅ Сводка за день успешно получена!")
|
||
print(f" Всего калорий: {result.get('total_calories')} ккал")
|
||
print(f" Всего белка: {result.get('total_protein')} г")
|
||
print(f" Всего жиров: {result.get('total_fat')} г")
|
||
print(f" Всего углеводов: {result.get('total_carbs')} г")
|
||
print(f" Потреблено воды: {result.get('water_consumed_ml')} мл")
|
||
print(f" Активность: {result.get('activity_minutes')} мин")
|
||
print(f" Сожжено калорий: {result.get('calories_burned')} ккал")
|
||
return result
|
||
else:
|
||
print(f"❌ Ошибка при получении сводки: {response.status_code}")
|
||
print(response.text)
|
||
return None
|
||
except Exception as e:
|
||
print(f"❌ Исключение при получении сводки: {e}")
|
||
return None
|
||
|
||
def main():
|
||
"""Основная функция для тестирования API сервиса питания"""
|
||
print("\n🚀 Запуск тестирования API сервиса питания...\n")
|
||
|
||
# Получаем токен авторизации
|
||
token = get_auth_token()
|
||
if not token:
|
||
print("❌ Невозможно продолжить тестирование без авторизации")
|
||
sys.exit(1)
|
||
|
||
# Выполняем поиск продуктов
|
||
search_results = search_food(token, "apple")
|
||
|
||
if search_results and len(search_results) > 0:
|
||
# Используем первый найденный продукт для дальнейшего тестирования
|
||
food_id = search_results[0].get("id")
|
||
|
||
# Добавляем запись в дневник питания
|
||
add_diary_entry(token, food_id)
|
||
|
||
# Получаем записи дневника
|
||
get_diary_entries(token)
|
||
else:
|
||
# Если поиск не дал результатов, продолжаем тестирование с предполагаемым ID продукта
|
||
print("⚠️ Используем предполагаемый ID продукта для дальнейших тестов")
|
||
add_diary_entry(token, 1)
|
||
|
||
# Добавляем записи о воде и активности
|
||
add_water_entry(token)
|
||
add_activity_entry(token)
|
||
|
||
# Получаем дневную сводку
|
||
get_daily_summary(token)
|
||
|
||
print("\n✅ Тестирование API сервиса питания завершено!")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main() |