#!/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)