├── .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 | [](https://nodesource.com/products/nsolid)
10 | [](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())
--------------------------------------------------------------------------------