Найти в Дзене
Computer Pro

Основы сетевого взаимодействия

Оглавление

Продолжаем изучать курс python_advanced... Это домашнее задание, пожалуй, одно из самых непонятных. Не то чтобы очень сложное, но из описания того что нужно сделать и без понимания как работает Postman это задание оказалось наиболее туманно подано... Итак, задание:

Задача 1. TDD — разработка через тестирование

Заказчик составил для вас контракт веб-сервиса, который вы должны реализовать. Да ещё был так любезен, что написал для вас тесты. Ваша задача — создать такое API, чтобы все тесты прошли и функционал соответствовал ожиданиям.
Postman позволяет писать тесты на API. Чтобы тесты отработали корректно, нужно запускать их разом, так как в некоторых из них устанавливаются необходимые переменные.
Сервер должен вернуть код 200.
В ответе сервера должна содержаться строка roomId.
Ответ представляется в формате JSON такого вида:

Благодаря тому что я уже прошел курс по фреймворку Django, у меня есть небольшое понимание что такое "Заказчик составил для вас контракт веб-сервиса, который вы должны реализовать" - из описания к заданию.

То есть из этого:

Нужно сделать во первых приложение на Flask с тремя эндпойнтами: "/add-room", "/room", "/booking". Один эндпойнт будет отрабатывать GET-запрос, два других - POST. Плюс ко всему в контракте прописаны тесты на Java-script, их нужно реализовать в программе Postman. Что-то типа этого:

-3

Но у меня пока что тесты не работают, надеюсь к концу статьи разобраться с этим

Вот вроде бы тесты написаны, они должны по идее запускаться, но они не запускаются. Второй вопрос - почему один эндпойнт выдает 404 а другие отрабатываются нормально. Хотя в консольной версии запроса все прокатывает
Вот вроде бы тесты написаны, они должны по идее запускаться, но они не запускаются. Второй вопрос - почему один эндпойнт выдает 404 а другие отрабатываются нормально. Хотя в консольной версии запроса все прокатывает

А в консоли (программа http, похожая на curl) - вот примеры запросов и ответов:

Тут, пожалуй не совсем доработан запрос, не показывает в ответе roomId, ниже я уже его включил при формировании ответа, чтобы можно было узнать какие доступны комнаты для бронирования и исходя из roomId можно было в запросе это айди подставить
Тут, пожалуй не совсем доработан запрос, не показывает в ответе roomId, ниже я уже его включил при формировании ответа, чтобы можно было узнать какие доступны комнаты для бронирования и исходя из roomId можно было в запросе это айди подставить
-6
После выполнения этого запроса (мы как бы забронировали номер), из базы данных он удаляется и следующий запрос вернет room not found, см ниже...
После выполнения этого запроса (мы как бы забронировали номер), из базы данных он удаляется и следующий запрос вернет room not found, см ниже...
Видимо и поэтому у меня в Postman при подобном запросе тоже был ответ 404!
Видимо и поэтому у меня в Postman при подобном запросе тоже был ответ 404!

Ну и собственно получившийся у меня код:

Осталось понять как заставить работать тесты в Postman... Почти все тесты прошли с первого раза!

-10

А теперь о главном! Оказывается, этот файл hotel-api.postman_collection.json можно было импортировать в Postman!!! А я то тесты ручками вписывал! Об этом же нельзя было сказать и показать в условиях к домашнему заданию! При том что под Manjaro Linux, 10я версия Postman не запускается, да и вообще Postman нет в официальном репозитории. А 9я версия почему-то отказалась принимать в себя hotel-api.postman_collection.json, говорит мол файлы у тебя не той системы!

Пришлось загружаться из под "Винды", а я уже начал забывать как ей пользоваться. Плюс ко всему под виндой ни пайчарма, ни пайтона - ничего для программирования не установлено! Зато есть дистриб ломанного Pycharm Professional!!! Его и установил.

И вот только под виндой, после танцев с бубном, файл hotel-api.postman_collection.json подхватился и все тесты запустились как надо, кроме одного...

Подумав немного, над тем почему не проходит один тест в эндпойнте /booking, и до меня дошло - тест ожидает получить код 409 а я ему предлагаю 404, поменял код возврата и все тесты прошли:

-11
-12

Ну, по идее на этом работа выполнена... Надеюсь...

Но, чуть погодя, я стал думать над тем как у меня написан эндпойнт /booking... Ведь по идее, чтобы забронировать номер нужно этот номер взять из таблицы rooms и перенести (скопировать и удалить) в другую таблицу, пусть которая будет именоваться как booking. А если бронь будет отменяться то выполнить обратные действия.

В итоге код букинга поменялся примерно до такого уровня:

-13

Идём дальше...

Задача 2. Повышаем уровень зрелости

-14

Заказчик не знает про модель зрелости API, да и вообще про принципы построения качественного API. Он это осознаёт, поэтому попросил вас помочь внести правки в контракт.
Найдите, что можно улучшить, и оформите это в виде Postman-коллекции, прокомментировав изменения в файле REPORT.md.
Определён текущий уровень зрелости.
Обращено внимание на названия endpoint и параметров.
Изменённый контракт оформлен в виде Postman-коллекции.
Все изменения в контракте обоснованы и записаны в REPORT.md.
Имеется разделение кода на отдельные независимые модули: модели, бизнес-логика, контроллер.
При работе с БД используются параметризованные запросы.
Названия переменных, функций и классов имеют значащие имена.

Было непонятно что тут нужно сделать, вроде бы черным по белому написано и местами даже не русском языке - но вот хоть убей не пойму что нужно сделать... Вроде бы и в чате что-то объясняли, но вот все равно - смотрю на это дело как баран на новые ворота. И как правило такие проблемы решаются "как-то вдруг", "бац, и понял!".

Во первых, нужно было определить уровень зрелости текущего проекта, у него второй уровень ибо используются:

  • различные URI (endpoints)
  • различные HTTP методы (GET, POST, DELETE, и др.)

Но нам нужно повысить проект до третьего уровня, в котором помимо описанных пунктов выше, будут еще и ссылки (URI) на действия с этим ресурсом.

Объединить получение списка комнат и добавление комнаты в один uri '/room' c разными методами (GET, POST)
Вынести id комнаты в uri room, например '/room/1', добавление букинга через uri комнаты
Добавить список букингов '/booking' и отдельную страницу букинга 'booking/<id>'
Добавить возвращаемым ресурсам ссылки на действия
При успешном создании ресурса будет возвращен код 201 Created

Получилось нечто такое:

-15
-16
-17
-18
-19

Это не самый красивый и лучший вариант решения данной задачи, но пока так ибо это обучение и тут мы можем "косячить" и весь этот материал не руководство к действию а лишь пища для размышлений, дабы на ее основе построить своё решение задачи.

Ну и что-то я написал файле REPORT.md...

-20

А так же создал новую postman-коллекцию:

-21

Эту постман-коллекцию экспортировал в файл new_postman_collection.json

Ну вот, как-то так...

Эта домашняя работа еще не принята, если будут изменения - в комментариях отпишусь...

А вы знаете что делать: лайк, коммент, подписка! Это всё очень важно для меня и рекомендательных систем Дзена.

Да пребудет с вами СИЛА!