/
aastray
/
StudentPart
Обзор
Документация
Войти
/
aastray
/
StudentPart
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
service/test/test_forms.py
307 строк
12 KB
aastray
Реализован функционал загрузки файлов и просмотра документов, удалены базовые эндпоинты, обновлена документация
10 янв 2026, 15:38
10 янв 2026, 15:38
4d47c55
Код
Авторство
О чём код?
""" Тесты для функции get_form() Для запуска в терминале: python -m pytest .\tests\test_forms.py """ import sys import os import pytest import json from unittest.mock import patch, Mock from fastapi import HTTPException # Добавляем путь для импорта (теперь путь другой) sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) class TestGetForm: """Тесты функции get_form()""" def test_valid_url_first_endpoint(self): """ Тест 1: Валидный URL "https://FirstEndpoint" Проверяем корректный возврат SQLField """ print("\n=== Тест 1: Валидный URL (FirstEndpoint) ===") from src.services.forms import get_form # Вызываем функцию с валидным URL result = get_form("https://FirstEndpoint") print(f"Результат: {result}") # Проверяем что результат - строка (JSON) assert isinstance(result, str), "Должна возвращаться строка JSON" # Парсим JSON для проверки структуры try: data = json.loads(result) print(f"Парсинг JSON: {data}") # Проверяем обязательные поля assert "title" in data, "Должно быть поле title" assert "nameDB" in data, "Должно быть поле nameDB" assert "request" in data, "Должно быть поле request" # Проверяем значения полей assert data["title"] == "SQL запрос" assert data["nameDB"] == "Имя базы данных" assert data["request"] == "SQL запрос" print("✅ Корректный JSON для FirstEndpoint") except json.JSONDecodeError as e: pytest.fail(f"Некорректный JSON: {e}") def test_invalid_url(self): """ Тест 2: Невалидный URL Проверяем что функция выбрасывает HTTPException """ print("\n=== Тест 2: Невалидный URL ===") from src.services.forms import get_form # Тест 2.1: Совсем другой URL print("\n2.1: Совсем другой URL") try: result = get_form("https://invalid-endpoint.com") print(f"Результат: {result}") # Если функция не бросила исключение, проверяем что это HTTPException if isinstance(result, HTTPException): assert result.status_code == 500 assert "Недействительный URL" in str(result.detail) print("✅ Возвращен HTTPException с кодом 500") else: pytest.fail("Ожидалось HTTPException для невалидного URL") except HTTPException as e: # Это тоже нормально - функция может бросать исключение assert e.status_code == 500 assert "Недействительный URL" in str(e.detail) print(f"✅ Выброшен HTTPException: {e.detail}") # Тест 2.2: Пустая строка print("\n2.2: Пустая строка") try: result = get_form("") print(f"Результат: {result}") if isinstance(result, HTTPException): assert result.status_code == 500 print("✅ Пустая строка обрабатывается") except HTTPException as e: assert e.status_code == 500 print(f"✅ Пустая строка вызывает исключение") def test_case_sensitivity(self): """ Тест 3: Проверка чувствительности к регистру """ print("\n=== Тест 3: Чувствительность к регистру ===") from src.services.forms import get_form # Тест 3.1: Другой регистр (должен быть невалидным) print("\n3.1: Другой регистр (https://firstendpoint)") try: result = get_form("https://firstendpoint") # строчные буквы print(f"Результат: {result}") if isinstance(result, HTTPException): assert result.status_code == 500 print("✅ Регистр имеет значение") else: # Если все равно вернул данные - значит не чувствителен к регистру print("⚠️ Функция не чувствительна к регистру") except HTTPException as e: assert e.status_code == 500 print("✅ Чувствительность к регистру подтверждена") # Тест 3.2: С пробелами print("\n3.2: URL с пробелами") try: result = get_form(" https://FirstEndpoint ") print(f"Результат: {result}") if isinstance(result, HTTPException): print("✅ Пробелы имеют значение") else: print("⚠️ Функция игнорирует пробелы") except HTTPException as e: assert e.status_code == 500 print("✅ Пробелы учитываются") def test_json_structure(self): """ Тест 4: Проверка структуры JSON """ print("\n=== Тест 4: Структура JSON ===") from src.services.forms import get_form from src.schemas import SQLField # Получаем JSON для FirstEndpoint result = get_form("https://FirstEndpoint") data = json.loads(result) print(f"JSON структура: {data}") # Проверяем что JSON соответствует модели SQLField # Создаем объект из JSON для проверки валидации try: # Пробуем создать SQLField из данных sql_field = SQLField(**data) # Проверяем атрибуты assert sql_field.title == "SQL запрос" assert sql_field.nameDB == "Имя базы данных" assert sql_field.request == "SQL запрос" print("✅ JSON соответствует модели SQLField") print(f" Объект SQLField: {sql_field}") except Exception as e: pytest.fail(f"JSON не соответствует модели SQLField: {e}") def test_multiple_valid_urls(self): """ Тест 5: Проверка обработки нескольких URL (если бы их было больше в match/case) """ print("\n=== Тест 5: Проверка нескольких URL ===") from src.services.forms import get_form # Пока у нас только один валидный URL valid_urls = ["https://FirstEndpoint"] for url in valid_urls: print(f"\nТестируем URL: {url}") result = get_form(url) assert isinstance(result, str) data = json.loads(result) # Общие проверки для всех валидных URL assert "title" in data assert isinstance(data["title"], str) print(f"✅ URL '{url}' работает корректно") def test_edge_cases(self): """ Тест 6: Граничные случаи """ print("\n=== Тест 6: Граничные случаи ===") from src.services.forms import get_form test_cases = [ ("None значение", None, True), ("Спецсимволы", "https://FirstEndpoint#fragment", True), ("С параметрами", "https://FirstEndpoint?param=value", True), ("Только протокол", "https://", True), ("Без протокола", "FirstEndpoint", True), ] for description, url, should_fail in test_cases: print(f"\n{description}: {url}") try: # Для None нужно обработать отдельно if url is None: result = get_form(url) else: result = get_form(url) print(f" Результат: {result[:50]}..." if result else " Результат: None") if isinstance(result, HTTPException): print(f" ✅ Ожидаемая ошибка для {description}") elif should_fail: print(f" ⚠️ Неожиданный успех для {description}") else: print(f" ✅ Успех для {description}") except TypeError as e: # Ожидаемо для None if url is None: print(f" ✅ TypeError при None: {e}") else: print(f" ⚠️ Неожиданная ошибка: {e}") except HTTPException as e: print(f" ✅ HTTPException: {e.detail}") except Exception as e: print(f" ⚠️ Другая ошибка: {type(e).__name__}: {e}") def run_all_tests(): """Запуск всех тестов""" print("=" * 70) print("ТЕСТИРОВАНИЕ ФУНКЦИИ get_form()") print("=" * 70) tester = TestGetForm() tests = [ ("Валидный URL", tester.test_valid_url_first_endpoint), ("Невалидный URL", tester.test_invalid_url), ("Чувствительность к регистру", tester.test_case_sensitivity), ("Структура JSON", tester.test_json_structure), ("Несколько URL", tester.test_multiple_valid_urls), ("Граничные случаи", tester.test_edge_cases), ] results = [] for test_name, test_func in tests: print(f"\n▶ Запуск теста: {test_name}") print("-" * 50) try: test_func() results.append((test_name, True)) print(f"✅ ПРОЙДЕН") except AssertionError as e: print(f"❌ AssertionError: {e}") results.append((test_name, False)) except Exception as e: print(f"❌ Ошибка: {e}") import traceback traceback.print_exc() results.append((test_name, False)) # Итоги print("\n" + "=" * 70) print("ИТОГИ ТЕСТИРОВАНИЯ:") print("=" * 70) passed = sum(1 for _, success in results if success) total = len(results) for test_name, success in results: status = "✅ ПРОЙДЕН" if success else "❌ НЕ ПРОЙДЕН" print(f"{test_name:30} {status}") print(f"\nВсего тестов: {total}") print(f"Пройдено успешно: {passed}") print(f"Успешность: {passed/total*100:.1f}%" if total > 0 else "0%") return passed == total if __name__ == "__main__": success = run_all_tests() if success: print("\n" + "🎉" * 30) print("ВСЕ ТЕСТЫ УСПЕШНО ПРОЙДЕНЫ!") print("🎉" * 30) sys.exit(0) else: print("\n" + "⚠️" * 30) print("ЕСТЬ НЕПРОЙДЕННЫЕ ТЕСТЫ") print("⚠️" * 30) sys.exit(1)