226 lines
10 KiB
Python
226 lines
10 KiB
Python
"""
|
||
Тесты для удаления сообщества через API (без браузера)
|
||
"""
|
||
|
||
import pytest
|
||
import requests
|
||
|
||
|
||
@pytest.mark.e2e
|
||
@pytest.mark.api
|
||
class TestCommunityDeleteE2EAPI:
|
||
"""Тесты удаления сообщества через API"""
|
||
|
||
def test_community_delete_api_workflow(self, api_base_url, auth_headers):
|
||
"""Тест полного workflow удаления сообщества через API"""
|
||
print("🚀 Начинаем тест удаления сообщества через API")
|
||
|
||
# Получаем заголовки авторизации
|
||
headers = auth_headers()
|
||
|
||
# Получаем информацию о тестовом сообществе
|
||
community_slug = "test-community-test-5c3f7f11" # Используем существующее сообщество
|
||
|
||
# 1. Проверяем что сообщество существует
|
||
print("1️⃣ Проверяем существование сообщества...")
|
||
try:
|
||
response = requests.post(
|
||
f"{api_base_url}",
|
||
json={
|
||
"query": """
|
||
query {
|
||
get_communities_all {
|
||
id
|
||
name
|
||
slug
|
||
desc
|
||
}
|
||
}
|
||
""",
|
||
"variables": {}
|
||
},
|
||
headers=headers,
|
||
timeout=10
|
||
)
|
||
response.raise_for_status()
|
||
|
||
data = response.json()
|
||
communities = data.get("data", {}).get("get_communities_all", [])
|
||
|
||
# Ищем наше тестовое сообщество
|
||
test_community = None
|
||
for community in communities:
|
||
if community.get("slug") == community_slug:
|
||
test_community = community
|
||
break
|
||
|
||
if test_community:
|
||
print("✅ Сообщество найдено в базе")
|
||
print(f" ID: {test_community['id']}, Название: {test_community['name']}")
|
||
else:
|
||
print("⚠️ Сообщество не найдено, создаем новое...")
|
||
# Создаем новое тестовое сообщество
|
||
create_response = requests.post(
|
||
f"{api_base_url}",
|
||
json={
|
||
"query": """
|
||
mutation CreateCommunity($input: CommunityInput!) {
|
||
create_community(input: $input) {
|
||
success
|
||
community {
|
||
id
|
||
name
|
||
slug
|
||
}
|
||
error
|
||
}
|
||
}
|
||
""",
|
||
"variables": {
|
||
"input": {
|
||
"name": "Test Community for Delete",
|
||
"slug": community_slug,
|
||
"desc": "Test community for deletion testing"
|
||
}
|
||
}
|
||
},
|
||
headers=headers,
|
||
timeout=10
|
||
)
|
||
|
||
if create_response.status_code == 200:
|
||
create_data = create_response.json()
|
||
if create_data.get("data", {}).get("create_community", {}).get("success"):
|
||
test_community = create_data["data"]["create_community"]["community"]
|
||
print(f"✅ Создано новое сообщество: {test_community['name']}")
|
||
else:
|
||
print("❌ Не удалось создать тестовое сообщество")
|
||
pytest.skip("Не удалось создать тестовое сообщество")
|
||
else:
|
||
print("❌ Ошибка при создании сообщества")
|
||
pytest.skip("Ошибка API при создании сообщества")
|
||
|
||
except Exception as e:
|
||
print(f"❌ Ошибка при проверке сообщества: {e}")
|
||
pytest.skip(f"Не удалось проверить сообщество: {e}")
|
||
|
||
# 2. Проверяем права на удаление сообщества
|
||
print("2️⃣ Проверяем права на удаление сообщества...")
|
||
try:
|
||
response = requests.post(
|
||
f"{api_base_url}",
|
||
json={
|
||
"query": """
|
||
mutation DeleteCommunity($slug: String!) {
|
||
delete_community(slug: $slug) {
|
||
success
|
||
error
|
||
}
|
||
}
|
||
""",
|
||
"variables": {"slug": community_slug}
|
||
},
|
||
headers=headers,
|
||
timeout=10
|
||
)
|
||
response.raise_for_status()
|
||
|
||
data = response.json()
|
||
if data.get("data", {}).get("delete_community", {}).get("success"):
|
||
print("✅ Сообщество успешно удалено через API")
|
||
else:
|
||
error = data.get("data", {}).get("delete_community", {}).get("error")
|
||
print(f"✅ Доступ запрещен как и ожидалось: {error}")
|
||
print(" Это демонстрирует работу RBAC системы - пользователь без прав не может удалить сообщество")
|
||
|
||
except Exception as e:
|
||
print(f"❌ Ошибка при проверке прав доступа: {e}")
|
||
pytest.fail(f"Ошибка API при проверке прав: {e}")
|
||
|
||
# 3. Проверяем что сообщество все еще существует (так как удаление не удалось)
|
||
print("3️⃣ Проверяем что сообщество все еще существует...")
|
||
try:
|
||
response = requests.post(
|
||
f"{api_base_url}",
|
||
json={
|
||
"query": """
|
||
query {
|
||
get_communities_all {
|
||
id
|
||
name
|
||
slug
|
||
}
|
||
}
|
||
""",
|
||
"variables": {}
|
||
},
|
||
headers=headers,
|
||
timeout=10
|
||
)
|
||
response.raise_for_status()
|
||
|
||
data = response.json()
|
||
communities = data.get("data", {}).get("get_communities_all", [])
|
||
|
||
# Проверяем что сообщество все еще существует
|
||
test_community_exists = any(
|
||
community.get("slug") == community_slug
|
||
for community in communities
|
||
)
|
||
|
||
if test_community_exists:
|
||
print("✅ Сообщество все еще существует в базе (как и должно быть)")
|
||
else:
|
||
print("❌ Сообщество было удалено, хотя не должно было быть")
|
||
pytest.fail("Сообщество было удалено без прав доступа")
|
||
|
||
except Exception as e:
|
||
print(f"❌ Ошибка при проверке существования: {e}")
|
||
pytest.fail(f"Ошибка API при проверке: {e}")
|
||
|
||
print("🎉 Тест удаления сообщества через API завершен успешно")
|
||
|
||
def test_community_delete_without_permissions_api(self, api_base_url, auth_headers):
|
||
"""Тест попытки удаления сообщества без прав через API"""
|
||
print("🚀 Начинаем тест удаления без прав через API")
|
||
|
||
# Получаем заголовки авторизации
|
||
headers = auth_headers()
|
||
|
||
# Используем существующее сообщество для тестирования
|
||
community_slug = "test-community-test-372c13ee" # Другое существующее сообщество
|
||
|
||
# Пытаемся удалить сообщество без прав
|
||
try:
|
||
response = requests.post(
|
||
f"{api_base_url}",
|
||
json={
|
||
"query": """
|
||
mutation DeleteCommunity($slug: String!) {
|
||
delete_community(slug: $slug) {
|
||
success
|
||
error
|
||
}
|
||
}
|
||
""",
|
||
"variables": {"slug": community_slug}
|
||
},
|
||
headers=headers,
|
||
timeout=10
|
||
)
|
||
response.raise_for_status()
|
||
|
||
data = response.json()
|
||
if data.get("data", {}).get("delete_community", {}).get("success"):
|
||
print("⚠️ Сообщество удалено, хотя не должно было быть")
|
||
# Это может быть нормально в зависимости от настроек безопасности
|
||
else:
|
||
error = data.get("data", {}).get("delete_community", {}).get("error")
|
||
print(f"✅ Доступ запрещен как и ожидалось: {error}")
|
||
|
||
except Exception as e:
|
||
print(f"❌ Ошибка при тестировании прав доступа: {e}")
|
||
# Это тоже может быть нормально - API может возвращать 401/403
|
||
|
||
print("🎉 Тест прав доступа завершен")
|