Conversation
…ест на лимит комментариев для одного лектора
Coverage Report
Summary
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Тест лимита на одного лектора | ||
| """ | ||
| new_user = authlib_user.copy() | ||
| new_user["id"] = 99999 |
There was a problem hiding this comment.
Зачем менять id юзера? Кажется не за чем, тесты запускаются изолированно, это ни на что не влияет.
| assert comment.dislike_count == 0 | ||
|
|
||
|
|
||
| def test_comment_lecturer_limit( |
There was a problem hiding this comment.
https://github.com/profcomff/rating-api/actions/runs/33264837617/job/99132955286?pr=179
здесь подробный вывод в print report

| """ | ||
| Тест общего лимита комментариев пользователя за период | ||
| """ | ||
| dbsession.query(LecturerUserComment).delete() |
There was a problem hiding this comment.
Если это очистка после предыдущего теста, то она не будет работать корректно. Да, в рамках одного файла тесты запускаются в порядке их объявления, но могут быть и другие файлы(test_lecturer.py). Не стоит полагаться на этот порядок. Очистку лучше проводить в том же тесте, в котором были созданы объекты, чтобы тесты были независимы(или в фикстуре, см. ниже)
There was a problem hiding this comment.
да, всю работу с бд лучше выносить в фикстуры, в самих тестах только вызов эндпоинтов и проверка логики работы
| for lecturer in extra_lecturers: | ||
| dbsession.refresh(lecturer) | ||
|
|
||
| new_user = {"id": 99999, "email": "test@example.com"} |
There was a problem hiding this comment.
Так же не понимаю, как пользователь с другим id и почтой влияет на логику проверки лимита комментариев. Помимо этого, хардкодить тестовые данные в тесте не очень хорошо, тест становистся хрупким. Для этого как раз есть фикстура authlib_user.
| from rating_api.models import Lecturer | ||
|
|
||
| extra_lecturers = [] | ||
| for i in range(5): |
There was a problem hiding this comment.
Хорошо, когда создание данных для теста и логика проверки в тесте разделены. Здесь мне кажется лучше создать отдельную фикстуру для создания лекторов. То же касается и комментариев. Подправить уже существующу фикстуру немножко затруднительно, потому что много тестов в test_lecturer.py зависят текущего количества лекоторов в фикстуре lecturers и даже при добавлении одного их придется править.
There was a problem hiding this comment.
да, надо фикстуру создать, которую в текущем тесте просто вызовем
| assert response_6.status_code == status.HTTP_429_TOO_MANY_REQUESTS | ||
|
|
||
|
|
||
| def test_comment_total_limit( |
There was a problem hiding this comment.
Так же, если данные в БД создаются в рамках теста, обязательно нужно делать очистку. Чтобы тест был чище, лучше сделать фикстру, которая создает нужные данные и автоматически очищает их после yield.
|
В данных тестах мы проверяем логику бщего лимита комментариев и лимита комментариев на одного лектора. Соответвенно у нас есть как миниму 4 основных кейса: лимит на лекторов не превышен/превышен, общий лимит не превышен/превышен. Эти четыре кейса мы можем удобно описать в параметризации теста( |
|
Так же возможно мне стоит отметить, что название ветки не информативно(менять его не надо, потому что это вроде как приведет к закрытию PR, но можно в будущем делать более информативное название) |
petrCher
left a comment
There was a problem hiding this comment.
от себя еще добавлю, что захардкоженные числа по типу 20, 21 и тд что в коде и в названии переменных присутствуют - не очень хорошая практика, ориентируемся на поля для максимальных комментариев из settings, относительно них работаем, так как настоящие значения могут отличаться от дефолтных
понимаю что в тестах можно и дефолтные взять и по сути ни на что не повлияет, но если поменять дефолтное значение то логика может рухнуть)
| """ | ||
| Тест общего лимита комментариев пользователя за период | ||
| """ | ||
| dbsession.query(LecturerUserComment).delete() |
There was a problem hiding this comment.
да, всю работу с бд лучше выносить в фикстуры, в самих тестах только вызов эндпоинтов и проверка логики работы
| from rating_api.models import Lecturer | ||
|
|
||
| extra_lecturers = [] | ||
| for i in range(5): |
There was a problem hiding this comment.
да, надо фикстуру создать, которую в текущем тесте просто вызовем
|
насчет названия ветки да, лучше более информативное название давать) |
|
все комменты максима, которые отметил лайком надо переделать просмотрел бегло пока что, когда все будет исправлено внимательно изучу |
|
Немножко добавлю, логику в ручке можно условно поделить на ту, что работает атомарно между вызовами с теми же параметрами, и ту что меняет поведение ручки между вызовами с теми же параметрами. Логика лимита относится к второй категории, потому что ручка создаёт комменты. Часто в тестах это решается множественным вызовом эндпоинта или созданием нескольких фикстур с разными наборами данных. Но при таком подходе нам потребуется создавать фикстуры под каждый кейс. Если же мы используем множественный вызов эндпоинта, то мы не сможем вплести эту проверку в общий тест с атомарной логикой. Решением здесь является использование фикстуры-фабрики вместо обычной - так создание данных становится управляемым через параметризацию. Мы явно задаём состояние БД по комментам в каждом кейсе. |

Добавлен тест на общий лимит комментов от одного пользователя и тест на лимит комментов одному лектору
Изменения
Детали реализации
Check-List
blackиisortдля Back-End илиPrettierдля Front-End?