#!/usr/bin/env python3 import requests import json import sys import logging from datetime import datetime, date, timedelta from enum import Enum # Настройка логирования logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) # Порты сервисов CALENDAR_SERVICE_PORT = 8004 # Порт основного сервиса SIMPLIFIED_SERVICE_PORT = 8888 # Порт упрощенного сервиса # Мобильные типы записей class MobileEntryType(str, Enum): MENSTRUATION = "MENSTRUATION" OVULATION = "OVULATION" SPOTTING = "SPOTTING" DISCHARGE = "DISCHARGE" PAIN = "PAIN" MOOD = "MOOD" # Мобильные типы настроения class MobileMood(str, Enum): HAPPY = "HAPPY" SAD = "SAD" ANXIOUS = "ANXIOUS" IRRITABLE = "IRRITABLE" ENERGETIC = "ENERGETIC" TIRED = "TIRED" NORMAL = "NORMAL" # Мобильные типы симптомов class MobileSymptom(str, Enum): CRAMPS = "CRAMPS" HEADACHE = "HEADACHE" BLOATING = "BLOATING" FATIGUE = "FATIGUE" NAUSEA = "NAUSEA" BREAST_TENDERNESS = "BREAST_TENDERNESS" ACNE = "ACNE" BACKACHE = "BACKACHE" def test_calendar_apis(): # Принудительно используем упрощенный сервис на порту 8888 service_port = SIMPLIFIED_SERVICE_PORT base_url = f"http://localhost:{service_port}" logger.info(f"Используем упрощенный сервис на порту {service_port}") # Для упрощенного сервиса авторизация не требуется headers = { "Content-Type": "application/json" } # 1. Тест стандартного формата на /api/v1/calendar/entries standard_entry = { "entry_date": (date.today() + timedelta(days=1)).isoformat(), "entry_type": "period", "flow_intensity": "medium", "notes": f"Стандартный тест {datetime.now().isoformat()}", "period_symptoms": "cramps", "energy_level": 3, "sleep_hours": 7, "medications": "", "symptoms": "headache" } standard_response = test_endpoint( url=f"{base_url}/api/v1/calendar/entries", method="POST", data=standard_entry, headers=headers, description="Стандартный формат - /api/v1/calendar/entries" ) # 5. Проверка списка записей get_entries_response = test_endpoint( url=f"{base_url}/api/v1/calendar/entries", method="GET", headers=headers, description="Получение списка записей" ) if get_entries_response and get_entries_response.status_code == 200: entries = get_entries_response.json() logger.info(f"Всего записей в календаре: {len(entries)}") for i, entry in enumerate(entries[-5:]): # Показываем последние 5 записей logger.info(f"Запись {i+1}: ID={entry.get('id')}, Дата={entry.get('entry_date')}, Тип={entry.get('entry_type')}") # Подсчитываем успешные тесты success_count = sum(1 for test in [standard_response, get_entries_response] if test and test.status_code in [200, 201]) expected_success = 2 if success_count >= expected_success: logger.info(f"✅ Успешно пройдено {success_count}/{expected_success} тестов с упрощенным сервисом!") return 0 else: logger.error(f"❌ Пройдено только {success_count}/{expected_success} тестов") return 1 def test_endpoint(url, method, headers, description, data=None, expected_status=None): """Выполняет тест для конкретного эндпоинта""" logger.info(f"\nТестирование: {description}") logger.info(f"URL: {url}, Метод: {method}") if data: logger.info(f"Данные: {json.dumps(data, indent=2)}") try: if method.upper() == "GET": response = requests.get(url, headers=headers, timeout=5) elif method.upper() == "POST": response = requests.post(url, headers=headers, json=data, timeout=5) else: logger.error(f"Неподдерживаемый метод: {method}") return None logger.info(f"Статус ответа: {response.status_code}") # Проверяем ожидаемый статус, если указан if expected_status and response.status_code != expected_status: logger.warning(f"Получен статус {response.status_code}, ожидался {expected_status}") logger.warning(f"Ответ: {response.text}") return response # Для успешных ответов логируем детали if response.status_code in [200, 201]: logger.info("✅ Тест успешно пройден!") try: response_data = response.json() if isinstance(response_data, dict): logger.debug(f"Ответ: ID={response_data.get('id')}, Тип={response_data.get('entry_type')}") elif isinstance(response_data, list): logger.debug(f"Получен список с {len(response_data)} элементами") except ValueError: logger.debug(f"Ответ не в формате JSON: {response.text[:100]}...") else: logger.warning(f"❌ Тест не пройден. Статус: {response.status_code}") logger.warning(f"Ответ: {response.text}") return response except requests.exceptions.RequestException as e: logger.error(f"❌ Ошибка при выполнении запроса: {str(e)}") return None if __name__ == "__main__": sys.exit(test_calendar_apis())