Major fixes and new features
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
618
tests/full_api_test.sh
Executable file
618
tests/full_api_test.sh
Executable file
@@ -0,0 +1,618 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Настройка логирования
|
||||
LOG_FILE="/tmp/api_test_output"
|
||||
rm -f "$LOG_FILE" 2>/dev/null
|
||||
exec > >(tee -a "$LOG_FILE") 2>&1
|
||||
|
||||
echo -e "${YELLOW}=======================================${NC}"
|
||||
echo -e "${YELLOW}🔍 Полное тестирование API приложения ${NC}"
|
||||
echo -e "${YELLOW}=======================================${NC}"
|
||||
|
||||
# Функция для логирования тестовых результатов
|
||||
log_test_result() {
|
||||
local status=$1
|
||||
local message=$2
|
||||
if [[ $status == 0 ]]; then
|
||||
echo -e "${GREEN}✓ УСПЕШНО: ${message}${NC}"
|
||||
else
|
||||
echo -e "${RED}✗ ОШИБКА: ${message}${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Функция для проверки ответа API
|
||||
check_api_response() {
|
||||
local response=$1
|
||||
local expected_field=$2
|
||||
|
||||
if echo "$response" | jq -e ".$expected_field" > /dev/null; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 1. Проверка доступности сервисов
|
||||
echo -e "\n${GREEN}1. Проверка доступности сервисов${NC}"
|
||||
|
||||
services=(
|
||||
"http://localhost:8000"
|
||||
"http://localhost:8001"
|
||||
"http://localhost:8002"
|
||||
"http://localhost:8003"
|
||||
"http://localhost:8004"
|
||||
"http://localhost:8005"
|
||||
)
|
||||
|
||||
service_names=(
|
||||
"API Gateway"
|
||||
"User Service"
|
||||
"Emergency Service"
|
||||
"Location Service"
|
||||
"Calendar Service"
|
||||
"Notification Service"
|
||||
)
|
||||
|
||||
for i in "${!services[@]}"; do
|
||||
echo -n "Проверка ${service_names[$i]} (${services[$i]})... "
|
||||
if curl -s "${services[$i]}/health" | grep -q "status.*healthy" || curl -s "${services[$i]}/api/v1/health" | grep -q "status.*healthy"; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
log_test_result 0 "Сервис ${service_names[$i]} доступен"
|
||||
else
|
||||
echo -e "${RED}НЕДОСТУПНО${NC}"
|
||||
log_test_result 1 "Сервис ${service_names[$i]} недоступен"
|
||||
echo "Продолжение тестирования может вызвать ошибки. Хотите продолжить? (y/n)"
|
||||
read -r continue_test
|
||||
if [[ $continue_test != "y" ]]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# 2. Регистрация и авторизация
|
||||
echo -e "\n${GREEN}2. Регистрация и авторизация${NC}"
|
||||
|
||||
echo "Регистрация тестового пользователя..."
|
||||
# Сначала удалим пользователя, если он уже существует
|
||||
echo -e "${YELLOW}Удаление существующего пользователя apitest, если он существует...${NC}"
|
||||
curl -s -X DELETE http://localhost:8001/api/v1/admin/users/by-username/apitest \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Admin-Key: super-secret-admin-key" > /dev/null
|
||||
|
||||
REGISTER_RESPONSE=$(curl -s -X POST http://localhost:8001/api/v1/users/register \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"username": "apitest",
|
||||
"email": "apitest@example.com",
|
||||
"password": "ApiTest123!",
|
||||
"full_name": "API Test User",
|
||||
"phone_number": "+79997776655"
|
||||
}')
|
||||
|
||||
echo "$REGISTER_RESPONSE" | jq
|
||||
|
||||
if check_api_response "$REGISTER_RESPONSE" "id"; then
|
||||
log_test_result 0 "Регистрация пользователя"
|
||||
else
|
||||
log_test_result 1 "Регистрация пользователя"
|
||||
fi
|
||||
|
||||
# Тест на ошибку при повторной регистрации с тем же именем пользователя
|
||||
echo -e "\n${YELLOW}Проверка дублирующейся регистрации...${NC}"
|
||||
DUPLICATE_RESPONSE=$(curl -s -X POST http://localhost:8001/api/v1/users/register \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"username": "apitest",
|
||||
"email": "another@example.com",
|
||||
"password": "ApiTest123!",
|
||||
"full_name": "Duplicate User",
|
||||
"phone_number": "+79997776655"
|
||||
}')
|
||||
|
||||
echo "$DUPLICATE_RESPONSE" | jq
|
||||
|
||||
if echo "$DUPLICATE_RESPONSE" | grep -q "error"; then
|
||||
log_test_result 0 "Проверка на дублирование пользователя"
|
||||
else
|
||||
log_test_result 1 "Проверка на дублирование пользователя (должна быть ошибка)"
|
||||
fi
|
||||
|
||||
# Авторизация
|
||||
echo -e "\n${YELLOW}Авторизация тестового пользователя...${NC}"
|
||||
LOGIN_RESPONSE=$(curl -s -X POST http://localhost:8001/api/v1/auth/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"username": "apitest",
|
||||
"password": "ApiTest123!"
|
||||
}')
|
||||
|
||||
echo "$LOGIN_RESPONSE" | jq
|
||||
|
||||
TOKEN=$(echo "$LOGIN_RESPONSE" | jq -r '.access_token')
|
||||
if [[ $TOKEN == "null" || -z $TOKEN ]]; then
|
||||
log_test_result 1 "Получение токена авторизации"
|
||||
echo -e "${RED}Не удалось получить токен авторизации. Тестирование будет остановлено.${NC}"
|
||||
exit 1
|
||||
else
|
||||
log_test_result 0 "Получение токена авторизации"
|
||||
echo -e "${GREEN}Успешно получен токен авторизации${NC}"
|
||||
fi
|
||||
|
||||
# Тест на авторизацию с неверным паролем
|
||||
echo -e "\n${YELLOW}Проверка авторизации с неверными данными...${NC}"
|
||||
FAILED_LOGIN=$(curl -s -X POST http://localhost:8001/api/v1/auth/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"username": "apitest",
|
||||
"password": "WrongPassword123!"
|
||||
}')
|
||||
|
||||
echo "$FAILED_LOGIN" | jq
|
||||
|
||||
if echo "$FAILED_LOGIN" | grep -q "error"; then
|
||||
log_test_result 0 "Проверка авторизации с неверным паролем"
|
||||
else
|
||||
log_test_result 1 "Проверка авторизации с неверным паролем (должна быть ошибка)"
|
||||
fi
|
||||
|
||||
# 3. Получение текущего профиля через /me эндпоинт
|
||||
echo -e "\n${GREEN}3. Получение текущего профиля пользователя${NC}"
|
||||
PROFILE_RESPONSE=$(curl -s -X GET http://localhost:8001/api/v1/users/me \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$PROFILE_RESPONSE" | jq
|
||||
|
||||
if check_api_response "$PROFILE_RESPONSE" "username"; then
|
||||
log_test_result 0 "Получение профиля пользователя"
|
||||
else
|
||||
log_test_result 1 "Получение профиля пользователя"
|
||||
fi
|
||||
|
||||
# Тестирование получения профиля через альтернативные эндпоинты
|
||||
echo -e "\n${YELLOW}Тестирование альтернативного эндпоинта /api/v1/profile${NC}"
|
||||
PROFILE_ALT=$(curl -s -X GET http://localhost:8001/api/v1/profile \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$PROFILE_ALT" | jq
|
||||
|
||||
if check_api_response "$PROFILE_ALT" "username"; then
|
||||
log_test_result 0 "Получение профиля через альтернативный эндпоинт"
|
||||
else
|
||||
log_test_result 1 "Получение профиля через альтернативный эндпоинт"
|
||||
fi
|
||||
|
||||
# 4. Обновление профиля
|
||||
echo -e "\n${GREEN}4. Обновление профиля пользователя${NC}"
|
||||
UPDATE_RESPONSE=$(curl -s -X PATCH http://localhost:8001/api/v1/users/me \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"full_name": "Обновленное Имя",
|
||||
"phone_number": "+79997776655"
|
||||
}')
|
||||
|
||||
echo "$UPDATE_RESPONSE" | jq
|
||||
|
||||
if check_api_response "$UPDATE_RESPONSE" "full_name"; then
|
||||
log_test_result 0 "Обновление профиля пользователя"
|
||||
else
|
||||
log_test_result 1 "Обновление профиля пользователя"
|
||||
fi
|
||||
|
||||
# Проверка обновления профиля
|
||||
echo -e "\n${YELLOW}Проверка применения изменений профиля${NC}"
|
||||
PROFILE_AFTER=$(curl -s -X GET http://localhost:8001/api/v1/users/me \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
if [[ $(echo "$PROFILE_AFTER" | jq -r '.full_name') == "Обновленное Имя" ]]; then
|
||||
log_test_result 0 "Проверка обновления имени в профиле"
|
||||
else
|
||||
log_test_result 1 "Проверка обновления имени в профиле"
|
||||
fi
|
||||
|
||||
# 5. Добавление контактов экстренной связи
|
||||
echo -e "\n${GREEN}5. Добавление контакта для экстренной связи${NC}"
|
||||
CONTACT_RESPONSE=$(curl -s -X POST http://localhost:8001/api/v1/users/me/emergency-contacts \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"name": "Экстренный контакт",
|
||||
"phone_number": "+79991112233",
|
||||
"relationship": "Родственник"
|
||||
}')
|
||||
|
||||
echo "$CONTACT_RESPONSE" | jq
|
||||
|
||||
CONTACT_ID=$(echo "$CONTACT_RESPONSE" | jq -r '.id')
|
||||
|
||||
if [[ $CONTACT_ID != "null" && -n $CONTACT_ID ]]; then
|
||||
log_test_result 0 "Добавление экстренного контакта"
|
||||
else
|
||||
log_test_result 1 "Добавление экстренного контакта"
|
||||
fi
|
||||
|
||||
# 6. Получение списка контактов
|
||||
echo -e "\n${GREEN}6. Получение списка экстренных контактов${NC}"
|
||||
CONTACTS_RESPONSE=$(curl -s -X GET http://localhost:8001/api/v1/users/me/emergency-contacts \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$CONTACTS_RESPONSE" | jq
|
||||
|
||||
CONTACTS_COUNT=$(echo "$CONTACTS_RESPONSE" | jq '. | length')
|
||||
if [[ $CONTACTS_COUNT -gt 0 ]]; then
|
||||
log_test_result 0 "Получение списка экстренных контактов (найдено: $CONTACTS_COUNT)"
|
||||
else
|
||||
log_test_result 1 "Получение списка экстренных контактов"
|
||||
fi
|
||||
|
||||
# Обновление экстренного контакта
|
||||
if [[ $CONTACT_ID != "null" && -n $CONTACT_ID ]]; then
|
||||
echo -e "\n${YELLOW}Обновление экстренного контакта${NC}"
|
||||
UPDATE_CONTACT_RESPONSE=$(curl -s -X PATCH http://localhost:8001/api/v1/users/me/emergency-contacts/$CONTACT_ID \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"name": "Обновленный экстренный контакт",
|
||||
"relationship": "Друг"
|
||||
}')
|
||||
|
||||
echo "$UPDATE_CONTACT_RESPONSE" | jq
|
||||
|
||||
if [[ $(echo "$UPDATE_CONTACT_RESPONSE" | jq -r '.name') == "Обновленный экстренный контакт" ]]; then
|
||||
log_test_result 0 "Обновление экстренного контакта"
|
||||
else
|
||||
log_test_result 1 "Обновление экстренного контакта"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 7. Обновление местоположения пользователя
|
||||
echo -e "\n${GREEN}7. Обновление местоположения пользователя${NC}"
|
||||
LOCATION_UPDATE_RESPONSE=$(curl -s -X POST http://localhost:8003/api/v1/locations/update \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"latitude": 55.7558,
|
||||
"longitude": 37.6173,
|
||||
"accuracy": 10.0
|
||||
}')
|
||||
|
||||
echo "$LOCATION_UPDATE_RESPONSE" | jq
|
||||
|
||||
if check_api_response "$LOCATION_UPDATE_RESPONSE" "id"; then
|
||||
log_test_result 0 "Обновление местоположения"
|
||||
else
|
||||
log_test_result 1 "Обновление местоположения"
|
||||
fi
|
||||
|
||||
# 8. Получение последнего местоположения
|
||||
echo -e "\n${GREEN}8. Получение последнего местоположения${NC}"
|
||||
LAST_LOCATION=$(curl -s -X GET http://localhost:8003/api/v1/locations/last \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$LAST_LOCATION" | jq
|
||||
|
||||
if check_api_response "$LAST_LOCATION" "latitude"; then
|
||||
log_test_result 0 "Получение последнего местоположения"
|
||||
else
|
||||
log_test_result 1 "Получение последнего местоположения"
|
||||
fi
|
||||
|
||||
# Получение истории местоположений
|
||||
echo -e "\n${YELLOW}Получение истории местоположений${NC}"
|
||||
LOCATION_HISTORY=$(curl -s -X GET "http://localhost:8003/api/v1/locations/history?limit=5" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$LOCATION_HISTORY" | jq
|
||||
|
||||
if [[ $(echo "$LOCATION_HISTORY" | jq '. | length') -gt 0 ]]; then
|
||||
log_test_result 0 "Получение истории местоположений"
|
||||
else
|
||||
log_test_result 1 "Получение истории местоположений"
|
||||
fi
|
||||
|
||||
# 9. Создание экстренного оповещения
|
||||
echo -e "\n${GREEN}9. Создание экстренного оповещения${NC}"
|
||||
ALERT_RESPONSE=$(curl -s -X POST http://localhost:8002/api/v1/emergency/alerts \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"latitude": 55.7558,
|
||||
"longitude": 37.6173,
|
||||
"alert_type": "SOS",
|
||||
"message": "Тестовое экстренное оповещение"
|
||||
}')
|
||||
|
||||
echo "$ALERT_RESPONSE" | jq
|
||||
|
||||
ALERT_ID=$(echo "$ALERT_RESPONSE" | jq -r '.id')
|
||||
|
||||
if [[ $ALERT_ID != "null" && -n $ALERT_ID ]]; then
|
||||
log_test_result 0 "Создание экстренного оповещения"
|
||||
else
|
||||
log_test_result 1 "Создание экстренного оповещения"
|
||||
fi
|
||||
|
||||
# 10. Получение активных оповещений
|
||||
echo -e "\n${GREEN}10. Получение активных оповещений пользователя${NC}"
|
||||
ACTIVE_ALERTS=$(curl -s -X GET http://localhost:8002/api/v1/emergency/alerts/my \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$ACTIVE_ALERTS" | jq
|
||||
|
||||
ALERTS_COUNT=$(echo "$ACTIVE_ALERTS" | jq '. | length')
|
||||
if [[ $ALERTS_COUNT -gt 0 ]]; then
|
||||
log_test_result 0 "Получение активных оповещений (найдено: $ALERTS_COUNT)"
|
||||
else
|
||||
log_test_result 1 "Получение активных оповещений"
|
||||
fi
|
||||
|
||||
# 11. Получение статистики по оповещениям
|
||||
echo -e "\n${YELLOW}Получение статистики по экстренным оповещениям${NC}"
|
||||
ALERTS_STATS=$(curl -s -X GET http://localhost:8002/api/v1/emergency/stats \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$ALERTS_STATS" | jq
|
||||
|
||||
if check_api_response "$ALERTS_STATS" "total_alerts"; then
|
||||
log_test_result 0 "Получение статистики по оповещениям"
|
||||
else
|
||||
log_test_result 1 "Получение статистики по оповещениям"
|
||||
fi
|
||||
|
||||
# 12. Отмена экстренного оповещения
|
||||
if [[ $ALERT_ID != "null" && -n $ALERT_ID ]]; then
|
||||
echo -e "\n${GREEN}12. Отмена экстренного оповещения${NC}"
|
||||
CANCEL_RESPONSE=$(curl -s -X PATCH http://localhost:8002/api/v1/emergency/alerts/$ALERT_ID/cancel \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$CANCEL_RESPONSE" | jq
|
||||
|
||||
if [[ $(echo "$CANCEL_RESPONSE" | jq -r '.status') == "CANCELED" ]]; then
|
||||
log_test_result 0 "Отмена экстренного оповещения"
|
||||
else
|
||||
log_test_result 1 "Отмена экстренного оповещения"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 13. Создание записи в календаре
|
||||
echo -e "\n${GREEN}13. Создание записи в календаре${NC}"
|
||||
CALENDAR_RESPONSE=$(curl -s -X POST http://localhost:8004/api/v1/calendar/entries \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"entry_date": "2025-10-01",
|
||||
"cycle_day": 1,
|
||||
"symptoms": ["HEADACHE", "FATIGUE"],
|
||||
"mood": "NORMAL",
|
||||
"notes": "Тестовая запись в календаре"
|
||||
}')
|
||||
|
||||
echo "$CALENDAR_RESPONSE" | jq
|
||||
|
||||
CALENDAR_ENTRY_ID=$(echo "$CALENDAR_RESPONSE" | jq -r '.id')
|
||||
|
||||
if [[ $CALENDAR_ENTRY_ID != "null" && -n $CALENDAR_ENTRY_ID ]]; then
|
||||
log_test_result 0 "Создание записи в календаре"
|
||||
else
|
||||
log_test_result 1 "Создание записи в календаре"
|
||||
fi
|
||||
|
||||
# 14. Получение записей календаря
|
||||
echo -e "\n${GREEN}14. Получение записей календаря${NC}"
|
||||
CALENDAR_ENTRIES=$(curl -s -X GET "http://localhost:8004/api/v1/calendar/entries?start_date=2025-09-01&end_date=2025-10-31" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$CALENDAR_ENTRIES" | jq
|
||||
|
||||
ENTRIES_COUNT=$(echo "$CALENDAR_ENTRIES" | jq '. | length')
|
||||
if [[ $ENTRIES_COUNT -gt 0 ]]; then
|
||||
log_test_result 0 "Получение записей календаря (найдено: $ENTRIES_COUNT)"
|
||||
else
|
||||
log_test_result 1 "Получение записей календаря"
|
||||
fi
|
||||
|
||||
# Обновление записи в календаре
|
||||
if [[ $CALENDAR_ENTRY_ID != "null" && -n $CALENDAR_ENTRY_ID ]]; then
|
||||
echo -e "\n${YELLOW}Обновление записи в календаре${NC}"
|
||||
UPDATE_ENTRY=$(curl -s -X PATCH "http://localhost:8004/api/v1/calendar/entries/$CALENDAR_ENTRY_ID" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"notes": "Обновленная запись в календаре",
|
||||
"mood": "GOOD"
|
||||
}')
|
||||
|
||||
echo "$UPDATE_ENTRY" | jq
|
||||
|
||||
if [[ $(echo "$UPDATE_ENTRY" | jq -r '.mood') == "GOOD" ]]; then
|
||||
log_test_result 0 "Обновление записи в календаре"
|
||||
else
|
||||
log_test_result 1 "Обновление записи в календаре"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 15. Получение прогноза цикла
|
||||
echo -e "\n${GREEN}15. Получение прогноза цикла${NC}"
|
||||
CYCLE_PREDICTION=$(curl -s -X GET http://localhost:8004/api/v1/calendar/prediction \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$CYCLE_PREDICTION" | jq
|
||||
|
||||
if check_api_response "$CYCLE_PREDICTION" "next_period_date"; then
|
||||
log_test_result 0 "Получение прогноза цикла"
|
||||
else
|
||||
log_test_result 1 "Получение прогноза цикла"
|
||||
fi
|
||||
|
||||
# 16. Регистрация устройства для уведомлений
|
||||
echo -e "\n${GREEN}16. Регистрация устройства для уведомлений${NC}"
|
||||
DEVICE_RESPONSE=$(curl -s -X POST http://localhost:8005/api/v1/notifications/devices \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"device_token": "fcm-test-token-123",
|
||||
"device_type": "ANDROID",
|
||||
"app_version": "1.0.0"
|
||||
}')
|
||||
|
||||
echo "$DEVICE_RESPONSE" | jq
|
||||
|
||||
DEVICE_ID=$(echo "$DEVICE_RESPONSE" | jq -r '.id')
|
||||
|
||||
if [[ $DEVICE_ID != "null" && -n $DEVICE_ID ]]; then
|
||||
log_test_result 0 "Регистрация устройства для уведомлений"
|
||||
else
|
||||
log_test_result 1 "Регистрация устройства для уведомлений"
|
||||
fi
|
||||
|
||||
# 17. Настройка предпочтений уведомлений
|
||||
echo -e "\n${GREEN}17. Настройка предпочтений уведомлений${NC}"
|
||||
PREFS_RESPONSE=$(curl -s -X POST http://localhost:8005/api/v1/notifications/preferences \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"emergency_alerts": true,
|
||||
"nearby_incidents": true,
|
||||
"calendar_reminders": true,
|
||||
"system_notifications": true
|
||||
}')
|
||||
|
||||
echo "$PREFS_RESPONSE" | jq
|
||||
|
||||
if check_api_response "$PREFS_RESPONSE" "emergency_alerts"; then
|
||||
log_test_result 0 "Настройка предпочтений уведомлений"
|
||||
else
|
||||
log_test_result 1 "Настройка предпочтений уведомлений"
|
||||
fi
|
||||
|
||||
# 18. Получение текущих предпочтений уведомлений
|
||||
echo -e "\n${YELLOW}Получение текущих предпочтений уведомлений${NC}"
|
||||
CURRENT_PREFS=$(curl -s -X GET http://localhost:8005/api/v1/notifications/preferences \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$CURRENT_PREFS" | jq
|
||||
|
||||
if check_api_response "$CURRENT_PREFS" "calendar_reminders"; then
|
||||
log_test_result 0 "Получение предпочтений уведомлений"
|
||||
else
|
||||
log_test_result 1 "Получение предпочтений уведомлений"
|
||||
fi
|
||||
|
||||
# 19. Тестирование отправки тестового уведомления
|
||||
echo -e "\n${GREEN}19. Отправка тестового уведомления${NC}"
|
||||
TEST_NOTIFICATION=$(curl -s -X POST http://localhost:8005/api/v1/notifications/test \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"title": "Тестовое уведомление",
|
||||
"body": "Это тестовое уведомление для проверки API"
|
||||
}')
|
||||
|
||||
echo "$TEST_NOTIFICATION" | jq
|
||||
|
||||
if check_api_response "$TEST_NOTIFICATION" "status"; then
|
||||
log_test_result 0 "Отправка тестового уведомления"
|
||||
else
|
||||
log_test_result 1 "Отправка тестового уведомления"
|
||||
fi
|
||||
|
||||
# 20. Получение данных пользователя через Gateway
|
||||
echo -e "\n${GREEN}20. Получение данных пользователя через Gateway${NC}"
|
||||
DASHBOARD=$(curl -s -X GET http://localhost:8000/api/v1/users/dashboard \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
|
||||
echo "$DASHBOARD" | jq
|
||||
|
||||
if check_api_response "$DASHBOARD" "user"; then
|
||||
log_test_result 0 "Получение данных пользователя через API Gateway"
|
||||
else
|
||||
log_test_result 1 "Получение данных пользователя через API Gateway"
|
||||
fi
|
||||
|
||||
# 21. Тестирование документации Swagger
|
||||
echo -e "\n${GREEN}21. Проверка документации Swagger${NC}"
|
||||
SWAGGER_RESPONSE=$(curl -s -X GET http://localhost:8000/openapi.json)
|
||||
|
||||
echo "$SWAGGER_RESPONSE" | jq -C '.info'
|
||||
|
||||
if check_api_response "$SWAGGER_RESPONSE" "paths"; then
|
||||
log_test_result 0 "Получение OpenAPI схемы"
|
||||
else
|
||||
log_test_result 1 "Получение OpenAPI схемы"
|
||||
fi
|
||||
|
||||
# 22. Проверка наличия схем данных в Swagger
|
||||
echo -e "\n${YELLOW}Проверка наличия схем данных в Swagger${NC}"
|
||||
COMPONENTS_SCHEMAS=$(echo "$SWAGGER_RESPONSE" | jq '.components.schemas')
|
||||
SCHEMAS_COUNT=$(echo "$COMPONENTS_SCHEMAS" | jq 'length')
|
||||
|
||||
if [[ $SCHEMAS_COUNT -gt 0 ]]; then
|
||||
log_test_result 0 "Проверка наличия схем данных (найдено: $SCHEMAS_COUNT)"
|
||||
echo -e "${GREEN}Доступные схемы:${NC}"
|
||||
echo "$COMPONENTS_SCHEMAS" | jq 'keys'
|
||||
else
|
||||
log_test_result 1 "Проверка наличия схем данных"
|
||||
fi
|
||||
|
||||
# Очистка ресурсов
|
||||
echo -e "\n${GREEN}Очистка тестовых данных...${NC}"
|
||||
|
||||
# Удаление созданных ресурсов
|
||||
if [[ $DEVICE_ID != "null" && -n $DEVICE_ID ]]; then
|
||||
curl -s -X DELETE http://localhost:8005/api/v1/notifications/devices/$DEVICE_ID \
|
||||
-H "Authorization: Bearer $TOKEN" > /dev/null
|
||||
echo "Удалено устройство для уведомлений"
|
||||
fi
|
||||
|
||||
if [[ $CONTACT_ID != "null" && -n $CONTACT_ID ]]; then
|
||||
curl -s -X DELETE http://localhost:8001/api/v1/users/me/emergency-contacts/$CONTACT_ID \
|
||||
-H "Authorization: Bearer $TOKEN" > /dev/null
|
||||
echo "Удалены экстренные контакты"
|
||||
fi
|
||||
|
||||
if [[ $CALENDAR_ENTRY_ID != "null" && -n $CALENDAR_ENTRY_ID ]]; then
|
||||
curl -s -X DELETE http://localhost:8004/api/v1/calendar/entries/$CALENDAR_ENTRY_ID \
|
||||
-H "Authorization: Bearer $TOKEN" > /dev/null
|
||||
echo "Удалены записи в календаре"
|
||||
fi
|
||||
|
||||
# Сбор статистики
|
||||
PASSED_TESTS=$(grep -c "✓ УСПЕШНО" /tmp/api_test_output 2>/dev/null || echo "0")
|
||||
FAILED_TESTS=$(grep -c "✗ ОШИБКА" /tmp/api_test_output 2>/dev/null || echo "0")
|
||||
TOTAL_TESTS=$((PASSED_TESTS + FAILED_TESTS))
|
||||
|
||||
echo -e "\n${YELLOW}=======================================${NC}"
|
||||
echo -e "${YELLOW}📊 Итоги тестирования API${NC}"
|
||||
echo -e "${YELLOW}=======================================${NC}"
|
||||
echo -e "Всего тестов: ${TOTAL_TESTS}"
|
||||
echo -e "${GREEN}✓ Успешно: ${PASSED_TESTS}${NC}"
|
||||
echo -e "${RED}✗ Ошибок: ${FAILED_TESTS}${NC}"
|
||||
|
||||
if [[ $FAILED_TESTS -eq 0 ]]; then
|
||||
echo -e "\n${GREEN}✅ Тестирование API завершено успешно!${NC}"
|
||||
else
|
||||
echo -e "\n${YELLOW}⚠️ Тестирование API завершено с ошибками!${NC}"
|
||||
fi
|
||||
echo -e "${YELLOW}=======================================${NC}"
|
||||
|
||||
# Сохранение результатов в файл
|
||||
{
|
||||
echo "# Результаты тестирования API"
|
||||
echo "Дата: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
echo "## Итоги"
|
||||
echo "- Всего тестов: ${TOTAL_TESTS}"
|
||||
echo "- Успешно: ${PASSED_TESTS}"
|
||||
echo "- Ошибок: ${FAILED_TESTS}"
|
||||
echo ""
|
||||
echo "## Подробности"
|
||||
grep -E "✓ УСПЕШНО|✗ ОШИБКА" /tmp/api_test_output 2>/dev/null || echo "Нет деталей"
|
||||
} > api_test_results.md
|
||||
|
||||
echo "Подробные результаты сохранены в файле api_test_results.md"
|
||||
118
tests/gateway_test.sh
Executable file
118
tests/gateway_test.sh
Executable file
@@ -0,0 +1,118 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Women Safety App - Gateway API Testing Script (Simplified)
|
||||
# This version sends all requests through API Gateway
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo -e "${BLUE}=======================================${NC}"
|
||||
echo -e "${BLUE}🔍 Women Safety App Gateway API Test ${NC}"
|
||||
echo -e "${BLUE}=======================================${NC}"
|
||||
|
||||
# Base URL - все запросы идут через API Gateway
|
||||
GATEWAY_URL="http://localhost:8000"
|
||||
|
||||
# Проверка, запущен ли API Gateway
|
||||
echo -e "${YELLOW}🔎 Checking API Gateway...${NC}"
|
||||
if curl -s "$GATEWAY_URL/api/v1/health" | grep -q "status.*healthy"; then
|
||||
echo -e "${GREEN}✅ API Gateway is running${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ API Gateway is not available. Make sure it's running before testing.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Регистрация пользователя
|
||||
echo -e "\n${YELLOW}👤 Registering test user...${NC}"
|
||||
# Создаем уникальное имя пользователя и email с временной меткой
|
||||
TIMESTAMP=$(date +%s)
|
||||
USERNAME="testgateway_${TIMESTAMP}"
|
||||
EMAIL="testgateway_${TIMESTAMP}@example.com"
|
||||
|
||||
echo -e " └─ Using username: $USERNAME and email: $EMAIL"
|
||||
|
||||
REGISTER_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/auth/register" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"username": "'"$USERNAME"'",
|
||||
"email": "'"$EMAIL"'",
|
||||
"password": "Test@1234",
|
||||
"full_name": "Test Gateway User",
|
||||
"phone_number": "+1234567890"
|
||||
}')
|
||||
|
||||
echo "$REGISTER_RESPONSE" | jq
|
||||
USER_ID=$(echo "$REGISTER_RESPONSE" | jq -r '.id')
|
||||
|
||||
# Авторизация
|
||||
echo -e "\n${YELLOW}🔑 Logging in as test user...${NC}"
|
||||
LOGIN_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/auth/login" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"username": "'"$USERNAME"'",
|
||||
"password": "Test@1234"
|
||||
}')
|
||||
|
||||
echo "$LOGIN_RESPONSE" | jq
|
||||
TOKEN=$(echo "$LOGIN_RESPONSE" | jq -r '.access_token')
|
||||
|
||||
if [ "$TOKEN" != "null" ] && [ -n "$TOKEN" ]; then
|
||||
echo -e "${GREEN}✅ Login successful${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ Login failed, stopping test${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Получение информации о пользователе
|
||||
echo -e "\n${YELLOW}👤 Getting user profile...${NC}"
|
||||
curl -s -X GET "$GATEWAY_URL/api/v1/users/me" \
|
||||
-H "Authorization: Bearer $TOKEN" | jq
|
||||
|
||||
# Обновление местоположения
|
||||
echo -e "\n${YELLOW}📍 Updating location...${NC}"
|
||||
curl -s -X POST "$GATEWAY_URL/api/v1/locations/update" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"latitude": 55.7558,
|
||||
"longitude": 37.6173,
|
||||
"accuracy": 5.0
|
||||
}' | jq
|
||||
|
||||
# Создание экстренного оповещения
|
||||
echo -e "\n${YELLOW}🚨 Creating emergency alert...${NC}"
|
||||
ALERT_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/emergency/alerts" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"latitude": 55.7558,
|
||||
"longitude": 37.6173,
|
||||
"alert_type": "SOS",
|
||||
"message": "Gateway test emergency alert"
|
||||
}')
|
||||
|
||||
echo "$ALERT_RESPONSE" | jq
|
||||
ALERT_ID=$(echo "$ALERT_RESPONSE" | jq -r '.id')
|
||||
|
||||
# Получение текущих оповещений
|
||||
echo -e "\n${YELLOW}🔔 Getting active alerts...${NC}"
|
||||
curl -s -X GET "$GATEWAY_URL/api/v1/emergency/alerts/my" \
|
||||
-H "Authorization: Bearer $TOKEN" | jq
|
||||
|
||||
# Отмена оповещения
|
||||
if [ "$ALERT_ID" != "null" ] && [ -n "$ALERT_ID" ]; then
|
||||
echo -e "\n${YELLOW}🚫 Cancelling alert...${NC}"
|
||||
curl -s -X PATCH "$GATEWAY_URL/api/v1/emergency/alerts/$ALERT_ID/cancel" \
|
||||
-H "Authorization: Bearer $TOKEN" | jq
|
||||
fi
|
||||
|
||||
# Проверка доступа к панели пользователя (комплексный запрос)
|
||||
echo -e "\n${YELLOW}📊 Getting user dashboard...${NC}"
|
||||
curl -s -X GET "$GATEWAY_URL/api/v1/users/dashboard" \
|
||||
-H "Authorization: Bearer $TOKEN" | jq
|
||||
|
||||
echo -e "\n${GREEN}✅ Gateway API test completed${NC}"
|
||||
89
tests/health-check.sh
Executable file
89
tests/health-check.sh
Executable file
@@ -0,0 +1,89 @@
|
||||
#!/bin/bash
|
||||
|
||||
# System Health Check Script
|
||||
# Проверяет все компоненты Women's Safety Backend
|
||||
|
||||
set -e
|
||||
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo -e "${BLUE}🏥 Women's Safety Backend - Health Check${NC}"
|
||||
echo "========================================="
|
||||
|
||||
# Check if services are running
|
||||
echo -e "${YELLOW}🔍 Checking service processes...${NC}"
|
||||
|
||||
SERVICES=("user_service" "emergency_service" "location_service" "calendar_service" "notification_service" "api_gateway")
|
||||
PORTS=(8001 8002 8003 8004 8005 8000)
|
||||
|
||||
for i in "${!SERVICES[@]}"; do
|
||||
service="${SERVICES[$i]}"
|
||||
port="${PORTS[$i]}"
|
||||
|
||||
if lsof -i :$port > /dev/null 2>&1; then
|
||||
echo -e "${GREEN}✅ $service (port $port) - Running${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ $service (port $port) - Not running${NC}"
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
echo -e "${YELLOW}🌐 Testing API endpoints...${NC}"
|
||||
|
||||
# Test health endpoints
|
||||
test_endpoint() {
|
||||
local url=$1
|
||||
local name=$2
|
||||
|
||||
if curl -s -f "$url" > /dev/null 2>&1; then
|
||||
echo -e "${GREEN}✅ $name - Healthy${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ $name - Failed${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
test_endpoint "http://localhost:8000/health" "API Gateway"
|
||||
test_endpoint "http://localhost:8001/api/v1/health" "User Service"
|
||||
test_endpoint "http://localhost:8002/api/v1/health" "Emergency Service"
|
||||
test_endpoint "http://localhost:8003/api/v1/health" "Location Service"
|
||||
test_endpoint "http://localhost:8004/api/v1/health" "Calendar Service"
|
||||
test_endpoint "http://localhost:8005/api/v1/health" "Notification Service"
|
||||
|
||||
echo
|
||||
echo -e "${YELLOW}💾 Checking database connection...${NC}"
|
||||
|
||||
if curl -s http://localhost:8001/api/v1/health | grep -q "database.*ok" > /dev/null 2>&1; then
|
||||
echo -e "${GREEN}✅ Database - Connected${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ Database - Connection failed${NC}"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo -e "${YELLOW}🚀 Quick API test...${NC}"
|
||||
|
||||
# Test user registration
|
||||
TEST_EMAIL="healthcheck_$(date +%s)@example.com"
|
||||
REGISTRATION_RESULT=$(curl -s -X POST "http://localhost:8001/api/v1/register" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"email\":\"$TEST_EMAIL\",\"password\":\"test123\",\"first_name\":\"Health\",\"last_name\":\"Check\",\"phone\":\"+1234567890\"}" \
|
||||
-w "%{http_code}")
|
||||
|
||||
if [[ $REGISTRATION_RESULT == *"201"* ]]; then
|
||||
echo -e "${GREEN}✅ User Registration - Working${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ User Registration - Failed${NC}"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo -e "${BLUE}📊 System Resources:${NC}"
|
||||
echo -e "CPU Usage: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | awk -F'%' '{print $1}')%"
|
||||
echo -e "Memory: $(free -h | grep Mem | awk '{print $3"/"$2}')"
|
||||
echo -e "Disk: $(df -h / | tail -1 | awk '{print $3"/"$2" ("$5" used)"}')"
|
||||
|
||||
echo
|
||||
echo -e "${GREEN}🎉 Health check completed!${NC}"
|
||||
427
tests/python_api_test.py
Executable file
427
tests/python_api_test.py
Executable file
@@ -0,0 +1,427 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
Скрипт для тестирования API приложения для безопасности женщин с использованием Python
|
||||
"""
|
||||
|
||||
import json
|
||||
import requests
|
||||
import time
|
||||
import sys
|
||||
from datetime import datetime, timedelta
|
||||
from termcolor import colored
|
||||
|
||||
BASE_URLS = {
|
||||
"gateway": "http://localhost:8000",
|
||||
"user": "http://localhost:8001",
|
||||
"emergency": "http://localhost:8002",
|
||||
"location": "http://localhost:8003",
|
||||
"calendar": "http://localhost:8004",
|
||||
"notification": "http://localhost:8005"
|
||||
}
|
||||
|
||||
# Класс для тестирования API
|
||||
class APITester:
|
||||
def __init__(self):
|
||||
self.token = None
|
||||
self.user_id = None
|
||||
self.emergency_contact_id = None
|
||||
self.alert_id = None
|
||||
self.calendar_entry_id = None
|
||||
self.device_id = None
|
||||
|
||||
def print_section(self, title):
|
||||
"""Печать заголовка секции"""
|
||||
print("\n" + colored("="*50, "yellow"))
|
||||
print(colored(f" {title}", "green", attrs=["bold"]))
|
||||
print(colored("="*50, "yellow"))
|
||||
|
||||
def print_step(self, title):
|
||||
"""Печать шага тестирования"""
|
||||
print(colored(f"\n▶ {title}", "cyan"))
|
||||
|
||||
def print_response(self, response, title=None):
|
||||
"""Печать ответа API"""
|
||||
if title:
|
||||
print(colored(f"● {title}:", "magenta"))
|
||||
|
||||
try:
|
||||
if response.status_code >= 400:
|
||||
print(colored(f"HTTP Status: {response.status_code}", "red"))
|
||||
else:
|
||||
print(colored(f"HTTP Status: {response.status_code}", "green"))
|
||||
|
||||
json_response = response.json()
|
||||
print(json.dumps(json_response, indent=2, ensure_ascii=False))
|
||||
return json_response
|
||||
except:
|
||||
print(colored("Не удалось распарсить JSON ответ", "red"))
|
||||
print(response.text)
|
||||
return {}
|
||||
|
||||
def check_services(self):
|
||||
"""Проверка доступности всех сервисов"""
|
||||
self.print_section("Проверка доступности сервисов")
|
||||
|
||||
all_up = True
|
||||
|
||||
for service_name, url in BASE_URLS.items():
|
||||
print(colored(f"Проверка {service_name.upper()} ({url})...", "cyan"), end=" ")
|
||||
|
||||
try:
|
||||
# Пробуем разные варианты эндпоинтов health
|
||||
health_endpoints = ["/health", "/api/v1/health"]
|
||||
service_up = False
|
||||
|
||||
for endpoint in health_endpoints:
|
||||
try:
|
||||
response = requests.get(f"{url}{endpoint}", timeout=5)
|
||||
if response.status_code == 200:
|
||||
if "status" in response.json() and "healthy" in response.json()["status"]:
|
||||
service_up = True
|
||||
break
|
||||
except:
|
||||
pass
|
||||
|
||||
if service_up:
|
||||
print(colored("OK", "green"))
|
||||
else:
|
||||
print(colored("НЕДОСТУПЕН", "red"))
|
||||
all_up = False
|
||||
except Exception as e:
|
||||
print(colored(f"ОШИБКА: {str(e)}", "red"))
|
||||
all_up = False
|
||||
|
||||
if not all_up:
|
||||
choice = input(colored("Некоторые сервисы недоступны. Продолжить тестирование? (y/n): ", "yellow"))
|
||||
if choice.lower() != "y":
|
||||
sys.exit(1)
|
||||
|
||||
def register_user(self):
|
||||
"""Регистрация нового пользователя"""
|
||||
self.print_step("Регистрация нового пользователя")
|
||||
|
||||
data = {
|
||||
"username": f"testuser_{int(time.time())}", # Уникальное имя для каждого запуска
|
||||
"email": f"test{int(time.time())}@example.com",
|
||||
"password": "Test@1234",
|
||||
"full_name": "Тестовый Пользователь",
|
||||
"phone_number": "+79001234567"
|
||||
}
|
||||
|
||||
response = requests.post(f"{BASE_URLS['user']}/api/v1/users/register", json=data)
|
||||
user_data = self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 201 or response.status_code == 200:
|
||||
print(colored("✓ Пользователь успешно зарегистрирован", "green"))
|
||||
self.user_id = user_data.get("id")
|
||||
return data
|
||||
else:
|
||||
print(colored("✗ Ошибка при регистрации пользователя", "red"))
|
||||
return None
|
||||
|
||||
def login_user(self, credentials):
|
||||
"""Авторизация пользователя"""
|
||||
self.print_step("Авторизация пользователя")
|
||||
|
||||
data = {
|
||||
"username": credentials["username"],
|
||||
"password": credentials["password"]
|
||||
}
|
||||
|
||||
response = requests.post(f"{BASE_URLS['user']}/api/v1/auth/login", json=data)
|
||||
login_data = self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 200 and "access_token" in login_data:
|
||||
self.token = login_data["access_token"]
|
||||
print(colored("✓ Успешная авторизация", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка авторизации", "red"))
|
||||
return False
|
||||
|
||||
def update_profile(self):
|
||||
"""Обновление профиля пользователя"""
|
||||
self.print_step("Обновление профиля пользователя")
|
||||
|
||||
data = {
|
||||
"full_name": "Обновленное Имя",
|
||||
"phone_number": "+79009876543"
|
||||
}
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.patch(f"{BASE_URLS['user']}/api/v1/users/me", json=data, headers=headers)
|
||||
self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 200:
|
||||
print(colored("✓ Профиль успешно обновлен", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при обновлении профиля", "red"))
|
||||
return False
|
||||
|
||||
def add_emergency_contact(self):
|
||||
"""Добавление контакта для экстренной связи"""
|
||||
self.print_step("Добавление экстренного контакта")
|
||||
|
||||
data = {
|
||||
"name": "Экстренный Контакт",
|
||||
"phone_number": "+79991112233",
|
||||
"relationship": "Родственник"
|
||||
}
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.post(f"{BASE_URLS['user']}/api/v1/users/me/emergency-contacts",
|
||||
json=data, headers=headers)
|
||||
contact_data = self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 201 or response.status_code == 200:
|
||||
self.emergency_contact_id = contact_data.get("id")
|
||||
print(colored("✓ Экстренный контакт добавлен", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при добавлении контакта", "red"))
|
||||
return False
|
||||
|
||||
def update_location(self):
|
||||
"""Обновление местоположения пользователя"""
|
||||
self.print_step("Обновление местоположения")
|
||||
|
||||
data = {
|
||||
"latitude": 55.7558,
|
||||
"longitude": 37.6173,
|
||||
"accuracy": 10.0
|
||||
}
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.post(f"{BASE_URLS['location']}/api/v1/locations/update",
|
||||
json=data, headers=headers)
|
||||
self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 200 or response.status_code == 201:
|
||||
print(colored("✓ Местоположение обновлено", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при обновлении местоположения", "red"))
|
||||
return False
|
||||
|
||||
def get_location(self):
|
||||
"""Получение текущего местоположения"""
|
||||
self.print_step("Получение местоположения")
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.get(f"{BASE_URLS['location']}/api/v1/locations/last", headers=headers)
|
||||
self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 200:
|
||||
print(colored("✓ Местоположение получено", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при получении местоположения", "red"))
|
||||
return False
|
||||
|
||||
def create_emergency_alert(self):
|
||||
"""Создание экстренного оповещения"""
|
||||
self.print_step("Создание экстренного оповещения")
|
||||
|
||||
data = {
|
||||
"latitude": 55.7558,
|
||||
"longitude": 37.6173,
|
||||
"alert_type": "SOS",
|
||||
"message": "Тестовое экстренное оповещение"
|
||||
}
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.post(f"{BASE_URLS['emergency']}/api/v1/emergency/alerts",
|
||||
json=data, headers=headers)
|
||||
alert_data = self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 201 or response.status_code == 200:
|
||||
self.alert_id = alert_data.get("id")
|
||||
print(colored("✓ Экстренное оповещение создано", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при создании оповещения", "red"))
|
||||
return False
|
||||
|
||||
def get_alerts(self):
|
||||
"""Получение активных оповещений"""
|
||||
self.print_step("Получение активных оповещений")
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.get(f"{BASE_URLS['emergency']}/api/v1/emergency/alerts/my", headers=headers)
|
||||
self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 200:
|
||||
print(colored("✓ Список оповещений получен", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при получении оповещений", "red"))
|
||||
return False
|
||||
|
||||
def cancel_alert(self):
|
||||
"""Отмена экстренного оповещения"""
|
||||
if not self.alert_id:
|
||||
print(colored("⚠ Нет активного оповещения для отмены", "yellow"))
|
||||
return False
|
||||
|
||||
self.print_step("Отмена экстренного оповещения")
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.patch(f"{BASE_URLS['emergency']}/api/v1/emergency/alerts/{self.alert_id}/cancel",
|
||||
headers=headers)
|
||||
self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 200:
|
||||
print(colored("✓ Оповещение отменено", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при отмене оповещения", "red"))
|
||||
return False
|
||||
|
||||
def create_calendar_entry(self):
|
||||
"""Создание записи в календаре"""
|
||||
self.print_step("Создание записи в календаре")
|
||||
|
||||
data = {
|
||||
"entry_date": datetime.now().strftime("%Y-%m-%d"),
|
||||
"cycle_day": 1,
|
||||
"symptoms": ["HEADACHE", "FATIGUE"],
|
||||
"mood": "NORMAL",
|
||||
"notes": "Тестовая запись"
|
||||
}
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.post(f"{BASE_URLS['calendar']}/api/v1/calendar/entries",
|
||||
json=data, headers=headers)
|
||||
entry_data = self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 201 or response.status_code == 200:
|
||||
self.calendar_entry_id = entry_data.get("id")
|
||||
print(colored("✓ Запись в календаре создана", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при создании записи в календаре", "red"))
|
||||
return False
|
||||
|
||||
def get_calendar_entries(self):
|
||||
"""Получение записей календаря"""
|
||||
self.print_step("Получение записей календаря")
|
||||
|
||||
start_date = (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")
|
||||
end_date = (datetime.now() + timedelta(days=30)).strftime("%Y-%m-%d")
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.get(
|
||||
f"{BASE_URLS['calendar']}/api/v1/calendar/entries?start_date={start_date}&end_date={end_date}",
|
||||
headers=headers
|
||||
)
|
||||
self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 200:
|
||||
print(colored("✓ Записи календаря получены", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при получении записей календаря", "red"))
|
||||
return False
|
||||
|
||||
def register_device(self):
|
||||
"""Регистрация устройства для уведомлений"""
|
||||
self.print_step("Регистрация устройства для уведомлений")
|
||||
|
||||
data = {
|
||||
"device_token": f"test-token-{int(time.time())}",
|
||||
"device_type": "ANDROID",
|
||||
"app_version": "1.0.0"
|
||||
}
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.post(f"{BASE_URLS['notification']}/api/v1/notifications/devices",
|
||||
json=data, headers=headers)
|
||||
device_data = self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 201 or response.status_code == 200:
|
||||
self.device_id = device_data.get("id")
|
||||
print(colored("✓ Устройство зарегистрировано", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при регистрации устройства", "red"))
|
||||
return False
|
||||
|
||||
def set_notification_preferences(self):
|
||||
"""Настройка предпочтений уведомлений"""
|
||||
self.print_step("Настройка предпочтений уведомлений")
|
||||
|
||||
data = {
|
||||
"emergency_alerts": True,
|
||||
"nearby_incidents": True,
|
||||
"calendar_reminders": True,
|
||||
"system_notifications": True
|
||||
}
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.post(f"{BASE_URLS['notification']}/api/v1/notifications/preferences",
|
||||
json=data, headers=headers)
|
||||
self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 200 or response.status_code == 201:
|
||||
print(colored("✓ Предпочтения уведомлений настроены", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при настройке предпочтений", "red"))
|
||||
return False
|
||||
|
||||
def get_gateway_dashboard(self):
|
||||
"""Получение данных через API Gateway"""
|
||||
self.print_step("Получение данных пользователя через Gateway")
|
||||
|
||||
headers = {"Authorization": f"Bearer {self.token}"}
|
||||
response = requests.get(f"{BASE_URLS['gateway']}/api/v1/users/dashboard", headers=headers)
|
||||
self.print_response(response, "Ответ сервера")
|
||||
|
||||
if response.status_code == 200:
|
||||
print(colored("✓ Данные получены через Gateway", "green"))
|
||||
return True
|
||||
else:
|
||||
print(colored("✗ Ошибка при получении данных через Gateway", "red"))
|
||||
return False
|
||||
|
||||
def run_tests(self):
|
||||
"""Запуск полной серии тестов"""
|
||||
self.print_section("НАЧАЛО ТЕСТИРОВАНИЯ API")
|
||||
|
||||
# Проверка доступности сервисов
|
||||
self.check_services()
|
||||
|
||||
# Регистрация и авторизация
|
||||
user_data = self.register_user()
|
||||
if not user_data:
|
||||
print(colored("Критическая ошибка: Не удалось зарегистрировать пользователя", "red"))
|
||||
return False
|
||||
|
||||
if not self.login_user(user_data):
|
||||
print(colored("Критическая ошибка: Не удалось авторизоваться", "red"))
|
||||
return False
|
||||
|
||||
# Основные тесты
|
||||
self.update_profile()
|
||||
self.add_emergency_contact()
|
||||
self.update_location()
|
||||
self.get_location()
|
||||
self.create_emergency_alert()
|
||||
self.get_alerts()
|
||||
self.cancel_alert()
|
||||
self.create_calendar_entry()
|
||||
self.get_calendar_entries()
|
||||
self.register_device()
|
||||
self.set_notification_preferences()
|
||||
self.get_gateway_dashboard()
|
||||
|
||||
self.print_section("ТЕСТИРОВАНИЕ ЗАВЕРШЕНО")
|
||||
print(colored("✓ Тесты API выполнены успешно!", "green", attrs=["bold"]))
|
||||
return True
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
tester = APITester()
|
||||
tester.run_tests()
|
||||
198
tests/test_api.sh
Executable file
198
tests/test_api.sh
Executable file
@@ -0,0 +1,198 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Women Safety App - API Testing Script
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo -e "${BLUE}=======================================${NC}"
|
||||
echo -e "${BLUE}🔍 Women Safety App API Testing Script ${NC}"
|
||||
echo -e "${BLUE}=======================================${NC}"
|
||||
|
||||
# Base URLs
|
||||
GATEWAY_URL="http://localhost:8000"
|
||||
USER_URL="http://localhost:8001"
|
||||
EMERGENCY_URL="http://localhost:8002"
|
||||
LOCATION_URL="http://localhost:8003"
|
||||
CALENDAR_URL="http://localhost:8004"
|
||||
NOTIFICATION_URL="http://localhost:8005"
|
||||
|
||||
# Check if services are running
|
||||
check_service() {
|
||||
local url=$1
|
||||
local service_name=$2
|
||||
|
||||
echo -e "${YELLOW}🔎 Checking $service_name service...${NC}"
|
||||
# Проверяем оба возможных эндпоинта health
|
||||
if curl -s "$url/health" | grep -q "status.*healthy" || curl -s "$url/api/v1/health" | grep -q "status.*healthy"; then
|
||||
echo -e "${GREEN}✅ $service_name is running${NC}"
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}❌ $service_name is not available${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Test all services health
|
||||
test_health() {
|
||||
echo -e "${BLUE}📊 Testing service health endpoints...${NC}"
|
||||
|
||||
local errors=0
|
||||
check_service "$GATEWAY_URL" "API Gateway" || ((errors++))
|
||||
check_service "$USER_URL" "User Service" || ((errors++))
|
||||
check_service "$EMERGENCY_URL" "Emergency Service" || ((errors++))
|
||||
check_service "$LOCATION_URL" "Location Service" || ((errors++))
|
||||
check_service "$CALENDAR_URL" "Calendar Service" || ((errors++))
|
||||
check_service "$NOTIFICATION_URL" "Notification Service" || ((errors++))
|
||||
|
||||
if [ $errors -eq 0 ]; then
|
||||
echo -e "${GREEN}✅ All services are healthy${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ $errors service(s) are not running properly${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Register a test user
|
||||
register_user() {
|
||||
echo -e "${YELLOW}👤 Registering test user...${NC}"
|
||||
local response
|
||||
response=$(curl -s -X POST "$GATEWAY_URL/api/v1/auth/register" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"username": "testuser",
|
||||
"email": "test@example.com",
|
||||
"password": "Test@1234",
|
||||
"full_name": "Test User",
|
||||
"phone_number": "+1234567890"
|
||||
}')
|
||||
|
||||
echo "$response" | jq
|
||||
if echo "$response" | grep -q "id"; then
|
||||
echo -e "${GREEN}✅ User registered successfully${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ Failed to register user${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Login with test user
|
||||
login_user() {
|
||||
echo -e "${YELLOW}🔑 Logging in as test user...${NC}"
|
||||
local response
|
||||
response=$(curl -s -X POST "$GATEWAY_URL/api/v1/auth/login" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"username": "testuser",
|
||||
"password": "Test@1234"
|
||||
}')
|
||||
|
||||
echo "$response" | jq
|
||||
|
||||
# Extract token
|
||||
TOKEN=$(echo "$response" | jq -r '.access_token')
|
||||
if [ "$TOKEN" != "null" ] && [ -n "$TOKEN" ]; then
|
||||
echo -e "${GREEN}✅ Login successful${NC}"
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}❌ Login failed${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Test emergency alert
|
||||
create_emergency() {
|
||||
if [ -z "$TOKEN" ]; then
|
||||
echo -e "${RED}❌ No token available. Please login first.${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}🚨 Creating emergency alert...${NC}"
|
||||
local response
|
||||
response=$(curl -s -X POST "$GATEWAY_URL/api/v1/emergency/alerts" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"latitude": 37.7749,
|
||||
"longitude": -122.4194,
|
||||
"alert_type": "SOS",
|
||||
"message": "This is a test emergency alert"
|
||||
}')
|
||||
|
||||
echo "$response" | jq
|
||||
|
||||
if echo "$response" | grep -q "id"; then
|
||||
echo -e "${GREEN}✅ Emergency alert created successfully${NC}"
|
||||
# Extract emergency ID
|
||||
EMERGENCY_ID=$(echo "$response" | jq -r '.id')
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}❌ Failed to create emergency alert${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Test updating location
|
||||
update_location() {
|
||||
if [ -z "$TOKEN" ]; then
|
||||
echo -e "${RED}❌ No token available. Please login first.${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}📍 Updating user location...${NC}"
|
||||
local response
|
||||
response=$(curl -s -X POST "$GATEWAY_URL/api/v1/locations/update" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"latitude": 37.7749,
|
||||
"longitude": -122.4194,
|
||||
"accuracy": 10.0
|
||||
}')
|
||||
|
||||
echo "$response" | jq
|
||||
|
||||
if echo "$response" | grep -q "success"; then
|
||||
echo -e "${GREEN}✅ Location updated successfully${NC}"
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}❌ Failed to update location${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Main test sequence
|
||||
run_tests() {
|
||||
test_health
|
||||
echo -e "${BLUE}---------------------------------------${NC}"
|
||||
|
||||
register_user
|
||||
echo -e "${BLUE}---------------------------------------${NC}"
|
||||
|
||||
login_user
|
||||
echo -e "${BLUE}---------------------------------------${NC}"
|
||||
|
||||
if [ -n "$TOKEN" ]; then
|
||||
update_location
|
||||
echo -e "${BLUE}---------------------------------------${NC}"
|
||||
|
||||
create_emergency
|
||||
echo -e "${BLUE}---------------------------------------${NC}"
|
||||
fi
|
||||
|
||||
echo -e "${BLUE}✨ API testing completed${NC}"
|
||||
echo -e "${YELLOW}📖 API Documentation available at: ${GREEN}http://localhost:8000/docs${NC}"
|
||||
}
|
||||
|
||||
# Check for jq dependency
|
||||
if ! command -v jq &> /dev/null; then
|
||||
echo -e "${RED}❌ jq is required but not installed. Please install jq to continue.${NC}"
|
||||
echo -e "Run: ${YELLOW}sudo apt-get install jq${NC} (Debian/Ubuntu)"
|
||||
echo -e "or: ${YELLOW}brew install jq${NC} (macOS)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run tests
|
||||
run_tests
|
||||
250
tests/test_endpoints.sh
Executable file
250
tests/test_endpoints.sh
Executable file
@@ -0,0 +1,250 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт для тестирования всех API-эндпоинтов через API Gateway
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# База URL API Gateway
|
||||
GATEWAY_URL="http://localhost:8000"
|
||||
|
||||
# Функция для проверки статуса ответа
|
||||
check_status() {
|
||||
local response=$1
|
||||
local endpoint=$2
|
||||
|
||||
if echo "$response" | grep -q "\"status\"\|\"id\"\|\"message\""; then
|
||||
echo -e "${GREEN}✅ $endpoint - OK${NC}"
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}❌ $endpoint - Error: $response${NC}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Проверка доступности API Gateway
|
||||
echo -e "${BLUE}===============================================${NC}"
|
||||
echo -e "${BLUE}🔍 Проверка API Gateway и всех маршрутов${NC}"
|
||||
echo -e "${BLUE}===============================================${NC}"
|
||||
|
||||
echo -e "${YELLOW}🔎 Проверка API Gateway...${NC}"
|
||||
HEALTH_RESPONSE=$(curl -s "$GATEWAY_URL/api/v1/health")
|
||||
if echo "$HEALTH_RESPONSE" | grep -q "healthy"; then
|
||||
echo -e "${GREEN}✅ API Gateway работает${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ API Gateway недоступен. Убедитесь, что он запущен.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "\n${BLUE}==== User Service Endpoints ====${NC}"
|
||||
|
||||
# Регистрация тестового пользователя
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/auth/register${NC}"
|
||||
REGISTER_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/auth/register" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"username": "test_endpoints",
|
||||
"email": "test_endpoints@example.com",
|
||||
"password": "Test@1234",
|
||||
"full_name": "Test Endpoints User",
|
||||
"phone_number": "+7123456789"
|
||||
}')
|
||||
check_status "$REGISTER_RESPONSE" "/api/v1/auth/register"
|
||||
USER_ID=$(echo "$REGISTER_RESPONSE" | grep -o '"id":"[^"]*"' | cut -d'"' -f4)
|
||||
if [ -n "$USER_ID" ]; then
|
||||
echo -e " └─ Создан пользователь с ID: $USER_ID"
|
||||
else
|
||||
echo -e " └─ Не удалось получить ID пользователя"
|
||||
fi
|
||||
|
||||
# Авторизация
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/auth/login${NC}"
|
||||
LOGIN_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/auth/login" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"username": "test_endpoints",
|
||||
"password": "Test@1234"
|
||||
}')
|
||||
check_status "$LOGIN_RESPONSE" "/api/v1/auth/login"
|
||||
TOKEN=$(echo "$LOGIN_RESPONSE" | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4)
|
||||
|
||||
if [ -z "$TOKEN" ]; then
|
||||
echo -e "${RED}❌ Не удалось получить токен авторизации. Дальнейшие тесты невозможны.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Получение профиля пользователя
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/users/me${NC}"
|
||||
ME_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/users/me" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
check_status "$ME_RESPONSE" "/api/v1/users/me"
|
||||
|
||||
# Изменение пароля
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/users/me/change-password${NC}"
|
||||
PASSWORD_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/users/me/change-password" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"current_password": "Test@1234",
|
||||
"new_password": "Test@5678"
|
||||
}')
|
||||
check_status "$PASSWORD_RESPONSE" "/api/v1/users/me/change-password"
|
||||
|
||||
# Получение дашборда
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/users/dashboard${NC}"
|
||||
DASH_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/users/dashboard" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
check_status "$DASH_RESPONSE" "/api/v1/users/dashboard"
|
||||
|
||||
echo -e "\n${BLUE}==== Location Service Endpoints ====${NC}"
|
||||
|
||||
# Обновление местоположения
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/locations/update${NC}"
|
||||
LOCATION_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/locations/update" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"latitude": 55.7558,
|
||||
"longitude": 37.6173,
|
||||
"accuracy": 5.0
|
||||
}')
|
||||
check_status "$LOCATION_RESPONSE" "/api/v1/locations/update"
|
||||
|
||||
# Получение последнего местоположения
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/locations/last${NC}"
|
||||
LAST_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/locations/last" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
check_status "$LAST_RESPONSE" "/api/v1/locations/last"
|
||||
|
||||
# История местоположений
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/locations/history${NC}"
|
||||
HISTORY_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/locations/history" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
check_status "$HISTORY_RESPONSE" "/api/v1/locations/history"
|
||||
|
||||
echo -e "\n${BLUE}==== Emergency Service Endpoints ====${NC}"
|
||||
|
||||
# Создание тревожного оповещения
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/emergency/alerts${NC}"
|
||||
ALERT_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/emergency/alerts" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"latitude": 55.7558,
|
||||
"longitude": 37.6173,
|
||||
"alert_type": "SOS",
|
||||
"message": "Endpoint test alert"
|
||||
}')
|
||||
check_status "$ALERT_RESPONSE" "/api/v1/emergency/alerts POST"
|
||||
ALERT_ID=$(echo "$ALERT_RESPONSE" | grep -o '"id":"[^"]*"' | cut -d'"' -f4)
|
||||
|
||||
# Получение своих оповещений
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/emergency/alerts/my${NC}"
|
||||
MY_ALERTS_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/emergency/alerts/my" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
check_status "$MY_ALERTS_RESPONSE" "/api/v1/emergency/alerts/my"
|
||||
|
||||
# Отмена тревожного оповещения
|
||||
if [ -n "$ALERT_ID" ]; then
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/emergency/alerts/$ALERT_ID/cancel${NC}"
|
||||
CANCEL_RESPONSE=$(curl -s -X PATCH "$GATEWAY_URL/api/v1/emergency/alerts/$ALERT_ID/cancel" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{"reason": "Test completed"}')
|
||||
check_status "$CANCEL_RESPONSE" "/api/v1/emergency/alerts/$ALERT_ID/cancel"
|
||||
fi
|
||||
|
||||
echo -e "\n${BLUE}==== Calendar Service Endpoints ====${NC}"
|
||||
|
||||
# Получение записей календаря
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/calendar/entries${NC}"
|
||||
ENTRIES_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/calendar/entries" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
check_status "$ENTRIES_RESPONSE" "/api/v1/calendar/entries GET"
|
||||
|
||||
# Создание записи календаря
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/calendar/entries POST${NC}"
|
||||
ENTRY_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/calendar/entries" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"date": "2025-09-25",
|
||||
"mood": "good",
|
||||
"symptoms": ["headache", "fatigue"],
|
||||
"notes": "Test entry"
|
||||
}')
|
||||
check_status "$ENTRY_RESPONSE" "/api/v1/calendar/entries POST"
|
||||
ENTRY_ID=$(echo "$ENTRY_RESPONSE" | grep -o '"id":"[^"]*"' | cut -d'"' -f4)
|
||||
if [ -n "$ENTRY_ID" ]; then
|
||||
echo -e " └─ Создана запись календаря с ID: $ENTRY_ID"
|
||||
else
|
||||
echo -e " └─ Не удалось получить ID записи календаря"
|
||||
fi
|
||||
|
||||
# Получение обзора цикла
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/calendar/cycle-overview${NC}"
|
||||
CYCLE_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/calendar/cycle-overview" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
check_status "$CYCLE_RESPONSE" "/api/v1/calendar/cycle-overview"
|
||||
|
||||
# Получение настроек календаря
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/calendar/settings${NC}"
|
||||
SETTINGS_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/calendar/settings" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
check_status "$SETTINGS_RESPONSE" "/api/v1/calendar/settings"
|
||||
|
||||
echo -e "\n${BLUE}==== Notification Service Endpoints ====${NC}"
|
||||
|
||||
# Регистрация устройства
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/notifications/devices${NC}"
|
||||
DEVICE_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/notifications/devices" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"device_token": "test-device-token-endpoint-test",
|
||||
"device_type": "android",
|
||||
"device_name": "Test Device"
|
||||
}')
|
||||
check_status "$DEVICE_RESPONSE" "/api/v1/notifications/devices POST"
|
||||
DEVICE_ID=$(echo "$DEVICE_RESPONSE" | grep -o '"id":"[^"]*"' | cut -d'"' -f4)
|
||||
if [ -n "$DEVICE_ID" ]; then
|
||||
echo -e " └─ Зарегистрировано устройство с ID: $DEVICE_ID"
|
||||
else
|
||||
echo -e " └─ Не удалось получить ID устройства"
|
||||
fi
|
||||
|
||||
# Получение устройств
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/notifications/devices GET${NC}"
|
||||
DEVICES_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/notifications/devices" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
check_status "$DEVICES_RESPONSE" "/api/v1/notifications/devices GET"
|
||||
|
||||
# Тестовое уведомление
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/notifications/test${NC}"
|
||||
TEST_RESPONSE=$(curl -s -X POST "$GATEWAY_URL/api/v1/notifications/test" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-d '{
|
||||
"title": "Test Notification",
|
||||
"body": "This is a test notification"
|
||||
}')
|
||||
check_status "$TEST_RESPONSE" "/api/v1/notifications/test"
|
||||
|
||||
# История уведомлений
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/notifications/history${NC}"
|
||||
HISTORY_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/notifications/history" \
|
||||
-H "Authorization: Bearer $TOKEN")
|
||||
check_status "$HISTORY_RESPONSE" "/api/v1/notifications/history"
|
||||
|
||||
echo -e "\n${BLUE}==== Проверка общей доступности сервисов ====${NC}"
|
||||
|
||||
# Получение статуса всех сервисов
|
||||
echo -e "${YELLOW}→ Тестирование /api/v1/services-status${NC}"
|
||||
STATUS_RESPONSE=$(curl -s -X GET "$GATEWAY_URL/api/v1/services-status")
|
||||
check_status "$STATUS_RESPONSE" "/api/v1/services-status"
|
||||
|
||||
echo -e "\n${GREEN}✅ Тестирование эндпоинтов завершено${NC}"
|
||||
Reference in New Issue
Block a user