├── .gitignore ├── README.md ├── configuration.py ├── create_kit_name_kit_test.py ├── data.py └── sender_stand_request.py /.gitignore: -------------------------------------------------------------------------------- 1 | .pytest/ 2 | venv/ 3 | .idea/ 4 | .pytest_cache/ 5 | __pycache__/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # СПРИНТ 11 2 | 3 | ## Автоматизация чек-листа для поля `name` в запросе на создание набора в Яндекс Прилавке с помощью API Яндекс Прилавка. 4 | 5 | Яндекс Прилавок это учебное web-приложение для практики работы с API, SQL. 6 | 7 | ✨Документация API Прилавка (apiDoc) ✨ 8 | 9 | [![N|Solid](https://i.ibb.co/rQ1hk93/1.jpg)](https://nodesource.com/products/nsolid) 10 | [![N|Solid](https://i.ibb.co/mBGRX0c/2.jpg)](https://nodesource.com/products/nsolid) 11 | - Язык приложения — `JavaScript`. 12 | - Доступ к приложению по протоколу `HTTP 1.1`. 13 | - Документация к приложению осуществляется с помощью модуля `apiDoc`. 14 | - Приложение использует базу данных — `PostgreSQL`. 15 | 16 | ### Требования 17 | 18 | - Для запуска тестов должны быть установлены пакеты `pytest` и `requests`. 19 | - Запуск всех тестов выполняется командой `pytest`. 20 | 21 | ### Чек-лист проверок 22 | 23 | | № | Описание | ОР | 24 | |----|------------------------------------------------------------------------------|-------------------------------------------------------------------------------| 25 | | 1 | Допустимое количество символов (1): `kit_body = { "name": "a" }` |
Код ответа — 201
В ответе поле name совпадает с полем name в запросе | 26 | | 2 | Допустимое количество символов (511): тестовое значение под таблицей |
Код ответа — 201
В ответе поле name совпадает с полем name в запросе | 27 | | 3 | Количество символов меньше допустимого (0): `kit_body = { "name": "" }` |
Код ответа — 400 | 28 | | 4 | Количество символов больше допустимого (512): тестовое значение под таблицей |
Код ответа — 400 | 29 | | 5 | Разрешены английские буквы: `kit_body = { "name": "QWErty" }` |
Код ответа — 201
В ответе поле name совпадает с полем name в запросе | 30 | | 6 | Разрешены русские буквы: `kit_body = { "name": "Мария" }` |
Код ответа — 201
В ответе поле name совпадает с полем name в запросе | 31 | | 7 | Разрешены спецсимволы: `kit_body = { "name": ""№%@"," }` |
Код ответа — 201
В ответе поле name совпадает с полем name в запросе | 32 | | 8 | Разрешены пробелы: `kit_body = { "name": " Человек и КО " }` |
Код ответа — 201
В ответе поле name совпадает с полем name в запросе | 33 | | 9 | Разрешены цифры: `kit_body = { "name": "123" }` |
Код ответа — 201
В ответе поле name совпадает с полем name в запросе | 34 | | 10 | Параметр не передан в запросе: `kit_body = {}` |
Код ответа — 400 | 35 | | 11 | Передан другой тип параметра (число): `kit_body = { "name": 123 }` |
Код ответа — 400 | 36 | 37 | #### Тестовые значения для проверок №2 и №4 38 | Допустимое количество символов (511) 39 | ```py 40 | kit_body = { "name": "AbcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdAbcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabC" } 41 | ``` 42 | Количество символов больше допустимого (512) 43 | ```py 44 | kit_body = { "name": "AbcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdAbcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcD" } 45 | ``` 46 | 47 | ### Шаги выполнения проекта 48 | 49 | 1. Написать `POST`-запрос на создание нового пользователя и сохранение токена авторизации authToken. 50 | 2. Написать `POST`-запрос на создание личного набора для этого пользователя. Учесть передачу заголовка Authorization. 51 | 3. Написать функции для проверки позитивных и негативных сценариев чек-листа. 52 | 4. Запустить автотест. 53 | 5. Упаковать папку с файлами `configuration.py`, `data.py`, `sender_stand_request.py`, `create_kit_name_kit_test.py`, `README.md`, `.gitignore` в ZIP-архив. 54 | 55 | > #### Создание пользователя 56 | > Тип запроса – `POST`. 57 | > Эндпоинт – `/api/v1/users`. 58 | > ###### Успешное создание учётной записи пользователя 59 | > ```xml 60 | > HTTP/1.1 201 Created 61 | > { 62 | > authToken: 'jknnFApafP4awfAIFfafam2fma' 63 | > } 64 | > ``` 65 | 66 | > #### Создание набора внутри конкретной карточки или пользователя 67 | > Тип запроса – `POST`. 68 | > Эндпоинт – `/api/v1/kits`. 69 | > ###### Заголовок для получения наборов, созданных пользователем 70 | > ```xml 71 | > { 72 | > "Content-Type": "application/json", 73 | > "Authorization": "Bearer jknnFApafP4awfAIFfafam2fma" 74 | > } 75 | > ``` 76 | 77 | ### Стек для выполнения проекта 78 | * PyCharm 79 | * GitHub 80 | * requests 81 | * pytest -------------------------------------------------------------------------------- /configuration.py: -------------------------------------------------------------------------------- 1 | # URL_SERVICE хранит базовый URL веб-сервиса, который используется для доступа к API или 2 | # другим ресурсам. 3 | # Значение должно быть скопировано из настроек или документации сервиса, 4 | # к которому предоставляется доступ. 5 | # Пример значения: "https://api.example.com" 6 | URL_SERVICE = "https://c640435f-a1a4-448c-841c-418cdce4871a.serverhub.praktikum-services.ru" 7 | 8 | # CREATE_USER_PATH хранит путь к API-методу для создания нового пользователя. 9 | # Этот путь будет использоваться для формирования полного URL-адреса в сочетании с базовым URL сервиса, 10 | # когда необходимо выполнить запрос на создание пользователя. 11 | CREATE_USER_PATH = "/api/v1/users/" 12 | 13 | # PRODUCTS_KITS_PATH хранит путь к API-методу для создания нового набора. 14 | # Эндпоинт для создания набора внутри конкретной карточки ИЛИ пользователя. 15 | # Этот путь будет использоваться для формирования полного URL-адреса в сочетании с базовым URL сервиса, 16 | # когда необходимо выполнить запрос на создание набора. 17 | CREATE_PRODUCTS_KITS_PATH = "/api/v1/kits" -------------------------------------------------------------------------------- /create_kit_name_kit_test.py: -------------------------------------------------------------------------------- 1 | # Импортируем модуль sender_stand_request, содержащий функции для отправки HTTP-запросов к API. 2 | import sender_stand_request 3 | # Импортируем модуль data, в котором определены данные, необходимые для HTTP-запросов. 4 | import data 5 | 6 | #Тестовые значения для проверок №2 и №4 7 | kit_body511 = "AbcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdAbcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabC" 8 | kit_body512 = "AbcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdAbcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcD" 9 | 10 | # функция получения токена 11 | def get_new_user_token(): 12 | user_response = sender_stand_request.post_new_user(data.user_body) 13 | auth_token = user_response.json()["authToken"] 14 | return auth_token 15 | 16 | # эта функция меняет значения в параметре name 17 | def get_kit_body(name): 18 | # копирование словаря с телом запроса из файла data, чтобы не потерять данные в исходном словаре 19 | current_kit_body = data.kit_body.copy() 20 | # изменение значения в поле name 21 | current_kit_body["name"] = name 22 | # возвращается новый словарь с нужным значением name 23 | return current_kit_body 24 | 25 | 26 | # Функция для позитивной проверки код 200 27 | def positive_assert(name): 28 | # В переменную kit_body и auth_token сохраняется обновлённое тело запроса 29 | kit_body = get_kit_body(name) 30 | auth_token = get_new_user_token() 31 | # В переменную kit_response сохраняется результат запроса на создание пользователя: 32 | kit_response = sender_stand_request.post_new_client_kit(kit_body,auth_token) 33 | 34 | # Проверяется, что код ответа равен 201 35 | assert kit_response.status_code == 201 36 | # Проверка текста в теле ответа в атрибуте "name" 37 | assert kit_response.json()["name"] == name 38 | 39 | # Функция для негативной проверки код 400 40 | def negative_assert_code_400(name): 41 | # В переменную kit_body и auth_token сохраняется обновлённое тело запроса 42 | kit_body = get_kit_body(name) 43 | auth_token = get_new_user_token() 44 | # В переменную kit_response сохраняется результат запроса 45 | kit_response = sender_stand_request.post_new_client_kit(kit_body, auth_token) 46 | 47 | # Проверка, что код ответа равен 400 48 | assert kit_response.status_code == 400 49 | # Проверка, что в теле ответа атрибут "code" равен 400 50 | assert kit_response.json()["code"] == 400 51 | # Проверка текста в теле ответа в атрибуте "message" 52 | assert kit_response.json()["message"] == "Не все необходимые параметры были переданы" 53 | 54 | # Функция для негативной проверки 55 | # В ответе ошибка: "Не все необходимые параметры были переданы" 56 | def negative_assert_no_name(kit_body): 57 | auth_token = get_new_user_token() 58 | # В переменную kit_response сохраняется результат запроса на создание набора: 59 | kit_response = sender_stand_request.post_new_client_kit(kit_body, auth_token) 60 | 61 | # Проверь, что код ответа — 400 62 | assert kit_response.status_code == 400 63 | # Проверь, что в теле ответа атрибут "code" — 400 64 | assert kit_response.json()["code"] == 400 65 | # Проверь текст в теле ответа в атрибуте "message" 66 | assert kit_response.json()["message"] == "Не все необходимые параметры были переданы" 67 | 68 | # Тест 1. Допустимое количество символов (1): PASSED 69 | # kit_body = {"name": "a"} 70 | def test_create_kit_1_letter_name_get_success_response(): 71 | positive_assert("a") 72 | # Тест 2. Допустимое количество символов (511): PASSED 73 | # kit_body = {"name": "kit_body511"} 74 | def test_create_kit_511_letter_name_get_success_response(): 75 | positive_assert(kit_body511) 76 | # Тест 3. Количество символов меньше допустимого (0): FAILED 77 | # kit_body = {"name": ""} 78 | def test_create_kit_0_letter_name_get_error_response(): 79 | negative_assert_code_400("") 80 | # Тест 4. Количество символов больше допустимого (512): FAILED 81 | # kit_body = {"name": "kit_body512"} 82 | def test_create_kit_512_letter_name_get_error_response(): 83 | negative_assert_code_400(kit_body512) 84 | # Тест 5. Разрешены английские буквы (QWErty): PASSED 85 | # kit_body = {"name": "QWErty"} 86 | def test_create_kit_english_letter_name_get_success_response(): 87 | positive_assert("QWErty") 88 | # Тест 6. Разрешены русские буквы (Мария): PASSED 89 | # kit_body = {"name": "Мария"} 90 | def test_create_kit_rus_letter_name_get_success_response(): 91 | positive_assert("Мария") 92 | # Тест 7. Разрешены спецсимволы (""№%@","): PASSED 93 | # kit_body = {"name": ""№%@","} 94 | def test_create_kit_symbol_letter_name_get_success_response(): 95 | positive_assert("\"№%@\",") 96 | # Тест 8. Разрешены пробелы (Человек и КО): PASSED 97 | # kit_body = {"name": "Человек и КО"} 98 | def test_create_kit_space_letter_name_get_success_response(): 99 | positive_assert("Человек и КО") 100 | # Тест 9. Разрешены цифры (123): PASSED 101 | # kit_body = {"name": "123"} 102 | def test_create_kit_digit_letter_name_get_success_response(): 103 | positive_assert("123") 104 | # Тест 10. Параметр не передан в запросе (): FAILED 105 | # kit_body = {} 106 | def test_create_kit_no_name_get_error_response(): 107 | # Копируется словарь с телом запроса из файла data в переменную kit_body 108 | # Иначе можно потерять данные из исходного словаря 109 | kit_body = data.kit_body.copy() 110 | # Удаление параметра name из запроса 111 | kit_body.pop("name") 112 | # Проверка полученного ответа 113 | negative_assert_no_name(kit_body) 114 | # Тест 11. Передан другой тип параметра (число): FAILED 115 | # kit_body = {"name": 123} 116 | def test_create_kit_type_digit_letter_name_get_error_response(): 117 | negative_assert_code_400(123) -------------------------------------------------------------------------------- /data.py: -------------------------------------------------------------------------------- 1 | # заголовки для HTTP-запроса, указывающие на то, что тело запроса будет в формате JSON 2 | # передаём заголовок Authorization. Авторизационный заголовок в формате Bearer {authToken}. При передаче - возвращает все наборы, созданные пользователем. 3 | headers = { 4 | "Content-Type": "application/json", 5 | "Authorization": "Bearer " 6 | } 7 | 8 | # данные пользователя для создания новой записи пользователя в системе 9 | # содержат имя пользователя, телефон и адрес 10 | user_body = { 11 | "firstName": "Марс", 12 | "phone": "+79995553322", 13 | "address": "г. Москва, ул. Пушкина, д. 10" 14 | } 15 | 16 | # данные набора для создания нового набора в системе 17 | # содержат имя набора 18 | kit_body = { 19 | "name": "Набор" 20 | } -------------------------------------------------------------------------------- /sender_stand_request.py: -------------------------------------------------------------------------------- 1 | # Импорт модуля requests для отправки HTTP-запросов 2 | import requests 3 | # Импорт конфигурационного файла, который содержит настройки URL 4 | import configuration 5 | # Импорт данных запроса из модуля data, в котором определены заголовки и тело запроса 6 | import data 7 | 8 | # Определение функции post_new_user для отправки POST-запроса на создание нового пользователя 9 | def post_new_user(body): 10 | # Выполнение POST-запроса с использованием URL из конфигурационного файла, тела запроса и заголовков 11 | # URL_SERVICE и CREATE_USER_PATH объединяются для формирования полного URL для запроса 12 | # json=body используется для отправки данных пользователя в формате JSON 13 | # headers=data.headers устанавливает заголовки запроса из модуля data 14 | return requests.post(configuration.URL_SERVICE + configuration.CREATE_USER_PATH, 15 | json=body, 16 | headers=data.headers) 17 | 18 | # Вызов функции post_new_user с телом запроса для создания нового пользователя из модуля data 19 | response = post_new_user(data.user_body) 20 | 21 | # Вывод HTTP-статус кода ответа на запрос 22 | # Код состояния указывает на результат обработки запроса сервером 23 | # print(response.status_code) 24 | # print(response.json()) 25 | 26 | # Определение функции для отправки POST-запроса создания нового набора. Два параметра: kit_body — тело запроса, auth_token — токен авторизации. 27 | def post_new_client_kit(kit_body,auth_token): 28 | # Отправка POST-запроса с использованием URL из конфигурации, данных о наборах и токене авторизации 29 | auth_headers = data.headers.copy() 30 | auth_headers["Authorization"] = "Bearer " + auth_token 31 | # Возвращается объект ответа, полученный от сервера 32 | return requests.post(configuration.URL_SERVICE + configuration.CREATE_PRODUCTS_KITS_PATH, 33 | json=kit_body, 34 | headers=auth_headers) 35 | 36 | # Вызов функции с передачей списка kit_body продуктов из файла data.py и токена авторизации 37 | response = post_new_client_kit(data.kit_body,data.headers["Authorization"]) 38 | 39 | # Вывод HTTP-статус кода ответа и тела ответа в формате JSON 40 | # Это позволяет проверить успешность выполнения запроса и посмотреть результаты поиска наборов 41 | # print(response.status_code) 42 | # print(response.json()) --------------------------------------------------------------------------------