Skip to content
Open
Show file tree
Hide file tree
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
131 changes: 101 additions & 30 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,41 +216,32 @@ def nonanonymous_comment(dbsession, lecturer):
dbsession.commit()


@pytest.fixture(scope='function')
def lecturers(dbsession):
@pytest.fixture
def lecturers(dbsession, lecturer_factory):
"""
Creates 4 lecturers(one with flag is_deleted=True)
Создает 4 лекторов через фабрику (один с флагом is_deleted=True)
"""
lecturers_data = [
(1, "test_fname1", "test_lname1", "test_mname1", 9900),
(2, "test_fname2", "test_lname2", "test_mname2", 9901),
(3, "Bibka", "Bobka", "Bobkovich", 9902),
]
created_lecturers = lecturer_factory(4)

lecturers = [
Lecturer(id=lecturer_id, first_name=fname, last_name=lname, middle_name=mname, timetable_id=timetable_id)
for lecturer_id, fname, lname, mname, timetable_id in lecturers_data
]
lecturers.append(
Lecturer(id=4, first_name='test_fname3', last_name='test_lname3', middle_name='test_mname3', timetable_id=9903)
)
lecturers[-1].is_deleted = True
for lecturer in lecturers:
dbsession.add(lecturer)
dbsession.commit()
yield lecturers
for lecturer in lecturers:
for row in lecturer.comments:
dbsession.delete(row)
lecturer_user_comments = dbsession.query(LecturerUserComment).filter(
LecturerUserComment.lecturer_id == lecturer.id
)
for row in lecturer_user_comments:
dbsession.delete(row)
dbsession.flush()
dbsession.delete(lecturer)
deleted_lecturer = created_lecturers[3]
deleted_lecturer.is_deleted = True
dbsession.commit()

yield created_lecturers

lecturer_ids = [l.id for l in created_lecturers]

dbsession.query(Comment).filter(Comment.lecturer_id.in_(lecturer_ids)).delete(
synchronize_session=False
)
dbsession.query(LecturerUserComment).filter(
LecturerUserComment.lecturer_id.in_(lecturer_ids)
).delete(synchronize_session=False)

dbsession.query(Lecturer).filter(Lecturer.id.in_(lecturer_ids)).delete(
synchronize_session=False
)
dbsession.commit()

@pytest.fixture
def lecturers_with_comments(dbsession, lecturers):
Expand Down Expand Up @@ -308,3 +299,83 @@ def lecturers_with_comments(dbsession, lecturers):
dbsession.refresh(comment)
dbsession.delete(comment)
dbsession.commit()


@pytest.fixture
def lecturer_factory(dbsession):
"""
Создает лекторов
"""
created = []

def create_lecturers(count: int=1) -> list[Lecturer]:
lecturers = []
for i in range(count):
cur_id = len(created)+1
lecturer = Lecturer(
first_name=f"fname_{cur_id}",
last_name=f"lname_{cur_id}",
middle_name=f"mname_{cur_id}",
timetable_id=i+1,
)
lecturers.append(lecturer)
created.append(lecturer)

dbsession.add_all(lecturers)
dbsession.commit()
return lecturers

yield create_lecturers

for l in created:
if dbsession.is_active and l in dbsession:
dbsession.delete(l)
try:
dbsession.commit()
except Exception:
dbsession.rollback()


@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()
89 changes: 86 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 @@ -74,7 +74,7 @@ def post_side_effect(url, *args, **kwargs):


@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 +88,8 @@ def post_side_effect(url, *args, **kwargs):
status.HTTP_200_OK,
status.HTTP_200_OK,
0,
0,
0,
),
( # тест логики блокирующей выдачу ачивки за первый комментарий, если она уже есть у юзера
{
Expand All @@ -101,6 +103,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 +118,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 +133,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 +148,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 +163,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 +178,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 +194,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 +210,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 +225,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 +241,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 +260,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 +278,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 +294,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 +310,76 @@ 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,
lecturer_factory,
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
needed_lecturers_count = (remaining + settings.COMMENT_TO_LECTURER_LIMIT - 1) // (settings.COMMENT_TO_LECTURER_LIMIT - 1)
extra_lecturers = lecturer_factory(needed_lecturers_count)

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 +518,7 @@ def test_create_comment(
{
"comments": [
{
"subdject": "string",
"subject": "string",
"text": "string",
"mark_kindness": 0,
"mark_freebie": 0,
Expand Down
Loading