Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 154 additions & 3 deletions tests/test_routes/test_comment.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import pytest
from starlette import status

from rating_api.models import Comment, CommentReaction, LecturerUserComment, Reaction, ReviewStatus
from rating_api.models import Comment, CommentReaction, Lecturer, LecturerUserComment, Reaction, ReviewStatus
from rating_api.settings import get_settings

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -73,8 +73,79 @@ def post_side_effect(url, *args, **kwargs):
return mock_aiohttp_session


@pytest.fixture
def extra_lecturers(dbsession):
"""Создает лекторов для наполнения общего лимита комментариев"""
needed_lecturers = (settings.COMMENT_LIMIT // settings.COMMENT_TO_LECTURER_LIMIT) + 1

lecturers = []
for i in range(needed_lecturers):
lecturer = Lecturer(
id=900 + i,
first_name=f"fname{i}",
last_name=f"lname{i}",
middle_name=f"mname{i}",
timetable_id=900 + i,
)
lecturers.append(lecturer)

dbsession.add_all(lecturers)
dbsession.commit()

yield lecturers

for lecturer in lecturers:
dbsession.delete(lecturer)
dbsession.commit()


@pytest.fixture
def comment_factory(dbsession, authlib_user):
"""
Создает комментарии
"""
user_id = authlib_user.get("id")
created_comment_uuids = []
created_user_comment_ids = []

def create_comments(lecturer_id: int, count: int):
for _ in range(count):
comment = Comment(
user_id=user_id,
lecturer_id=lecturer_id,
subject="Subject",
text="Text",
mark_kindness=1,
mark_freebie=0,
mark_clarity=0,
review_status=ReviewStatus.PENDING,
)
dbsession.add(comment)
dbsession.flush()
created_comment_uuids.append(comment.uuid)

user_comment = LecturerUserComment(lecturer_id=lecturer_id, user_id=user_id)
dbsession.add(user_comment)
dbsession.flush()
created_user_comment_ids.append(user_comment.id)

dbsession.commit()

yield create_comments

if created_user_comment_ids:
dbsession.query(LecturerUserComment).filter(LecturerUserComment.id.in_(created_user_comment_ids)).delete(
synchronize_session=False
)

if created_comment_uuids:
dbsession.query(Comment).filter(Comment.uuid.in_(created_comment_uuids)).delete(synchronize_session=False)

dbsession.commit()


@pytest.mark.parametrize(
'body,lecturer_n,response_status,aiohttp_response_status,achievement_id',
'body,lecturer_n,response_status,aiohttp_response_status,achievement_id,lecturer_comments_limit,total_comments_limit',
[
( # тест логики выдачи ачивки за первый комментарий
{
Expand All @@ -88,6 +159,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_200_OK,
0,
0,
0,
),
( # тест логики блокирующей выдачу ачивки за первый комментарий, если она уже есть у юзера
{
Expand All @@ -101,6 +174,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # тест логики выдачи ачивки в случае неудачного get-запроса к серверу
{
Expand All @@ -114,6 +189,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_500_INTERNAL_SERVER_ERROR,
0,
0,
0,
),
(
{
Expand All @@ -127,6 +204,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
(
{
Expand All @@ -140,6 +219,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # bad mark
{
Expand All @@ -153,6 +234,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_400_BAD_REQUEST,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # deleted lecturer
{
Expand All @@ -166,6 +249,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_404_NOT_FOUND,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # Anonymous comment
{
Expand All @@ -180,6 +265,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # NotAnonymous comment
{
Expand All @@ -194,6 +281,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # Not provided anonymity
{
Expand All @@ -207,6 +296,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # Bad anonymity
{
Expand All @@ -221,6 +312,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_422_UNPROCESSABLE_ENTITY,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # regex test
{
Expand All @@ -238,6 +331,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # forbidden symbols
{
Expand All @@ -254,6 +349,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_400_BAD_REQUEST,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # long comment
{
Expand All @@ -268,6 +365,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_400_BAD_REQUEST,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
( # long comment but not that long
{
Expand All @@ -282,21 +381,73 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
0,
),
(
# Превышен лимит комментов от одного пользователя на одного лектора
{"subject": "test_subject", "text": "test text", "mark_kindness": 1, "mark_freebie": 0, "mark_clarity": 0},
0,
status.HTTP_429_TOO_MANY_REQUESTS,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
settings.COMMENT_TO_LECTURER_LIMIT,
0,
),
(
# Превышен общий лимит комментов от пользователя
{"subject": "test_subject", "text": "test text", "mark_kindness": 1, "mark_freebie": 0, "mark_clarity": 0},
0,
status.HTTP_429_TOO_MANY_REQUESTS,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
0,
settings.COMMENT_LIMIT,
),
(
# Превышены оба лимита
{"subject": "test_subject", "text": "test text", "mark_kindness": 1, "mark_freebie": 0, "mark_clarity": 0},
0,
status.HTTP_429_TOO_MANY_REQUESTS,
status.HTTP_200_OK,
settings.FIRST_COMMENT_ACHIEVEMENT_ID,
settings.COMMENT_TO_LECTURER_LIMIT,
settings.COMMENT_LIMIT,
),
],
)
def test_create_comment(
client,
dbsession,
lecturers,
extra_lecturers,
comment_factory,
authlib_user,
mocker,
body,
lecturer_n,
response_status,
aiohttp_response_status,
achievement_id,
lecturer_comments_limit,
total_comments_limit,
):
target_lecturer_id = lecturers[lecturer_n].id

# наполнение БД под лимит комментов лектору
if lecturer_comments_limit > 0:
comment_factory(target_lecturer_id, lecturer_comments_limit)

# наполнение БД под общий лимит пользователя
if total_comments_limit > 0:
remaining = total_comments_limit - lecturer_comments_limit
for lecturer in extra_lecturers:
if remaining <= 0:
break
count = min(remaining, settings.COMMENT_TO_LECTURER_LIMIT - 1)
comment_factory(lecturer.id, count)
remaining -= count

# url для проверки логики выдачи ачивок
achive_get_url = settings.API_URL + f"achievement/user/{authlib_user.get('id'):}"
achive_post_url = (
Expand Down Expand Up @@ -435,7 +586,7 @@ def test_create_comment(
{
"comments": [
{
"subdject": "string",
"subject": "string",
"text": "string",
"mark_kindness": 0,
"mark_freebie": 0,
Expand Down
Loading