#!/bin/bash # Скрипт для тестирования API сервиса питания через cURL # Настройки API_BASE_URL="http://localhost:8006/api/v1/nutrition" AUTH_URL="http://localhost:8001/api/v1/auth" TODAY=$(date +"%Y-%m-%d") TEST_USERNAME="test_nutrition_user" TEST_PASSWORD="Test123!" # Цветной вывод GREEN='\033[0;32m' RED='\033[0;31m' BLUE='\033[0;34m' YELLOW='\033[0;33m' NC='\033[0m' # No Color echo -e "${BLUE}🚀 Запуск тестов для Nutrition Service API${NC}" echo "---------------------------------------------" # Шаг 1: Авторизация и получение токена echo -e "${BLUE}📝 Шаг 1: Получение токена авторизации${NC}" # Попытка входа login_response=$(curl -s -X POST "${AUTH_URL}/login" \ -H "Content-Type: application/json" \ -d '{ "username": "'"${TEST_USERNAME}"'", "password": "'"${TEST_PASSWORD}"'" }') # Проверяем, успешен ли вход if [[ $login_response == *"access_token"* ]]; then TOKEN=$(echo $login_response | grep -o '"access_token":"[^"]*' | sed 's/"access_token":"//') echo -e "${GREEN}✅ Вход успешен!${NC}" else echo -e "${YELLOW}⚠️ Вход не удался, пробуем регистрацию...${NC}" # Пробуем зарегистрировать пользователя curl -s -X POST "${AUTH_URL}/register" \ -H "Content-Type: application/json" \ -d '{ "email": "'"${TEST_USERNAME}@example.com"'", "username": "'"${TEST_USERNAME}"'", "password": "'"${TEST_PASSWORD}"'", "first_name": "Test", "last_name": "Nutrition", "phone": "+79991234999" }' > /dev/null # После регистрации пробуем войти снова login_response=$(curl -s -X POST "${AUTH_URL}/login" \ -H "Content-Type: application/json" \ -d '{ "username": "'"${TEST_USERNAME}"'", "password": "'"${TEST_PASSWORD}"'" }') if [[ $login_response == *"access_token"* ]]; then TOKEN=$(echo $login_response | grep -o '"access_token":"[^"]*' | sed 's/"access_token":"//') echo -e "${GREEN}✅ Регистрация и вход успешны!${NC}" else echo -e "${RED}❌ Не удалось получить токен авторизации${NC}" echo "Ответ сервера: $login_response" exit 1 fi fi # Шаг 2: Поиск продуктов echo -e "\n${BLUE}📝 Шаг 2: Поиск продуктов${NC}" search_response=$(curl -s -X POST "${API_BASE_URL}/search" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ -d '{ "query": "apple", "max_results": 5 }') echo "Результат поиска:" echo "$search_response" | grep -o '"name":"[^"]*' | head -3 | sed 's/"name":"/- /' echo "..." # Получаем ID первого продукта из результатов поиска FOOD_ID=$(echo $search_response | grep -o '"id":[0-9]*' | head -1 | sed 's/"id"://') if [[ -z "$FOOD_ID" ]]; then echo -e "${YELLOW}⚠️ Не удалось получить ID продукта, используем значение по умолчанию${NC}" FOOD_ID=1 else echo -e "${GREEN}✅ Получен ID продукта: ${FOOD_ID}${NC}" fi # Шаг 3: Добавление записи в дневник питания echo -e "\n${BLUE}📝 Шаг 3: Добавление записи в дневник питания${NC}" diary_response=$(curl -s -X POST "${API_BASE_URL}/diary" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ -d '{ "food_item_id": '"${FOOD_ID}"', "entry_date": "'"${TODAY}"'", "meal_type": "breakfast", "quantity": 1.5, "unit": "piece", "notes": "Тестовая запись" }') if [[ $diary_response == *"id"* ]]; then echo -e "${GREEN}✅ Запись добавлена в дневник питания${NC}" echo "Детали записи:" echo "$diary_response" | grep -o '"calories":[0-9.]*' | sed 's/"calories":/Калории: /' else echo -e "${RED}❌ Ошибка при добавлении записи в дневник${NC}" echo "Ответ сервера: $diary_response" fi # Шаг 4: Получение записей дневника echo -e "\n${BLUE}📝 Шаг 4: Получение записей дневника${NC}" get_diary_response=$(curl -s -X GET "${API_BASE_URL}/diary?date=${TODAY}" \ -H "Authorization: Bearer ${TOKEN}") if [[ $get_diary_response == *"meal_type"* ]]; then echo -e "${GREEN}✅ Записи дневника успешно получены${NC}" echo "Количество записей: $(echo $get_diary_response | grep -o '"meal_type"' | wc -l)" else echo -e "${YELLOW}⚠️ Нет записей в дневнике или ошибка получения${NC}" echo "Ответ сервера: $get_diary_response" fi # Шаг 5: Добавление записи о потреблении воды echo -e "\n${BLUE}📝 Шаг 5: Добавление записи о потреблении воды${NC}" water_response=$(curl -s -X POST "${API_BASE_URL}/water" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ -d '{ "amount_ml": 250, "entry_date": "'"${TODAY}"'", "notes": "Утренний стакан воды" }') if [[ $water_response == *"id"* ]]; then echo -e "${GREEN}✅ Запись о потреблении воды добавлена${NC}" echo "Детали записи:" echo "$water_response" | grep -o '"amount_ml":[0-9]*' | sed 's/"amount_ml":/Объем (мл): /' else echo -e "${RED}❌ Ошибка при добавлении записи о воде${NC}" echo "Ответ сервера: $water_response" fi # Шаг 6: Добавление записи о физической активности echo -e "\n${BLUE}📝 Шаг 6: Добавление записи о физической активности${NC}" activity_response=$(curl -s -X POST "${API_BASE_URL}/activity" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ -d '{ "entry_date": "'"${TODAY}"'", "activity_type": "running", "duration_minutes": 30, "distance_km": 5.2, "intensity": "medium", "notes": "Утренняя пробежка" }') if [[ $activity_response == *"id"* ]]; then echo -e "${GREEN}✅ Запись о физической активности добавлена${NC}" echo "Детали записи:" echo "$activity_response" | grep -o '"duration_minutes":[0-9]*' | sed 's/"duration_minutes":/Продолжительность (мин): /' echo "$activity_response" | grep -o '"calories_burned":[0-9.]*' | sed 's/"calories_burned":/Сожжено калорий: /' else echo -e "${RED}❌ Ошибка при добавлении записи об активности${NC}" echo "Ответ сервера: $activity_response" fi # Шаг 7: Получение сводки за день echo -e "\n${BLUE}📝 Шаг 7: Получение сводки за день${NC}" summary_response=$(curl -s -X GET "${API_BASE_URL}/summary?date=${TODAY}" \ -H "Authorization: Bearer ${TOKEN}") if [[ $summary_response == *"total_calories"* ]]; then echo -e "${GREEN}✅ Дневная сводка успешно получена${NC}" echo "Детали сводки:" echo "$summary_response" | grep -o '"total_calories":[0-9.]*' | sed 's/"total_calories":/Всего калорий: /' echo "$summary_response" | grep -o '"water_consumed_ml":[0-9]*' | sed 's/"water_consumed_ml":/Потреблено воды (мл): /' echo "$summary_response" | grep -o '"activity_minutes":[0-9]*' | sed 's/"activity_minutes":/Минуты активности: /' else echo -e "${YELLOW}⚠️ Нет данных для сводки или ошибка получения${NC}" echo "Ответ сервера: $summary_response" fi echo -e "\n${GREEN}✅ Тестирование API сервиса питания завершено!${NC}"