Files

122 lines
7.0 KiB
Python
Raw Permalink Normal View History

2026-09-17 21:18:41 +00:00
"""
Набор автотестов для проверки REST API Яндекс Диска.
Покрывает методы:
- PUT: создание папки (создание ресурса)
- GET: получение метаданных ресурса
- POST: публикация ресурса (открытие публичного доступа)
- DELETE: удаление ресурса (очистка)
А также негативные сценарии (дублирование, несуществующий ресурс).
"""
import uuid
import pytest
from api.disk_client import YandexDiskClient
@pytest.mark.crud
class TestYandexDiskCRUD:
"""Тесты на основные CRUD-операции с ресурсами Яндекс Диска."""
def test_create_folder_put_success(self, disk_client: YandexDiskClient):
"""
Проверка создания папки (PUT-запрос).
Ожидаемый результат: HTTP 201 Created, в ответе присутствует ссылка на созданный ресурс (href).
"""
folder_name = f"dir_create_{uuid.uuid4().hex[:8]}"
try:
response = disk_client.create_folder(folder_name)
assert response.status_code == 201, f"Ожидался 201, получено {response.status_code}: {response.text}"
data = response.json()
assert "href" in data, "В теле ответа отсутствует поле 'href'"
assert "method" in data, "В теле ответа отсутствует поле 'method'"
assert data["method"] == "GET"
finally:
# Очистка ресурса после теста
disk_client.delete_resource(folder_name, permanently=True)
def test_get_resource_info_get_success(self, disk_client: YandexDiskClient, temp_folder: str):
"""
Проверка получения метаданных ресурса (GET-запрос).
Ожидаемый результат: HTTP 200 OK, тип ресурса 'dir', имя совпадает с созданным.
"""
response = disk_client.get_resource_info(temp_folder)
assert response.status_code == 200, f"Ожидался 200, получено {response.status_code}: {response.text}"
data = response.json()
assert data.get("type") == "dir", f"Ожидался тип 'dir', получено {data.get('type')}"
assert data.get("name") == temp_folder, f"Имя ресурса {data.get('name')} не совпадает с {temp_folder}"
assert "created" in data, "Поле 'created' отсутствует в метаданных"
def test_publish_resource_post_success(self, disk_client: YandexDiskClient, temp_folder: str):
"""
Проверка публикации ресурса (POST-запрос).
Ожидаемый результат: HTTP 200 OK, у папки появляется публичный URL и ключ.
"""
response = disk_client.publish_resource(temp_folder)
assert response.status_code == 200, f"Ожидался 200, получено {response.status_code}: {response.text}"
# Проверяем метаданные папки после публикации через GET
info_resp = disk_client.get_resource_info(temp_folder)
assert info_resp.status_code == 200
info_data = info_resp.json()
assert "public_url" in info_data, "После публикации поле 'public_url' отсутствует"
assert "public_key" in info_data, "После публикации поле 'public_key' отсутствует"
assert info_data["public_url"].startswith("https://"), "Публичный URL имеет некорректный формат"
def test_delete_folder_delete_success(self, disk_client: YandexDiskClient):
"""
Проверка удаления ресурса (DELETE-запрос).
Ожидаемый результат: HTTP 204 No Content при удалении, последующий GET возвращает 404 Not Found.
"""
folder_name = f"dir_delete_{uuid.uuid4().hex[:8]}"
# Предварительно создаем папку для последующего удаления
create_resp = disk_client.create_folder(folder_name)
assert create_resp.status_code == 201
# Удаление
delete_resp = disk_client.delete_resource(folder_name, permanently=True)
assert delete_resp.status_code == 204, f"Ожидался 204, получено {delete_resp.status_code}: {delete_resp.text}"
# Проверка отсутствия ресурса
get_resp = disk_client.get_resource_info(folder_name)
assert get_resp.status_code == 404, f"Ресурс все еще существует, статус {get_resp.status_code}"
@pytest.mark.negative
class TestYandexDiskNegative:
"""Негативные тесты для проверки корректности обработки ошибок API."""
def test_create_duplicate_folder_put_conflict(self, disk_client: YandexDiskClient, temp_folder: str):
"""
Повторное создание уже существующей папки.
Ожидаемый результат: HTTP 409 Conflict.
"""
response = disk_client.create_folder(temp_folder)
assert response.status_code == 409, f"Ожидался 409 Conflict, получено {response.status_code}"
data = response.json()
assert data.get("error") == "PlatformResourceAlreadyExists", f"Неожиданный код ошибки: {data.get('error')}"
def test_get_non_existent_resource_get_not_found(self, disk_client: YandexDiskClient):
"""
Запрос метаданных несуществующего ресурса.
Ожидаемый результат: HTTP 404 Not Found.
"""
non_existent_path = f"does_not_exist_{uuid.uuid4().hex}"
response = disk_client.get_resource_info(non_existent_path)
assert response.status_code == 404, f"Ожидался 404 Not Found, получено {response.status_code}"
data = response.json()
assert data.get("error") == "DiskNotFoundError", f"Неожиданный код ошибки: {data.get('error')}"
def test_unauthorized_access(self):
"""
Выполнение запроса с недействительным токеном.
Ожидаемый результат: HTTP 401 Unauthorized.
"""
invalid_client = YandexDiskClient(token="invalid_dummy_token_123")
response = invalid_client.get_resource_info("any_folder")
assert response.status_code == 401, f"Ожидался 401 Unauthorized, получено {response.status_code}"
data = response.json()
assert data.get("error") == "UnauthorizedError", f"Неожиданный код ошибки: {data.get('error')}"