From ff6d57f2a2abec491b3b622d2b7cade640a146fe Mon Sep 17 00:00:00 2001 From: Mawoka Date: Mon, 25 Apr 2022 13:42:01 +0200 Subject: [PATCH] :bug: Fixed delete-user route --- classquiz/routers/users.py | 24 +++++++++++++---------- classquiz/tests/test_server.py | 36 +++++++++++++++++----------------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/classquiz/routers/users.py b/classquiz/routers/users.py index 774d145..92bd45c 100644 --- a/classquiz/routers/users.py +++ b/classquiz/routers/users.py @@ -1,5 +1,6 @@ import os +import ormar from email_validator import validate_email, EmailNotValidError from fastapi import APIRouter, Response, HTTPException, Request, Depends, status from datetime import timedelta, datetime @@ -114,11 +115,11 @@ async def login_for_cookie_access_token( @router.get("/token/rememberme") async def rememberme_token(request: Request, response: Response): - rememberme_cookie = request.cookies.get("rememberme_token") - if rememberme_cookie is None: + rememberme_token = request.cookies.get("rememberme_token") + if rememberme_token is None: raise HTTPException(status_code=400, detail="No rememberme cookie") user_session: UserSession | None = ( - await UserSession.objects.filter(session_key=rememberme_cookie).select_related(UserSession.user).get_or_none() + await UserSession.objects.filter(session_key=rememberme_token).select_related(UserSession.user).get_or_none() ) if (user_session is None) or (user_session.user is None): raise HTTPException(status_code=401, detail="No user session") @@ -256,12 +257,14 @@ async def delete_session(session_id: str, user: User = Depends(get_current_user) @router.get( "/session", response_model=UserSession, response_model_exclude={"user": ..., "session_key": ..., "quizs": ...} ) -async def get_session(user: User = Depends(get_current_user)): - session = await UserSession.objects.filter(user=user).get_or_none() - if session is None: - raise HTTPException(status_code=404, detail="Session not found") - else: +async def get_session(request: Request, user: User = Depends(get_current_user)): + try: + session = await UserSession.objects.filter( + user=user, session_key=request.cookies.get("rememberme_token") + ).first() return session + except ormar.NoMatch: + raise HTTPException(status_code=404, detail="Session not found") class DeleteUserInput(BaseModel): @@ -277,9 +280,10 @@ async def delete_user_account(input_data: DeleteUserInput, user: User = Depends( quizzes = await Quiz.objects.filter(user_id=user).all() quizzes_to_delete = [] for quiz in quizzes: - if quiz.is_public: - quizzes_to_delete.append(quiz.id) + if quiz.public: + quizzes_to_delete.append(str(quiz.id)) if len(quizzes_to_delete) > 0: meilisearch.index(settings.meilisearch_index).delete_documents(quizzes_to_delete) + await Quiz.objects.filter(user_id=user).delete() await User.objects.filter(id=user.id).delete() await user.delete() diff --git a/classquiz/tests/test_server.py b/classquiz/tests/test_server.py index 351e0c8..6a80520 100644 --- a/classquiz/tests/test_server.py +++ b/classquiz/tests/test_server.py @@ -1,3 +1,4 @@ +import json import uuid import pytest @@ -82,8 +83,8 @@ class TestUsers: resp = test_client.post( "/api/v1/users/token/cookie", data={"username": test_user_email, "password": test_user_password} ) - rememberme_cookie = resp.cookies["rememberme_token"] - resp = test_client.get("/api/v1/users/token/rememberme", cookies={"rememberme_token": rememberme_cookie}) + rememberme_token = resp.cookies["rememberme_token"] + resp = test_client.get("/api/v1/users/token/rememberme", cookies={"rememberme_token": rememberme_token}) assert resp.cookies["access_token"] is not None assert resp.status_code == 200 resp = test_client.get( @@ -96,15 +97,15 @@ class TestUsers: resp = test_client.post( "/api/v1/users/token/cookie", data={"username": test_user_email, "password": test_user_password} ) - rememberme_cookie = resp.cookies["rememberme_token"] + rememberme_token = resp.cookies["rememberme_token"] access_token = resp.cookies["access_token"] resp = test_client.get("/api/v1/users/me", cookies={"access_token": access_token}) assert resp.status_code == 200 resp = test_client.get( - "/api/v1/users/logout", cookies={"rememberme_cookie": rememberme_cookie}, allow_redirects=False + "/api/v1/users/logout", cookies={"rememberme_token": rememberme_token}, allow_redirects=False ) assert resp.status_code == 302 - resp = test_client.get("/api/v1/users/me", cookies={"rememberme_cookie": rememberme_cookie}) + resp = test_client.get("/api/v1/users/me", cookies={"rememberme_token": rememberme_token}) assert resp.status_code == 401 @pytest.mark.asyncio @@ -138,8 +139,8 @@ class TestUsers: resp1 = test_client.post( "/api/v1/users/token/cookie", data={"username": test_user_email, "password": test_user_password} ) - rememberme_cookie = resp1.cookies["rememberme_token"] - response = test_client.get("/api/v1/users/me", cookies={"rememberme_cookie": rememberme_cookie}) + rememberme_token = resp1.cookies["rememberme_token"] + response = test_client.get("/api/v1/users/me", cookies={"rememberme_token": rememberme_token}) assert response.status_code == 200 @pytest.mark.asyncio @@ -147,8 +148,8 @@ class TestUsers: resp = test_client.post( "/api/v1/users/token/cookie", data={"username": test_user_email, "password": test_user_password} ) - token = resp.cookies["access_token"] - resp = test_client.get("/api/v1/users/session", cookies={"access_token": token}) + token = resp.cookies["rememberme_token"] + resp = test_client.get("/api/v1/users/session", cookies={"rememberme_token": token}) assert resp.status_code == 200 assert resp.json()["ip_address"] == "testclient" @@ -157,12 +158,12 @@ class TestUsers: resp = test_client.post( "/api/v1/users/token/cookie", data={"username": test_user_email, "password": test_user_password} ) - token = resp.cookies["access_token"] - resp = test_client.get("/api/v1/users/session", cookies={"access_token": token}) + token = resp.cookies["rememberme_token"] + resp = test_client.get("/api/v1/users/session", cookies={"rememberme_token": token}) session_id = resp.json()["id"] - resp = test_client.delete("/api/v1/users/sessions/" + str(session_id), cookies={"access_token": token}) + resp = test_client.delete("/api/v1/users/sessions/" + str(session_id), cookies={"rememberme_token": token}) assert resp.status_code == 200 - resp = test_client.delete("/api/v1/users/sessions/asdsadasdasdsad", cookies={"access_token": token}) + resp = test_client.delete("/api/v1/users/sessions/asdsadasdasdsad", cookies={"rememberme_token": token}) assert resp.status_code == 400 @pytest.mark.asyncio @@ -170,8 +171,8 @@ class TestUsers: resp = test_client.post( "/api/v1/users/token/cookie", data={"username": test_user_email, "password": test_user_password} ) - token = resp.cookies["access_token"] - resp = test_client.get("/api/v1/users/sessions/list", cookies={"access_token": token}) + token = resp.cookies["rememberme_token"] + resp = test_client.get("/api/v1/users/sessions/list", cookies={"rememberme_token": token}) assert resp.status_code == 200 assert len(resp.json()) >= 1 @@ -368,7 +369,6 @@ class TestDeleteUser: "/api/v1/users/token/cookie", data={"username": test_user_email, "password": test_user_password} ) token = resp.cookies["access_token"] - resp = test_client.delete( - "/api/v1/users/me", cookies={"access_token": token}, json={"password": test_user_password} - ) + data = {"password": test_user_password} + resp = test_client.delete("/api/v1/users/me", cookies={"access_token": token}, json=data) assert resp.status_code == 200