0: Пришла пора посмотреть, как работают апи, интеграционные тесты, в чем разница с дау тестами, какие сложности, какие лёгкости есть в этом деле. Итак, 1, что нужно сделать, это сделать аутентифицированного клиента, у которого будет храниться уже
1: Чтобы мы каждый раз не логинились во во всех эндпоинтах. И на самом деле вы уже можете догадаться, как это сделать. Я даже, кажется, говорил об этом. Поэтому, если вам интересно, нажмите на паузу, попробуйте сделать самостоятельно фикстуру, которая будет отда
2: Залогиненного клиента и затем как-то ей воспользоваться. Если вам лень, мы продолжаем. Итак, у нас есть фикстурками её, которая даёт чистого клиента, она каждую функцию обновляется, заново, очищаются там все cookie и прочее, потому что
3: Что мы не хотим, чтобы какой-то тест с логином вдруг внедрил куку, и другой тест неправильно бы отработал, потому что там была бы кука. В общем, что мы будем делать? Мы создадим новую текстурку, назовём её ауторайзд.
4: Давайте не так. Давайте аутентике ед. Часто путают, точнее не путают, наверное, а специально называют авторизован вместо аутентифицирован просто потому, что слово авторизация гораздо более популярное. А ещё слово аутентификация очень, ну длинное и сложное в произношении, но
5: Тем не менее, важно понимать, что это аутентифицированный клиент, которого мы сейчас сделаем. Он ещё не авторизован. Он авторизован только тогда, когда он к конкретному эндпоинту обращается, что нам нужно сделать. Нам нужна кука. Мы хотим вот здесь после проведения
6: Каких-то операций, вот здесь убедиться, что у этого клиента, с которым, которым мы дальше отдаём в словарике cookies, есть букинг, эксесс токен, да, чтобы вот это дело отработало, что нужно сделать, да, на
7: На самом деле просто сделать post запрос по адресу Аус реджистер, как мы уже делали, и передать сюда джейсончик емейл, уже знакомый нам пирожок. Тест сюда мы его вставляем.
8: И пароль у него тоже тест.
9: И вот таким образом у нас в куках должна записаться токен доступа. Мы проверяем, что он есть, чтобы все тесты реально прогонялись как надо и затем отдаём его дальше. Пускай его используют. Но что очень важно, здесь мы сделаем сешн, мы не хотим каждый раз перед каждой
10: Функций, обращаться к эндпоинту и тратить на это время получать токен. Мы можем 1 раз в самом начале, как будто, да, как будто пользователь зашёл, залогиниться, отдать этого пользователя. Все, пускай все совершают какие-то действия уже
11: С этим пользователем. Итак, мы сделали эту текстурку. Я создал файл в тест букингс в интеграционных тестах. И здесь мы можем, ой, ой, ой, давайте сначала импортируем пайтест. Что сделать так, пайтест
12: Пока не нужно написать асинхронный тест. Сейчас это дело вставим. У нас уже в тестах дао было название it and get букинг. Мы в принципе, можем его оставить, почему бы и нет, просто здесь мы тестируем уже api, а не
13: Dao что мы принимаем, естественно, вот этого, эту текстурку, обзовём её, что это асинк клаент дадим тип. Точнее, потому что нам нужны подсказки, без них мы вообще все программисты, разленились. Ну, действительно очень полезно, когда можно провалиться в библиотеку.
14: Смотреть, какой метод, что принимает и так далее. Итак, что мы делаем в 1 очередь, в 1 очередь, мы хотим аутентике ед. Эйси сделать post запрос, добавить новый букинг. Да, это у нас эндпоинт букингс и я
15: Говорил, что в букингах точнее, что при post запросах мы используем здесь json да, вот такой json а здесь мы будем использовать парамс просто потому, что json используется для пайдентик модели, когда мы здесь какую-то пайдентик модель используем.
16: Типа вот такой, а здесь мы принимаем просто параметры рум дейт и date to поэтому давайте их здесь передадим просто как параметры. Это у нас будет словарик вот такой словарие, здесь все это дело.
17: Всем, чем нужно, и зададим, например, room. Id пускай будет 4 комната, она сейчас никем не забронирована и там всего 8 мест. Да, запомните, мы этим воспользуемся. Мы проверим, что нельзя забронировать больше 8 дейт Фром и day тум. Давайте напишем какой-нибудь вообще там нереальный 2030 го.
18: Там, не знаю, my. И вот здесь будет 1 мая, здесь будет 15 мая, чисто такие майские празднички. Что происходит? Мы вообще, как я сказал, хотим проверить, что комнату можно забронировать 8 раз, а 9 уже нельзя.
19: Давайте для этого дела сделаем параметризацию, и что мы здесь будем принимать? Мы будем принимать, понятно. Рум айди. Мы будем принимать date from date to и, наверное, статус. Код, да, так как у нас
20: Букинге. Я добавил здесь исключение, что если букинг не возвращается, то мы отдаём ошибку 409 конфликт, что номеров свободных не осталось. То есть мы можем проверить, что ошибка будет 409. Здесь нам нужно передать данные
21: И по идее, мы можем передать одни и те же данные 8 раз, ну просто чтобы каждый раз не выдумывать, какой, какие даты нам нужны, забронировать 1 и ту же комнату, да, комната у нас будет 4. И, собственно, вот эти дейт Фром дейт ту мы сюда можем передать.
22: Почему бы и нет? Здесь лишний пробельчик, точнее нужный пробельчик и статус. Код 200. Все окей. Как это дело размножить? Если просто написать, умножить на 8, то у нас просто вот этот кортеж удлинится, и он будет очень длин.
23: Там просто будут повторяться все эти значения, его можно обернуть в списочек списочек, умножить на 8 раз. И у нас появится просто реально целый список с восемью элементами вот такими. И нам нужно его здесь раскрыть через
24: Звёздочку. То есть мы просто все эти элементы сюда погрузим в этот список. Надеюсь, было понятно. Если непонятно, попробуйте сами поймёте, что это делает. И последний нам нужен примерчик, и он уже отдаст 400 девя.
25: 5 ошибку мы должны убедиться. Ну и, например, можно ещё раз, почему бы и нет, если ещё кто-то захочет забронировать ещё раз будет 409 ошибка. Итак, что у нас? Мы хотим убедиться.
26: Что response status code равно равно статус код. Кстати, мы забыли все эти параметры здесь принять. Давайте их примем и здесь будем с ними работать. Да, понятное дело, что рума, иди сюда.
27: На самом деле, да, можно было здесь, наверное, и оставить вот эти параметры, но мы решили так не делать, мы решили их задать. Ну, пускай будет так сюда это все дело перемещаем и остаётся статус, код. И давайте это дело запустим посмо.
28: Смотрим, как оно в данный момент отработает. Тут у меня уже готов запрос, потому что почему-то мне не подсказывает консоль. Когда я нажимаю тап соответствующей папки, я вбивал целую минуту этот адрес и
29: И готов запустить конкретно вот этот тест. Никакие другие мне не нужны. Я не хочу ждать, пока запустятся остальные тесты. Посмотрим, как он работает. Да, он забрал 10 тест кейсов, так и он нам выдаёт сразу ошибочку. Смотрите, мы не авторизовались.
30: Сделали что-то неправильно. Давайте посмотрим. Да, действительно, я решил зарегистрировать пользователя, а не залогинить. Давайте запустим ещё раз. И видите, да, проверка прошла, что пользователь не зарегистрирован, и мы знаем, что ошибка не в тесте, а ошибка в фикстуре. Что
31: Мы неправильно что-то сделали. Итак, что у нас с этим, с этими тестами все хорошо прошло, все ошибки действительно такие, какие мы и хотели. То есть что пользователь какой-то там захочет забронить ещё раз этот отель не получится ошибка.
32: Окей, а если ещё раз, то опять будет ошибка. Ну, на всякий случай, вдруг у нас как-то там по другому отрабатывает база данных, и так как это тест все-таки интеграционный, давайте проверим, что у нас будет в response джейсоне.
33: Таким образом, можно получить данные респонс джейсон, и, наверное, здесь было бы хорошо проверить длину, то есть количество всех забронированных отелей у нас изначально для пользователя.
34: Если сюда посмотреть, есть 1 бронь и 2 бронь, то есть у него изначально уже есть 2 брони, и можно в целом каждый раз проверять, что у него добавляется новая бронь. Итак, я пошёл наперекор себе и все.
35: Такие. Задублировал все эти брони. Наверное, это не самый хороший подход, но я не придумал, что сделать. Вместо этого мы хотим проверить количество оставшихся, количество забронированных комнат. Давайте так это дело. Назовём букт румс. Его сюда тоже.
36: Добавим вот куда-нибудь сюда. И мы, конечно, должны сделать новый запрос. Мы должны сделать новый запрос к эндпоинту уже, который называется у нас метод гет имеет и тоже называется букингс, но он уже
37: Отдаёт нам все букинги, причём параметры он никакие не принимает. Давайте посмотрим, где, где, где. Вот здесь он принимает. Только собственно юзера. У нас зависимость отработает и вернутся все букинги. Соответственно, так как у него по дефолту уже было 2, когда он забронирует 3.
38: У него должно быть их 3, очевидно, и мы можем сделать такой респонс и проверить, что длина ответа через response json возвращаются, все данные равна собственно количеству забронированных.
39: Комнат. Давайте в этом убедимся и посмотрим, как у нас проходит этот интеграционный тестик. Запускаем и проверяем у нас
40: Каждый кейс проходит. Да, все, все хорошо прошло. Мы проверили, что у нас, во первых, не добавляется новый букинг ошибкой 409, что как бы все окей. Но мы потом ещё раз на всякий случай проверили, что он действительно
41: Не добавился, вызвав дополнительный эндпоинт, да, то есть мы проверили какой-то очень маленький отрезок пользовательского пути, когда пользователь попробовал добавить какой-то букинг, у него не получилось, он зашёл в личный кабинет, посмотрел. Ага, действительно не получилось. Действительно у меня
42: Осталось столько же, сколько и было. Вот так. Мы с вами посмотрели на тестирование, мы посмотрели на юнит тесты, мы посмотрели на интеграционные тесты, мы посмотрели, как нужно настраивать среду. Это занимает тоже довольно много времени. Мы посмотрели, как работают фикстуры, как работает.
43: Параметризация, как работают осерты, как работать с пост запросами, get запросами, как нам передавать эти данные и убедились, что тестирование необходимо, потому что какие-то крайние случаи иногда
44: А вообще никогда не случатся у вас в продакшене или очень редко будут случаться, но когда будут случаться, будет неприятно, если это случится где-нибудь там в пятницу вечером или на выходных, и вам придётся лезть смотреть, что там не так.