Skip to content

добавлены тест на общий лимит комментариев от одного пользователя и т… - #179

Open
businkv wants to merge 2 commits into
mainfrom
testcomm2
Open

добавлены тест на общий лимит комментариев от одного пользователя и т…#179
businkv wants to merge 2 commits into
mainfrom
testcomm2

Conversation

@businkv

@businkv businkv commented Aug 29, 2026

Copy link
Copy Markdown
Contributor

Добавлен тест на общий лимит комментов от одного пользователя и тест на лимит комментов одному лектору

Изменения

Детали реализации

Check-List

  • Вы проверили свой код перед отправкой запроса?
  • Вы написали тесты к реализованным функциям?
  • Вы не забыли применить форматирование black и isort для Back-End или Prettier для Front-End?

@github-actions

Copy link
Copy Markdown

Code Coverage

Coverage Report
FileStmtsMissCoverMissing
rating_api
   __main__.py440%1–6
   exceptions.py43198%58
rating_api/models
   base.py64494%24–27
   db.py1621889%114, 116, 118, 120, 131, 170, 188, 198, 212, 221–223, 257, 271–283
rating_api/routes
   base.py16194%40
   comment.py1512583%191, 264–265, 267–268, 276–281, 290, 297–299, 329, 352, 392–403, 430
   exc_handlers.py32197%50
   lecturer.py109992%71–72, 82, 88–89, 229, 237, 259, 265
rating_api/schemas
   base.py12467%6–9
   models.py155398%189, 191, 201
rating_api/utils
   mark.py880%1–19
TOTAL7907890% 

Summary

Tests Skipped Failures Errors Time
96 0 💤 9 ❌ 0 🔥 22.247s ⏱️

