""" E2E тест удаления существующего сообщества через API с тестовой БД """ import pytest import requests import json import time @pytest.mark.e2e @pytest.mark.api def test_delete_existing_community_e2e(api_base_url, auth_headers, test_user_credentials, create_test_users_in_backend_db): """E2E тест удаления существующего сообщества через API с тестовой БД""" print("🚀 Начинаем E2E тест удаления сообщества через API с тестовой БД") # 1. Авторизуемся через API login_mutation = """ mutation Login($email: String!, $password: String!) { login(email: $email, password: $password) { success token author { id name email } error } } """ print("🔐 Авторизуемся через GraphQL API...") try: response = requests.post( api_base_url, json={"query": login_mutation, "variables": test_user_credentials}, headers=auth_headers(), timeout=10 ) response.raise_for_status() except requests.exceptions.RequestException as e: pytest.skip(f"Сервер недоступен: {e}") login_data = response.json() print(f"🔍 Ответ сервера: {json.dumps(login_data, indent=2)}") if "errors" in login_data: print(f"❌ Ошибки в авторизации: {login_data['errors']}") pytest.fail(f"Ошибки в авторизации: {login_data['errors']}") if "data" not in login_data or "login" not in login_data["data"]: print(f"❌ Неожиданная структура ответа: {login_data}") pytest.fail(f"Неожиданная структура ответа: {login_data}") # Проверяем, что авторизация прошла успешно login_result = login_data["data"]["login"] if not login_result.get("success"): error = login_result.get("error") if error: print(f"❌ Ошибка авторизации: {error}") else: print("❌ Авторизация не прошла - поле success = false") pytest.skip("Авторизация не прошла") token = login_result.get("token") author_id = login_result.get("author", {}).get("id") if not token or not author_id: print("❌ Токен или ID автора не получены") print(f" Токен: {'✅' if token else '❌'}") print(f" ID автора: {'✅' if author_id else '❌'}") pytest.skip("Не удалось получить токен или ID автора") print(f"✅ Авторизация успешна!") print(f"🔑 Токен получен: {token[:50]}...") print(f"👤 ID автора: {author_id}") # 2. Создаем тестовое сообщество для удаления headers = auth_headers(token) create_mutation = """ mutation CreateCommunity($input: CommunityInput!) { create_community(community_input: $input) { success error } } """ create_variables = { "input": { "name": "Test Community for Deletion", "slug": "test-delete-community", "desc": "Community to be deleted in test" } } create_response = requests.post( api_base_url, json={"query": create_mutation, "variables": create_variables}, headers=headers, timeout=10 ) test_community_slug = "test-delete-community" if create_response.status_code == 200: create_data = create_response.json() if create_data.get("data", {}).get("create_community", {}).get("success"): print(f"✅ Тестовое сообщество {test_community_slug} создано") else: print(f"⚠️ Не удалось создать сообщество: {create_data}") # 3. Пытаемся удалить тестовое сообщество через API delete_mutation = """ mutation DeleteCommunity($slug: String!) { delete_community(slug: $slug) { success error } } """ delete_variables = {"slug": test_community_slug} print(f"\n🗑️ Пытаемся удалить сообщество {test_community_slug} через API...") print(f"🔗 URL: {api_base_url}") print(f"🔑 Заголовки: {headers}") try: response = requests.post( api_base_url, json={"query": delete_mutation, "variables": delete_variables}, headers=headers, timeout=10 ) response.raise_for_status() except requests.exceptions.RequestException as e: pytest.fail(f"Ошибка HTTP запроса: {e}") print(f"📊 Статус ответа: {response.status_code}") print(f"📄 Ответ: {response.text}") if response.status_code == 200: data = response.json() print(f"📋 JSON ответ: {json.dumps(data, indent=2)}") if "errors" in data: print(f"❌ GraphQL ошибки: {data['errors']}") # Это может быть нормально - у пользователя может не быть прав print("💡 GraphQL ошибки могут указывать на отсутствие прав доступа") if "data" in data and "delete_community" in data["data"]: result = data["data"]["delete_community"] print(f"✅ Результат удаления: {result}") if result.get("success"): print("✅ Сообщество успешно удалено через API") else: error = result.get("error", "Неизвестная ошибка") print(f"⚠️ Сообщество не удалено: {error}") # Проверяем, что это ошибка прав доступа (что нормально) if "permission" in error.lower() or "access" in error.lower() or "denied" in error.lower(): print("✅ Ошибка прав доступа - это ожидаемо для обычного пользователя") else: print("⚠️ Неожиданная ошибка при удалении") else: print(f"⚠️ Неожиданная структура ответа: {data}") else: print(f"❌ HTTP ошибка: {response.status_code}") pytest.fail(f"HTTP ошибка: {response.status_code}") # 3. Проверяем что сообщество все еще существует (так как удаление не удалось) print("\n🔍 Проверяем что сообщество все еще существует...") try: # Проверяем через API check_query = """ query GetCommunity($slug: String!) { get_community(slug: $slug) { id name slug desc } } """ check_response = requests.post( api_base_url, json={"query": check_query, "variables": {"slug": test_community_slug}}, headers=headers, timeout=10 ) if check_response.status_code == 200: check_data = check_response.json() if "data" in check_data and "get_community" in check_data["data"]: community = check_data["data"]["get_community"] if community: print("✅ Сообщество все еще доступно через API (как и должно быть)") else: print("❌ Сообщество не найдено через API") else: print("⚠️ Неожиданная структура ответа при проверке") else: print(f"⚠️ HTTP ошибка при проверке: {check_response.status_code}") except Exception as e: print(f"⚠️ Ошибка при проверке через API: {e}") print("🎉 E2E тест удаления сообщества через API с тестовой БД завершен успешно") @pytest.mark.e2e @pytest.mark.api def test_admin_delete_community_e2e(api_base_url, auth_headers, test_user_credentials, create_test_users_in_backend_db): """E2E тест удаления сообщества администратором через API с тестовой БД""" print("🚀 Начинаем E2E тест удаления сообщества администратором через API") # 1. Авторизуемся через API login_mutation = """ mutation Login($email: String!, $password: String!) { login(email: $email, password: $password) { success token author { id name email } error } } """ print("🔐 Авторизуемся через GraphQL API...") try: response = requests.post( api_base_url, json={"query": login_mutation, "variables": test_user_credentials}, headers=auth_headers(), timeout=10 ) response.raise_for_status() except requests.exceptions.RequestException as e: pytest.skip(f"Сервер недоступен: {e}") login_data = response.json() login_result = login_data["data"]["login"] if not login_result.get("success"): pytest.skip("Авторизация не прошла") token = login_result.get("token") author_id = login_result.get("author", {}).get("id") if not token or not author_id: pytest.skip("Не удалось получить токен или ID автора") print(f"✅ Авторизация успешна для пользователя {author_id}") headers = auth_headers(token) # 2. Создаем тестовое сообщество для удаления create_mutation = """ mutation CreateCommunity($input: CommunityInput!) { create_community(community_input: $input) { success error } } """ create_variables = { "input": { "name": "Test Community for Admin Deletion", "slug": "test-admin-delete-community", "desc": "Community to be deleted by admin in test" } } create_response = requests.post( api_base_url, json={"query": create_mutation, "variables": create_variables}, headers=headers, timeout=10 ) test_community_slug = "test-admin-delete-community" if create_response.status_code == 200: create_data = create_response.json() if create_data.get("data", {}).get("create_community", {}).get("success"): print(f"✅ Тестовое сообщество {test_community_slug} создано") else: print(f"⚠️ Не удалось создать сообщество: {create_data}") # 3. Проверяем роли пользователя через API print("👥 Проверяем роли пользователя через API...") roles_query = """ query GetUserRoles($communityId: Int!, $userId: Int!) { get_user_roles_in_community(community_id: $communityId, user_id: $userId) { roles permissions } } """ try: roles_response = requests.post( api_base_url, json={"query": roles_query, "variables": {"communityId": 1, "userId": int(author_id)}}, # Используем основное сообщество для проверки ролей headers=headers, timeout=10 ) if roles_response.status_code == 200: roles_data = roles_response.json() print(f"📋 Роли пользователя: {json.dumps(roles_data, indent=2)}") if "data" in roles_data and "get_user_roles_in_community" in roles_data["data"]: user_roles = roles_data["data"]["get_user_roles_in_community"] print(f"✅ Роли получены: {user_roles}") else: print("⚠️ Роли не получены через API") else: print(f"⚠️ HTTP ошибка при получении ролей: {roles_response.status_code}") except Exception as e: print(f"⚠️ Ошибка при получении ролей: {e}") # 3. Пытаемся удалить сообщество через API print("🗑️ Пытаемся удалить сообщество через API...") delete_mutation = """ mutation DeleteCommunity($slug: String!) { delete_community(slug: $slug) { success error } } """ delete_variables = {"slug": test_community_slug} try: response = requests.post( api_base_url, json={"query": delete_mutation, "variables": delete_variables}, headers=headers, timeout=10 ) response.raise_for_status() except requests.exceptions.RequestException as e: pytest.fail(f"Ошибка HTTP запроса: {e}") print(f"📊 Статус ответа: {response.status_code}") print(f"📄 Ответ: {response.text}") if response.status_code == 200: data = response.json() print(f"📋 JSON ответ: {json.dumps(data, indent=2)}") if "data" in data and "delete_community" in data["data"]: result = data["data"]["delete_community"] print(f"✅ Результат удаления: {result}") if result.get("success"): print("✅ Сообщество успешно удалено через API") else: error = result.get("error", "Неизвестная ошибка") print(f"⚠️ Сообщество не удалено: {error}") # Проверяем, что это ошибка прав доступа (что нормально) if "permission" in error.lower() or "access" in error.lower() or "denied" in error.lower(): print("✅ Ошибка прав доступа - это ожидаемо для обычного пользователя") else: print("⚠️ Неожиданная ошибка при удалении") else: print(f"⚠️ Неожиданная структура ответа: {data}") else: print(f"❌ HTTP ошибка: {response.status_code}") pytest.fail(f"HTTP ошибка: {response.status_code}") # 4. Проверяем что сообщество все еще существует print("\n🔍 Проверяем что сообщество все еще существует...") try: check_query = """ query GetCommunity($slug: String!) { get_community(slug: $slug) { id name slug desc } } """ check_response = requests.post( api_base_url, json={"query": check_query, "variables": {"slug": test_community_slug}}, headers=headers, timeout=10 ) if check_response.status_code == 200: check_data = check_response.json() if "data" in check_data and "get_community" in check_data["data"]: community = check_data["data"]["get_community"] if community: print("✅ Сообщество все еще доступно через API (как и должно быть)") else: print("❌ Сообщество не найдено через API") else: print("⚠️ Неожиданная структура ответа при проверке") else: print(f"⚠️ HTTP ошибка при проверке: {check_response.status_code}") except Exception as e: print(f"⚠️ Ошибка при проверке через API: {e}") print("🎉 E2E тест удаления сообщества администратором через API завершен успешно") if __name__ == "__main__": # Для запуска как скрипт pytest.main([__file__, "-v"])