diff --git a/rating_api/routes/lecturer.py b/rating_api/routes/lecturer.py index 2175cb9..65e000e 100644 --- a/rating_api/routes/lecturer.py +++ b/rating_api/routes/lecturer.py @@ -6,22 +6,16 @@ from fastapi.exceptions import ValidationException from fastapi_filter import FilterDepends from fastapi_sqlalchemy import db -from sqlalchemy import and_ - from rating_api.exceptions import AlreadyExists, ObjectNotFound -from rating_api.models import Comment, Lecturer, LecturerUserComment, ReviewStatus +from rating_api.models import (Comment, Lecturer, LecturerUserComment, + ReviewStatus) from rating_api.schemas.base import StatusResponseModel -from rating_api.schemas.models import ( - CommentGet, - LecturerGet, - LecturerGetAll, - LecturerPatch, - LecturerPost, - LecturersFilter, - LecturerUpdateRatingPatch, - LecturerWithRank, -) - +from rating_api.schemas.models import (CommentGet, LecturerGet, LecturerGetAll, + LecturerPatch, LecturerPost, + LecturersFilter, + LecturerUpdateRatingPatch, + LecturerWithRank) +from sqlalchemy import and_ lecturer = APIRouter(prefix="/lecturer", tags=["Lecturer"]) @@ -29,7 +23,9 @@ @lecturer.post("", response_model=LecturerGet) async def create_lecturer( lecturer_info: LecturerPost, - _=Depends(UnionAuth(scopes=["rating.lecturer.create"], allow_none=False, auto_error=True)), + _=Depends( + UnionAuth(scopes=["rating.lecturer.create"], allow_none=False, auto_error=True) + ), ) -> LecturerGet: """ Scopes: `["rating.lecturer.create"]` @@ -37,10 +33,14 @@ async def create_lecturer( Создает преподавателя в базе данных RatingAPI """ get_lecturer: Lecturer = ( - Lecturer.query(session=db.session).filter(Lecturer.timetable_id == lecturer_info.timetable_id).one_or_none() + Lecturer.query(session=db.session) + .filter(Lecturer.timetable_id == lecturer_info.timetable_id) + .one_or_none() ) if get_lecturer is None: - new_lecturer: Lecturer = Lecturer.create(session=db.session, **lecturer_info.model_dump()) + new_lecturer: Lecturer = Lecturer.create( + session=db.session, **lecturer_info.model_dump() + ) db.session.commit() return LecturerGet.model_validate(new_lecturer) raise AlreadyExists(Lecturer, lecturer_info.timetable_id) @@ -49,7 +49,11 @@ async def create_lecturer( @lecturer.patch("/import_rating", response_model=LecturerUpdateRatingPatch) async def update_lecturer_rating( lecturer_rank_info: list[LecturerWithRank], - _=Depends(UnionAuth(scopes=["rating.lecturer.update_rating"], allow_none=False, auto_error=True)), + _=Depends( + UnionAuth( + scopes=["rating.lecturer.update_rating"], allow_none=False, auto_error=True + ) + ), ) -> LecturerUpdateRatingPatch: """ Scopes: `["rating.lecturer.update_rating"]` @@ -71,12 +75,18 @@ async def update_lecturer_rating( success_fl = False lecturer_rank_dumped = lecturer_rank.model_dump() - lecturer_rank_dumped["rank_update_ts"] = datetime.datetime.now(tz=datetime.timezone.utc) + lecturer_rank_dumped["rank_update_ts"] = datetime.datetime.now( + tz=datetime.timezone.utc + ) lecturer_id = lecturer_rank_dumped.pop("id") if Lecturer.get(id=lecturer_id, session=db.session): - updated_lecturers.append(Lecturer.update(id=lecturer_id, session=db.session, **lecturer_rank_dumped)) + updated_lecturers.append( + Lecturer.update( + id=lecturer_id, session=db.session, **lecturer_rank_dumped + ) + ) else: success_fl = False @@ -91,8 +101,19 @@ async def update_lecturer_rating( return response_validated +@lecturer.get("/timetable-id/{timetable_id}", response_model=LecturerGet) +async def get_lecturer_by_timetable_id(timetable_id: int) -> LecturerGet: + lecturer: Lecturer = Lecturer.query(session=db.session).filter(Lecturer.timetable_id == timetable_id).one_or_none() + if lecturer is None: + raise ObjectNotFound(Lecturer, timetable_id) + result = LecturerGet.model_validate(lecturer) + return result + + @lecturer.get("/{id}", response_model=LecturerGet) -async def get_lecturer(id: int, info: list[Literal["comments"]] = Query(default=[])) -> LecturerGet: +async def get_lecturer( + id: int, info: list[Literal["comments"]] = Query(default=[]) +) -> LecturerGet: """ Scopes: `["rating.lecturer.read"]` @@ -102,7 +123,9 @@ async def get_lecturer(id: int, info: list[Literal["comments"]] = Query(default= Если передано `'comments'`, то возвращаются одобренные комментарии к преподавателю. Subject лектора возвращшается либо из базы данных, либо из любого аппрувнутого комментария """ - lecturer: Lecturer = Lecturer.query(session=db.session).filter(Lecturer.id == id).one_or_none() + lecturer: Lecturer = ( + Lecturer.query(session=db.session).filter(Lecturer.id == id).one_or_none() + ) if lecturer is None: raise ObjectNotFound(Lecturer, id) result = LecturerGet.model_validate(lecturer) @@ -114,7 +137,9 @@ async def get_lecturer(id: int, info: list[Literal["comments"]] = Query(default= if comment.review_status is ReviewStatus.APPROVED ] if "comments" in info and approved_comments: - result.comments = sorted(approved_comments, key=lambda comment: comment.create_ts, reverse=True) + result.comments = sorted( + approved_comments, key=lambda comment: comment.create_ts, reverse=True + ) if approved_comments: result.subjects = list({comment.subject for comment in approved_comments}) return result @@ -159,7 +184,9 @@ async def get_lecturers( больше, чем переданный 'mark'. """ lecturers_query = lecturer_filter.filter( - Lecturer.query(session=db.session).outerjoin(Lecturer.comments).group_by(Lecturer.id) + Lecturer.query(session=db.session) + .outerjoin(Lecturer.comments) + .group_by(Lecturer.id) ) lecturers_query = lecturer_filter.sort(lecturers_query) lecturers = lecturers_query.offset(offset).limit(limit).all() @@ -178,18 +205,24 @@ async def get_lecturers( if ( mark is not None and approved_comments - and sum(comment.mark_general for comment in approved_comments) / len(approved_comments) <= mark + and sum(comment.mark_general for comment in approved_comments) + / len(approved_comments) + <= mark ): continue if "comments" in info and approved_comments: lecturer_to_result.comments = sorted( - approved_comments, key=lambda comment: comment.create_ts, reverse=True + approved_comments, + key=lambda comment: comment.create_ts, + reverse=True, ) if approved_comments: - lecturer_to_result.subjects = list({comment.subject for comment in approved_comments}) + lecturer_to_result.subjects = list( + {comment.subject for comment in approved_comments} + ) result.lecturers.append(lecturer_to_result) if len(result.lecturers) == 0: - raise ObjectNotFound(Lecturer, 'all') + raise ObjectNotFound(Lecturer, "all") return result @@ -197,7 +230,9 @@ async def get_lecturers( async def update_lecturer( id: int, lecturer_info: LecturerPatch, - _=Depends(UnionAuth(scopes=["rating.lecturer.update"], allow_none=False, auto_error=True)), + _=Depends( + UnionAuth(scopes=["rating.lecturer.update"], allow_none=False, auto_error=True) + ), ) -> LecturerGet: """ Scopes: `["rating.lecturer.update"]` @@ -208,14 +243,20 @@ async def update_lecturer( check_timetable_id = ( Lecturer.query(session=db.session) - .filter(and_(Lecturer.timetable_id == lecturer_info.timetable_id, Lecturer.id != id)) + .filter( + and_(Lecturer.timetable_id == lecturer_info.timetable_id, Lecturer.id != id) + ) .one_or_none() ) if check_timetable_id: raise AlreadyExists(Lecturer, lecturer_info.timetable_id) result = LecturerGet.model_validate( - Lecturer.update(lecturer.id, **lecturer_info.model_dump(exclude_unset=True), session=db.session) + Lecturer.update( + lecturer.id, + **lecturer_info.model_dump(exclude_unset=True), + session=db.session + ) ) result.comments = None return result @@ -223,7 +264,10 @@ async def update_lecturer( @lecturer.delete("/{id}", response_model=StatusResponseModel) async def delete_lecturer( - id: int, _=Depends(UnionAuth(scopes=["rating.lecturer.delete"], allow_none=False, auto_error=True)) + id: int, + _=Depends( + UnionAuth(scopes=["rating.lecturer.delete"], allow_none=False, auto_error=True) + ), ): """ Scopes: `["rating.lecturer.delete"]` @@ -234,11 +278,15 @@ async def delete_lecturer( for comment in check_lecturer.comments: Comment.delete(id=comment.uuid, session=db.session) - lecturer_user_comments = LecturerUserComment.query(session=db.session).filter(LecturerUserComment.lecturer_id == id) + lecturer_user_comments = LecturerUserComment.query(session=db.session).filter( + LecturerUserComment.lecturer_id == id + ) for lecturer_user_comment in lecturer_user_comments: LecturerUserComment.delete(lecturer_user_comment.id, session=db.session) Lecturer.delete(session=db.session, id=id) return StatusResponseModel( - status="Success", message="Lecturer has been deleted", ru="Преподаватель удален из RatingAPI" + status="Success", + message="Lecturer has been deleted", + ru="Преподаватель удален из RatingAPI", ) diff --git a/tests/test_routes/test_lecturer.py b/tests/test_routes/test_lecturer.py index 3d4beed..4192b7a 100644 --- a/tests/test_routes/test_lecturer.py +++ b/tests/test_routes/test_lecturer.py @@ -2,34 +2,63 @@ import pytest from fastapi_sqlalchemy import db -from sqlalchemy import and_, func, select -from starlette import status - from rating_api.models import Comment, Lecturer, ReviewStatus from rating_api.settings import get_settings - +from sqlalchemy import and_, func, select +from starlette import status logger = logging.getLogger(__name__) -url: str = '/lecturer' +url: str = "/lecturer" settings = get_settings() -@pytest.mark.parametrize('response_status', [status.HTTP_200_OK, status.HTTP_409_CONFLICT]) +@pytest.mark.parametrize( + "response_status", [status.HTTP_200_OK, status.HTTP_409_CONFLICT] +) def test_create_lecturer(client, dbsession, response_status): - body = {"first_name": 'Иван', "last_name": 'Иванов', "middle_name": 'Иванович', "timetable_id": 0} + body = { + "first_name": "Иван", + "last_name": "Иванов", + "middle_name": "Иванович", + "timetable_id": 0, + } post_response = client.post(url, json=body) assert post_response.status_code == response_status # cleanup on a last run if response_status == status.HTTP_409_CONFLICT: - lecturer = dbsession.query(Lecturer).filter(Lecturer.timetable_id == 0).one_or_none() + lecturer = ( + dbsession.query(Lecturer).filter(Lecturer.timetable_id == 0).one_or_none() + ) assert lecturer is not None dbsession.delete(lecturer) dbsession.commit() - lecturer = dbsession.query(Lecturer).filter(Lecturer.timetable_id == 0).one_or_none() + lecturer = ( + dbsession.query(Lecturer).filter(Lecturer.timetable_id == 0).one_or_none() + ) assert lecturer is None +@pytest.mark.parametrize( + 'lecturer_n, response_status', + [ + (0, status.HTTP_200_OK), + (1, status.HTTP_200_OK), + (2, status.HTTP_200_OK), + (3, status.HTTP_404_NOT_FOUND), + ], +) +def test_get_lecturer_by_timetable_id(client, dbsession, lecturers, lecturer_n, response_status): + lecturer = ( + dbsession.query(Lecturer).filter(Lecturer.timetable_id == lecturers[lecturer_n].timetable_id).one_or_none() + ) + timetable_id = -1 + if lecturer: + timetable_id = lecturer.timetable_id + get_response = client.get(f'{url}/timetable-id/{timetable_id}') + assert get_response.status_code == response_status + + @pytest.mark.parametrize( 'lecturer_n,response_status', [ @@ -41,13 +70,15 @@ def test_create_lecturer(client, dbsession, response_status): ) def test_get_lecturer(client, dbsession, lecturers, lecturer_n, response_status): lecturer = ( - dbsession.query(Lecturer).filter(Lecturer.timetable_id == lecturers[lecturer_n].timetable_id).one_or_none() + dbsession.query(Lecturer) + .filter(Lecturer.timetable_id == lecturers[lecturer_n].timetable_id) + .one_or_none() ) # check non-existing id request lecturer_id = -1 if lecturer: lecturer_id = lecturer.id - get_response = client.get(f'{url}/{lecturer_id}') + get_response = client.get(f"{url}/{lecturer_id}") assert get_response.status_code == response_status if response_status == status.HTTP_200_OK: json_response = get_response.json() @@ -60,7 +91,7 @@ def test_get_lecturer(client, dbsession, lecturers, lecturer_n, response_status) @pytest.mark.parametrize( - 'lecturer_n,mark_kindness_weighted,mark_freebie_weighted,mark_clarity_weighted,mark_weighted', + "lecturer_n,mark_kindness_weighted,mark_freebie_weighted,mark_clarity_weighted,mark_weighted", [(0, 1.5, 1.5, 1.5, 1.5), (1, 0, 0, 0, 0), (2, 0.5, 0.5, 0.5, 0.5)], ) def test_get_lecturer_with_comments( @@ -73,8 +104,8 @@ def test_get_lecturer_with_comments( mark_weighted, ): lecturers, comments = lecturers_with_comments - query = {"info": ['comments']} - response = client.get(f'{url}/{lecturers[lecturer_n].id}', params=query) + query = {"info": ["comments"]} + response = client.get(f"{url}/{lecturers[lecturer_n].id}", params=query) assert response.status_code == status.HTTP_200_OK json_response = response.json() assert comments[lecturer_n * 6 + 0].subject in json_response["subjects"] @@ -84,16 +115,16 @@ def test_get_lecturer_with_comments( @pytest.mark.parametrize( - 'query,total,response_status', + "query,total,response_status", [ - ({'name': 'test_lname1'}, 1, status.HTTP_200_OK), - ({'name': 'TeSt_LnAmE1'}, 1, status.HTTP_200_OK), - ({'name': 'test'}, 2, status.HTTP_200_OK), - ({'name': 'testlname123'}, 0, status.HTTP_404_NOT_FOUND), + ({"name": "test_lname1"}, 1, status.HTTP_200_OK), + ({"name": "TeSt_LnAmE1"}, 1, status.HTTP_200_OK), + ({"name": "test"}, 2, status.HTTP_200_OK), + ({"name": "testlname123"}, 0, status.HTTP_404_NOT_FOUND), ], ) def test_get_lecturers_by_name(client, lecturers, query, total, response_status): - get_response = client.get(f'{url}', params=query) + get_response = client.get(f"{url}", params=query) assert get_response.status_code == response_status if response_status == status.HTTP_200_OK: json_response = get_response.json() @@ -101,18 +132,18 @@ def test_get_lecturers_by_name(client, lecturers, query, total, response_status) assert json_response["lecturers"][0]["first_name"] == lecturers[0].first_name -@pytest.mark.usefixtures('lecturers_with_comments') +@pytest.mark.usefixtures("lecturers_with_comments") @pytest.mark.parametrize( - 'query, response_status', + "query, response_status", [ - ({'subject': 'test_subject'}, status.HTTP_200_OK), - ({'subject': 'test_subject13'}, status.HTTP_200_OK), - ({'subject': 'test_subject666'}, status.HTTP_404_NOT_FOUND), + ({"subject": "test_subject"}, status.HTTP_200_OK), + ({"subject": "test_subject13"}, status.HTTP_200_OK), + ({"subject": "test_subject666"}, status.HTTP_404_NOT_FOUND), ], ids=[ - 'get_all', - 'get_some', - 'wrong_subject', + "get_all", + "get_some", + "wrong_subject", ], ) def test_get_lecturers_by_subject(client, dbsession, query, response_status): @@ -120,61 +151,75 @@ def test_get_lecturers_by_subject(client, dbsession, query, response_status): Проверка, что при передаче subject возвращаются только лекторы, в одобренных комментариях к которым есть поле subject, совпадающее с переданным. """ - resp = client.get(f'{url}', params=query) + resp = client.get(f"{url}", params=query) assert resp.status_code == response_status if response_status == status.HTTP_200_OK: db_lecturers = { comment.lecturer_id for comment in Comment.query(session=dbsession).filter( - and_(Comment.review_status == ReviewStatus.APPROVED, Comment.subject == query['subject']) + and_( + Comment.review_status == ReviewStatus.APPROVED, + Comment.subject == query["subject"], + ) ) } - resp_lecturers = {lecturer['id'] for lecturer in resp.json()['lecturers']} + resp_lecturers = {lecturer["id"] for lecturer in resp.json()["lecturers"]} assert resp_lecturers == db_lecturers -@pytest.mark.usefixtures('lecturers_with_comments') +@pytest.mark.usefixtures("lecturers_with_comments") @pytest.mark.parametrize( - 'query, response_status', + "query, response_status", [ - ({'mark': -2}, status.HTTP_200_OK), - ({'mark': 0}, status.HTTP_200_OK), - ({'mark': 2}, status.HTTP_404_NOT_FOUND), - ({'mark': -3}, status.HTTP_422_UNPROCESSABLE_ENTITY), - ({'mark': 3}, status.HTTP_422_UNPROCESSABLE_ENTITY), + ({"mark": -2}, status.HTTP_200_OK), + ({"mark": 0}, status.HTTP_200_OK), + ({"mark": 2}, status.HTTP_404_NOT_FOUND), + ({"mark": -3}, status.HTTP_422_UNPROCESSABLE_ENTITY), + ({"mark": 3}, status.HTTP_422_UNPROCESSABLE_ENTITY), ], - ids=['get_all', 'get_some', 'get_nothing', 'under_min', 'above_max'], + ids=["get_all", "get_some", "get_nothing", "under_min", "above_max"], ) def test_get_lecturers_by_mark(client, dbsession, query, response_status): """ Проверка, что при передаче mark возвращаются только лекторы со средним mark_general (по комментариям) не меньше, чем переданный mark. """ - resp = client.get(f'{url}', params=query) + resp = client.get(f"{url}", params=query) assert resp.status_code == response_status if response_status == status.HTTP_200_OK: res = dbsession.execute( ( - select(Lecturer.id.label('lecturer'), func.avg(Comment.mark_general).label('avg')) - .join(Comment, and_(Comment.review_status == ReviewStatus.APPROVED, Lecturer.id == Comment.lecturer_id)) + select( + Lecturer.id.label("lecturer"), + func.avg(Comment.mark_general).label("avg"), + ) + .join( + Comment, + and_( + Comment.review_status == ReviewStatus.APPROVED, + Lecturer.id == Comment.lecturer_id, + ), + ) .group_by(Lecturer.id) - .having(func.avg(Comment.mark_general) > query['mark']) + .having(func.avg(Comment.mark_general) > query["mark"]) ) ).all() - resp_lecturers = {lecturer['id'] for lecturer in resp.json()['lecturers']} + resp_lecturers = {lecturer["id"] for lecturer in resp.json()["lecturers"]} db_lecturers = {req[0] for req in res} - assert resp_lecturers == db_lecturers, 'Убедитесь, что все подходящие лекторы отправляются пользователю!' + assert ( + resp_lecturers == db_lecturers + ), "Убедитесь, что все подходящие лекторы отправляются пользователю!" -@pytest.mark.usefixtures('lecturers_with_comments') +@pytest.mark.usefixtures("lecturers_with_comments") @pytest.mark.parametrize( - 'query, response_status', + "query, response_status", [ - ({'info': ['comments']}, status.HTTP_200_OK), - ({'info': ['comments']}, status.HTTP_200_OK), - ({'info': []}, status.HTTP_200_OK), - ({'info': {}}, status.HTTP_422_UNPROCESSABLE_ENTITY), - ({'info': ['pupupu']}, status.HTTP_422_UNPROCESSABLE_ENTITY), + ({"info": ["comments"]}, status.HTTP_200_OK), + ({"info": ["comments"]}, status.HTTP_200_OK), + ({"info": []}, status.HTTP_200_OK), + ({"info": {}}, status.HTTP_422_UNPROCESSABLE_ENTITY), + ({"info": ["pupupu"]}, status.HTTP_422_UNPROCESSABLE_ENTITY), ], ids=["comments", "comments", "no_info", "invalid_iterator", "invalid_param"], ) @@ -183,95 +228,114 @@ def test_get_lecturers_by_info(client, dbsession, query, response_status): Проверка, что при передаче info разного состава возвращаются лекторы с полями комментариев и/или оценок на основе них для каждого лектора. """ - resp = client.get(f'{url}', params=query) + resp = client.get(f"{url}", params=query) assert resp.status_code == response_status if response_status == status.HTTP_200_OK: - if 'comments' in query['info']: + if "comments" in query["info"]: db_res = dbsession.execute( ( - select(Lecturer.id.label('lecturer'), func.count(Comment.uuid)) + select(Lecturer.id.label("lecturer"), func.count(Comment.uuid)) .join( Comment, - and_(Comment.review_status == ReviewStatus.APPROVED, Lecturer.id == Comment.lecturer_id), + and_( + Comment.review_status == ReviewStatus.APPROVED, + Lecturer.id == Comment.lecturer_id, + ), ) .group_by(Lecturer.id) ) ).all() db_lecturers = {*db_res} - assert len(resp.json()['lecturers']) == len(db_lecturers) - for lecturer in resp.json()['lecturers']: - assert (lecturer['id'], len(lecturer['comments'])) in db_lecturers + assert len(resp.json()["lecturers"]) == len(db_lecturers) + for lecturer in resp.json()["lecturers"]: + assert (lecturer["id"], len(lecturer["comments"])) in db_lecturers -@pytest.mark.usefixtures('lecturers_with_comments') +@pytest.mark.usefixtures("lecturers_with_comments") @pytest.mark.parametrize( - 'query, response_status', + "query, response_status", [ - ({'order_by': 'mark_kindness'}, status.HTTP_200_OK), + ({"order_by": "mark_kindness"}, status.HTTP_200_OK), ({}, status.HTTP_200_OK), - ({'order_by': '+mark_freebie'}, status.HTTP_200_OK), - ({'order_by': '-mark_clarity'}, status.HTTP_200_OK), - ({'order_by': 'pupupu'}, status.HTTP_422_UNPROCESSABLE_ENTITY), - ({'order_by': 'mark_kindness,mark_freebie'}, status.HTTP_422_UNPROCESSABLE_ENTITY), + ({"order_by": "+mark_freebie"}, status.HTTP_200_OK), + ({"order_by": "-mark_clarity"}, status.HTTP_200_OK), + ({"order_by": "pupupu"}, status.HTTP_422_UNPROCESSABLE_ENTITY), + ( + {"order_by": "mark_kindness,mark_freebie"}, + status.HTTP_422_UNPROCESSABLE_ENTITY, + ), + ], + ids=[ + "valid", + "valid_default", + "valid_plus", + "valid_minus", + "invalid_param", + "invalid_many_params", ], - ids=["valid", "valid_default", "valid_plus", "valid_minus", "invalid_param", "invalid_many_params"], ) def test_get_lecturers_order_by(client, dbsession, query, response_status): """ Проверка, что при передаче (или нет) параметра order_by возвращаемый список лекторов верно сортируется. """ - resp = client.get(f'{url}', params=query) + resp = client.get(f"{url}", params=query) assert resp.status_code == response_status if response_status == status.HTTP_200_OK: - if 'order_by' not in query: - field_name = 'mark_weighted' + if "order_by" not in query: + field_name = "mark_weighted" asc_order = True - elif query['order_by'].startswith('+'): - field_name = query['order_by'][1:] + elif query["order_by"].startswith("+"): + field_name = query["order_by"][1:] asc_order = True - elif query['order_by'].startswith('-'): - field_name = query['order_by'][1:] + elif query["order_by"].startswith("-"): + field_name = query["order_by"][1:] asc_order = False else: - field_name = query['order_by'] + field_name = query["order_by"] asc_order = True with db(): db_res = ( Lecturer.query(session=dbsession) - .join(Comment, and_(Comment.review_status == ReviewStatus.APPROVED, Lecturer.id == Comment.lecturer_id)) + .join( + Comment, + and_( + Comment.review_status == ReviewStatus.APPROVED, + Lecturer.id == Comment.lecturer_id, + ), + ) .group_by(Lecturer.id) .order_by(*Lecturer.order_by_mark(field_name, asc_order)) .all() ) db_lecturers = [lecturer.id for lecturer in db_res] - resp_lecturers = [lecturer['id'] for lecturer in resp.json()['lecturers']] + resp_lecturers = [lecturer["id"] for lecturer in resp.json()["lecturers"]] assert resp_lecturers == db_lecturers @pytest.mark.parametrize( - 'body,response_status', + "body,response_status", [ ( { - "first_name": 'Test', - "last_name": 'Testov', - "middle_name": 'Testovich', + "first_name": "Test", + "last_name": "Testov", + "middle_name": "Testovich", }, status.HTTP_200_OK, ), ( { - "first_name": 'Testa', - "last_name": 'Testova', - "middle_name": 'Testovna', + "first_name": "Testa", + "last_name": "Testova", + "middle_name": "Testovna", }, status.HTTP_200_OK, ), ( { - "first_name": 'Test', - "last_name": 'Testov', + "first_name": "Test", + "last_name": "Testov", "middle_name": 1, }, status.HTTP_422_UNPROCESSABLE_ENTITY, @@ -279,12 +343,12 @@ def test_get_lecturers_order_by(client, dbsession, query, response_status): ], ) def test_update_lecturer(client, lecturer, body, response_status): - response = client.get(f'{url}/{lecturer.id}') + response = client.get(f"{url}/{lecturer.id}") assert response.status_code == status.HTTP_200_OK json_response = response.json() - assert json_response['first_name'] == lecturer.first_name - assert json_response['last_name'] == lecturer.last_name - assert json_response['middle_name'] == lecturer.middle_name + assert json_response["first_name"] == lecturer.first_name + assert json_response["last_name"] == lecturer.last_name + assert json_response["middle_name"] == lecturer.middle_name response = client.patch(f"{url}/{lecturer.id}", json=body) assert response.status_code == response_status if response_status == status.HTTP_200_OK: @@ -310,13 +374,13 @@ def test_delete_lecturer(client, dbsession, lecturers_with_comments): assert comments[2].is_deleted assert lecturers[0].is_deleted # trying to get deleted - response = client.get(f'{url}/{lecturers[0].id}') + response = client.get(f"{url}/{lecturers[0].id}") assert response.status_code == status.HTTP_404_NOT_FOUND -@pytest.mark.usefixtures('lecturers') +@pytest.mark.usefixtures("lecturers") @pytest.mark.parametrize( - 'body, response_status', + "body, response_status", [ ( { @@ -352,7 +416,7 @@ def test_delete_lecturer(client, dbsession, lecturers_with_comments): ], ) def test_lecturer_rating_update(client, dbsession, body, response_status): - response = client.patch('/lecturer/import_rating', json=[body]) + response = client.patch("/lecturer/import_rating", json=[body]) if response_status == status.HTTP_200_OK: