This commit is contained in:
157
tests/simplified_calendar_service_improved.py
Normal file
157
tests/simplified_calendar_service_improved.py
Normal file
@@ -0,0 +1,157 @@
|
||||
import sys
|
||||
import logging
|
||||
from typing import Dict, List, Optional
|
||||
from fastapi import FastAPI, Depends, HTTPException, Body, Path
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
# Настраиваем логирование
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Имитируем эндпоинты календарного сервиса для тестирования
|
||||
app = FastAPI(title="Simplified Calendar Service")
|
||||
|
||||
# Включаем CORS
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
# Упрощенная модель данных
|
||||
from enum import Enum
|
||||
from datetime import date, datetime
|
||||
from typing import List, Optional
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
# Модели для календарных записей
|
||||
class EntryType(str, Enum):
|
||||
PERIOD = "period"
|
||||
OVULATION = "ovulation"
|
||||
SYMPTOMS = "symptoms"
|
||||
MOOD = "mood"
|
||||
OTHER = "other"
|
||||
|
||||
class FlowIntensity(str, Enum):
|
||||
LIGHT = "light"
|
||||
MEDIUM = "medium"
|
||||
HEAVY = "heavy"
|
||||
|
||||
class CalendarEntry(BaseModel):
|
||||
id: int
|
||||
user_id: int = 1
|
||||
entry_date: date
|
||||
entry_type: str
|
||||
flow_intensity: Optional[str] = None
|
||||
period_symptoms: Optional[str] = None
|
||||
mood: Optional[str] = None
|
||||
energy_level: Optional[int] = None
|
||||
sleep_hours: Optional[float] = None
|
||||
symptoms: Optional[str] = None
|
||||
medications: Optional[str] = None
|
||||
notes: Optional[str] = None
|
||||
created_at: datetime = datetime.now()
|
||||
updated_at: Optional[datetime] = None
|
||||
|
||||
# Хранилище данных в памяти
|
||||
calendar_entries = []
|
||||
|
||||
# Вспомогательная функция для добавления тестовых данных
|
||||
def add_test_entries():
|
||||
if not calendar_entries:
|
||||
for i in range(1, 5):
|
||||
calendar_entries.append(
|
||||
CalendarEntry(
|
||||
id=i,
|
||||
entry_date=date(2025, 9, 30),
|
||||
entry_type="period",
|
||||
flow_intensity="medium",
|
||||
notes=f"Test entry {i}",
|
||||
)
|
||||
)
|
||||
|
||||
# Добавляем тестовые данные
|
||||
add_test_entries()
|
||||
|
||||
@app.get("/")
|
||||
def read_root():
|
||||
return {"message": "Simplified Calendar Service API"}
|
||||
|
||||
@app.get("/health")
|
||||
def health():
|
||||
return {"status": "ok"}
|
||||
|
||||
# API для работы с календарем
|
||||
@app.get("/api/v1/calendar/entries")
|
||||
def get_calendar_entries():
|
||||
"""Get all calendar entries"""
|
||||
return calendar_entries
|
||||
|
||||
@app.post("/api/v1/calendar/entries", status_code=201)
|
||||
def create_calendar_entry(entry: dict):
|
||||
"""Create a new calendar entry"""
|
||||
logger.debug(f"Received entry data: {entry}")
|
||||
|
||||
# Преобразуем строку даты в объект date
|
||||
entry_date_str = entry.get("entry_date")
|
||||
if entry_date_str and isinstance(entry_date_str, str):
|
||||
try:
|
||||
entry_date = date.fromisoformat(entry_date_str)
|
||||
except ValueError:
|
||||
entry_date = date.today()
|
||||
else:
|
||||
entry_date = date.today()
|
||||
|
||||
new_entry = CalendarEntry(
|
||||
id=len(calendar_entries) + 1,
|
||||
entry_date=entry_date,
|
||||
entry_type=entry.get("entry_type", "other"),
|
||||
flow_intensity=entry.get("flow_intensity"),
|
||||
period_symptoms=entry.get("period_symptoms"),
|
||||
mood=entry.get("mood"),
|
||||
energy_level=entry.get("energy_level"),
|
||||
sleep_hours=entry.get("sleep_hours"),
|
||||
symptoms=entry.get("symptoms"),
|
||||
medications=entry.get("medications"),
|
||||
notes=entry.get("notes"),
|
||||
)
|
||||
|
||||
calendar_entries.append(new_entry)
|
||||
return new_entry
|
||||
|
||||
# Добавляем поддержку для /api/v1/entry
|
||||
@app.post("/api/v1/entry", status_code=201)
|
||||
def create_entry_without_calendar_prefix(entry: dict):
|
||||
"""Create a new calendar entry via alternate endpoint (without /calendar/ prefix)"""
|
||||
logger.debug(f"Received entry data via /api/v1/entry: {entry}")
|
||||
return create_calendar_entry(entry)
|
||||
|
||||
# Добавляем поддержку для /api/v1/entries (legacy)
|
||||
@app.post("/api/v1/entries", status_code=201)
|
||||
def create_entry_legacy(entry: dict):
|
||||
"""Create a new calendar entry via legacy endpoint"""
|
||||
logger.debug(f"Received entry data via legacy endpoint: {entry}")
|
||||
return create_calendar_entry(entry)
|
||||
|
||||
# Добавляем поддержку для мобильного формата
|
||||
@app.post("/api/v1/calendar/entry", status_code=201)
|
||||
def create_mobile_calendar_entry(mobile_entry: dict):
|
||||
"""Create a new calendar entry from mobile app format"""
|
||||
logger.debug(f"Received mobile entry data: {mobile_entry}")
|
||||
|
||||
# Преобразуем мобильный формат в стандартный
|
||||
entry = {
|
||||
"entry_date": mobile_entry.get("date", date.today().isoformat()),
|
||||
"entry_type": mobile_entry.get("type", "OTHER").lower(),
|
||||
"flow_intensity": "medium" if mobile_entry.get("flow_intensity") in [3, 4] else "light",
|
||||
"notes": mobile_entry.get("notes"),
|
||||
"symptoms": ", ".join(mobile_entry.get("symptoms", [])) if isinstance(mobile_entry.get("symptoms"), list) else ""
|
||||
}
|
||||
|
||||
return create_calendar_entry(entry)
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run(app, host="0.0.0.0", port=8888)
|
||||
Reference in New Issue
Block a user