@businkv
businkv requested a review from petrCher August 29, 2026 17:15
@petrCher
petrCher requested a review from CaseAsLimbo August 29, 2026 17:18
@businkv businkv assigned CaseAsLimbo and unassigned CaseAsLimbo Aug 29, 2026
Тест лимита на одного лектора
"""
new_user = authlib_user.copy()
new_user["id"] = 99999

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем менять id юзера? Кажется не за чем, тесты запускаются изолированно, это ни на что не влияет.

Comment thread tests/test_routes/test_comment.py
assert comment.dislike_count == 0


def test_comment_lecturer_limit(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нет очистки БД от созданных объектов комментариев. Очистку необходимо проводить, чтобы обеспечить независимость запуска тестов. Сейчас несколько тестов из test_lecturer.py падают, потому что в БД

Image

остались лишние комменты:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://github.com/profcomff/rating-api/actions/runs/33264837617/job/99132955286?pr=179
здесь подробный вывод в print report
Снимок экрана — 2026-09-01 в 14 44 02

"""
Тест общего лимита комментариев пользователя за период
"""
dbsession.query(LecturerUserComment).delete()

@CaseAsLimbo CaseAsLimbo Aug 30, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если это очистка после предыдущего теста, то она не будет работать корректно. Да, в рамках одного файла тесты запускаются в порядке их объявления, но могут быть и другие файлы(test_lecturer.py). Не стоит полагаться на этот порядок. Очистку лучше проводить в том же тесте, в котором были созданы объекты, чтобы тесты были независимы(или в фикстуре, см. ниже)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да, всю работу с бд лучше выносить в фикстуры, в самих тестах только вызов эндпоинтов и проверка логики работы

for lecturer in extra_lecturers:
dbsession.refresh(lecturer)

new_user = {"id": 99999, "email": "test@example.com"}

@CaseAsLimbo CaseAsLimbo Aug 30, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так же не понимаю, как пользователь с другим id и почтой влияет на логику проверки лимита комментариев. Помимо этого, хардкодить тестовые данные в тесте не очень хорошо, тест становистся хрупким. Для этого как раз есть фикстура authlib_user.

from rating_api.models import Lecturer

extra_lecturers = []
for i in range(5):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хорошо, когда создание данных для теста и логика проверки в тесте разделены. Здесь мне кажется лучше создать отдельную фикстуру для создания лекторов. То же касается и комментариев. Подправить уже существующу фикстуру немножко затруднительно, потому что много тестов в test_lecturer.py зависят текущего количества лекоторов в фикстуре lecturers и даже при добавлении одного их придется править.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да, надо фикстуру создать, которую в текущем тесте просто вызовем

assert response_6.status_code == status.HTTP_429_TOO_MANY_REQUESTS


def test_comment_total_limit(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так же, если данные в БД создаются в рамках теста, обязательно нужно делать очистку. Чтобы тест был чище, лучше сделать фикстру, которая создает нужные данные и автоматически очищает их после yield.

@CaseAsLimbo

CaseAsLimbo commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

В данных тестах мы проверяем логику бщего лимита комментариев и лимита комментариев на одного лектора. Соответвенно у нас есть как миниму 4 основных кейса: лимит на лекторов не превышен/превышен, общий лимит не превышен/превышен. Эти четыре кейса мы можем удобно описать в параметризации теста(@pytest.mark.parametrize). А данные создавать с помощью фикстуры-фабрики(то есть фикстуры возвращающей фукнцию, создающую переданное через параметризацию теста количество комментариев или лекторов). А очистку проводить после yield в этой же фикстуре. Так тест будет чистым, данные будут создаваться отдельно в фикстуре и корректно удаляться после каждого теста.

@CaseAsLimbo

CaseAsLimbo commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Так же возможно мне стоит отметить, что название ветки не информативно(менять его не надо, потому что это вроде как приведет к закрытию PR, но можно в будущем делать более информативное название)
https://conventionalbranch.org/

@petrCher petrCher left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

от себя еще добавлю, что захардкоженные числа по типу 20, 21 и тд что в коде и в названии переменных присутствуют - не очень хорошая практика, ориентируемся на поля для максимальных комментариев из settings, относительно них работаем, так как настоящие значения могут отличаться от дефолтных

понимаю что в тестах можно и дефолтные взять и по сути ни на что не повлияет, но если поменять дефолтное значение то логика может рухнуть)

"""
Тест общего лимита комментариев пользователя за период
"""
dbsession.query(LecturerUserComment).delete()

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да, всю работу с бд лучше выносить в фикстуры, в самих тестах только вызов эндпоинтов и проверка логики работы

from rating_api.models import Lecturer

extra_lecturers = []
for i in range(5):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да, надо фикстуру создать, которую в текущем тесте просто вызовем

Comment thread tests/test_routes/test_comment.py
@petrCher

petrCher commented Sep 1, 2026

Copy link
Copy Markdown
Member

насчет названия ветки да, лучше более информативное название давать)

@petrCher

petrCher commented Sep 1, 2026

Copy link
Copy Markdown
Member

все комменты максима, которые отметил лайком надо переделать

просмотрел бегло пока что, когда все будет исправлено внимательно изучу
единственный вопрос @businkv не совсем понял почему тесты на лимит создания не внесены в тесты на создание коммента просто, которые уже готовы

@CaseAsLimbo

CaseAsLimbo commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Немножко добавлю, логику в ручке можно условно поделить на ту, что работает атомарно между вызовами с теми же параметрами, и ту что меняет поведение ручки между вызовами с теми же параметрами. Логика лимита относится к второй категории, потому что ручка создаёт комменты. Часто в тестах это решается множественным вызовом эндпоинта или созданием нескольких фикстур с разными наборами данных. Но при таком подходе нам потребуется создавать фикстуры под каждый кейс. Если же мы используем множественный вызов эндпоинта, то мы не сможем вплести эту проверку в общий тест с атомарной логикой. Решением здесь является использование фикстуры-фабрики вместо обычной - так создание данных становится управляемым через параметризацию. Мы явно задаём состояние БД по комментам в каждом кейсе.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants