All checks were successful
continuous-integration/drone/push Build is passing
184 lines
7.0 KiB
Python
184 lines
7.0 KiB
Python
#!/usr/bin/env python
|
||
|
||
import json
|
||
import sys
|
||
import asyncio
|
||
import uvicorn
|
||
from fastapi import FastAPI, Depends, HTTPException
|
||
from datetime import date
|
||
from typing import Dict, Optional, List
|
||
from pydantic import BaseModel
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
||
# Импортируем необходимые модули из календарного сервиса
|
||
from services.calendar_service.schemas import (
|
||
EntryType, FlowIntensity, MoodType, CalendarEntryCreate, CalendarEntryResponse
|
||
)
|
||
from services.calendar_service.mobile_endpoint import MobileCalendarEntryCreate
|
||
from shared.database import get_db
|
||
|
||
# Создаем тестовое приложение
|
||
app = FastAPI(title="Test Mobile Endpoint")
|
||
|
||
@app.get("/health")
|
||
async def health_check():
|
||
"""Health check endpoint"""
|
||
return {"status": "healthy", "service": "test_mobile_endpoint"}
|
||
|
||
@app.post("/debug/mobile-entry", status_code=201)
|
||
async def test_mobile_endpoint(
|
||
mobile_entry: MobileCalendarEntryCreate,
|
||
db: AsyncSession = Depends(get_db),
|
||
):
|
||
"""Test mobile endpoint without authentication"""
|
||
|
||
# Преобразуем симптомы из списка в строку
|
||
symptoms_str = ""
|
||
if mobile_entry.symptoms:
|
||
symptoms_str = ", ".join(mobile_entry.symptoms)
|
||
|
||
# Преобразуем данные из мобильного формата в формат сервера
|
||
entry_type = EntryType.PERIOD
|
||
if mobile_entry.type == "MENSTRUATION":
|
||
entry_type = EntryType.PERIOD
|
||
elif mobile_entry.type == "OVULATION":
|
||
entry_type = EntryType.OVULATION
|
||
else:
|
||
entry_type = EntryType.SYMPTOMS
|
||
|
||
# Преобразуем интенсивность потока
|
||
flow_intensity = None
|
||
if mobile_entry.flow_intensity is not None:
|
||
if mobile_entry.flow_intensity <= 1:
|
||
flow_intensity = FlowIntensity.SPOTTING
|
||
elif mobile_entry.flow_intensity <= 2:
|
||
flow_intensity = FlowIntensity.LIGHT
|
||
elif mobile_entry.flow_intensity <= 4:
|
||
flow_intensity = FlowIntensity.MEDIUM
|
||
else:
|
||
flow_intensity = FlowIntensity.HEAVY
|
||
|
||
# Преобразуем настроение
|
||
mood = None
|
||
if mobile_entry.mood:
|
||
if mobile_entry.mood == "HAPPY":
|
||
mood = MoodType.HAPPY
|
||
elif mobile_entry.mood == "SAD":
|
||
mood = MoodType.SAD
|
||
elif mobile_entry.mood == "NORMAL":
|
||
mood = MoodType.HAPPY # NORMAL мапится на HAPPY
|
||
elif mobile_entry.mood == "ANXIOUS":
|
||
mood = MoodType.ANXIOUS
|
||
elif mobile_entry.mood == "IRRITATED":
|
||
mood = MoodType.IRRITATED
|
||
elif mobile_entry.mood == "ENERGETIC":
|
||
mood = MoodType.ENERGETIC
|
||
elif mobile_entry.mood == "TIRED":
|
||
mood = MoodType.TIRED
|
||
|
||
# Создаем объект CalendarEntryResponse для возврата
|
||
response = {
|
||
"id": 1,
|
||
"user_id": 1,
|
||
"entry_date": mobile_entry.date.isoformat(),
|
||
"entry_type": entry_type.value,
|
||
"flow_intensity": flow_intensity.value if flow_intensity else None,
|
||
"period_symptoms": "",
|
||
"mood": mood.value if mood else None,
|
||
"energy_level": 1, # Минимальное значение должно быть 1
|
||
"sleep_hours": 0,
|
||
"symptoms": symptoms_str,
|
||
"medications": "",
|
||
"notes": mobile_entry.notes or "",
|
||
"created_at": date.today().isoformat(),
|
||
"updated_at": date.today().isoformat(),
|
||
}
|
||
|
||
return response
|
||
|
||
# Функция для отправки тестового запроса
|
||
async def send_test_request():
|
||
"""Отправка тестового запроса к эндпоинту"""
|
||
import httpx
|
||
|
||
# Данные в формате мобильного приложения
|
||
mobile_data = {
|
||
"date": date.today().isoformat(),
|
||
"type": "MENSTRUATION",
|
||
"flow_intensity": 3, # средний (1-5)
|
||
"symptoms": ["CRAMPS", "HEADACHE"], # массив строк
|
||
"mood": "NORMAL",
|
||
"notes": "Тестовая запись из мобильного приложения"
|
||
}
|
||
|
||
print(f"Отправляемые данные: {json.dumps(mobile_data, indent=2)}")
|
||
|
||
# Подождем, пока сервис запустится
|
||
await asyncio.sleep(2)
|
||
|
||
async with httpx.AsyncClient() as client:
|
||
try:
|
||
# Проверяем работоспособность сервиса
|
||
health_response = await client.get("http://localhost:8080/health")
|
||
print(f"Проверка работоспособности: {health_response.status_code}")
|
||
print(f"Ответ сервиса: {health_response.text}")
|
||
|
||
# Отправляем запрос к тестовому эндпоинту
|
||
response = await client.post(
|
||
"http://localhost:8080/debug/mobile-entry",
|
||
json=mobile_data
|
||
)
|
||
|
||
print(f"Статус ответа: {response.status_code}")
|
||
|
||
if response.status_code >= 200 and response.status_code < 300:
|
||
print(f"Тело успешного ответа: {json.dumps(response.json(), indent=2)}")
|
||
return True
|
||
else:
|
||
print("Ошибка при создании записи")
|
||
try:
|
||
print(f"Тело ответа с ошибкой: {json.dumps(response.json(), indent=2)}")
|
||
except:
|
||
print(f"Тело ответа не является JSON: {response.text}")
|
||
return False
|
||
|
||
except Exception as e:
|
||
print(f"Ошибка при выполнении запроса: {e}")
|
||
return False
|
||
|
||
# Основная функция
|
||
async def main():
|
||
# Запускаем сервер в отдельном процессе
|
||
config = uvicorn.Config(app, host="0.0.0.0", port=8080, log_level="info")
|
||
server = uvicorn.Server(config)
|
||
|
||
# Создаем задачу для запуска сервера
|
||
server_task = asyncio.create_task(server.serve())
|
||
|
||
# Дадим серверу немного времени на запуск
|
||
await asyncio.sleep(1)
|
||
|
||
try:
|
||
# Отправляем тестовый запрос
|
||
result = await send_test_request()
|
||
|
||
if result:
|
||
print("Тест успешно завершен!")
|
||
return 0
|
||
else:
|
||
print("Тест завершился с ошибкой.")
|
||
return 1
|
||
finally:
|
||
# Останавливаем сервер
|
||
server.should_exit = True
|
||
await server_task
|
||
|
||
if __name__ == "__main__":
|
||
# Запускаем асинхронную функцию main()
|
||
import asyncio
|
||
try:
|
||
exit_code = asyncio.run(main())
|
||
sys.exit(exit_code)
|
||
except KeyboardInterrupt:
|
||
print("Выполнение прервано")
|
||
sys.exit(1) |