Major fixes and new features
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-09-25 15:51:48 +09:00
parent dd7349bb4c
commit ddce9f5125
5586 changed files with 1470941 additions and 0 deletions

618
tests/full_api_test.sh Executable file
View 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
View 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
View 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
View 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
View 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
View 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}"