Files
Yandex-disk-API-test/tests/test_disk_crud.py
T

123 lines
7.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Набор автотестов для проверки 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')}"