""" Набор автотестов для проверки 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')}"