Skip to content

Commit b81cec8

Browse files
alejsdevtiangolo
andauthored
♻️ Add delete_user_me endpoint and corresponding test cases (#1179)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
1 parent d1cc759 commit b81cec8

3 files changed

Lines changed: 53 additions & 26 deletions

File tree

backend/app/api/deps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,6 @@ def get_current_user(session: SessionDep, token: TokenDep) -> User:
5151
def get_current_active_superuser(current_user: CurrentUser) -> User:
5252
if not current_user.is_superuser:
5353
raise HTTPException(
54-
status_code=400, detail="The user doesn't have enough privileges"
54+
status_code=403, detail="The user doesn't have enough privileges"
5555
)
5656
return current_user

backend/app/api/routes/users.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,22 @@ def read_user_me(current_user: CurrentUser) -> Any:
124124
return current_user
125125

126126

127+
@router.delete("/me", response_model=Message)
128+
def delete_user_me(session: SessionDep, current_user: CurrentUser) -> Any:
129+
"""
130+
Delete own user.
131+
"""
132+
if current_user.is_superuser:
133+
raise HTTPException(
134+
status_code=403, detail="Super users are not allowed to delete themselves"
135+
)
136+
statement = delete(Item).where(col(Item.owner_id) == current_user.id)
137+
session.exec(statement) # type: ignore
138+
session.delete(current_user)
139+
session.commit()
140+
return Message(message="User deleted successfully")
141+
142+
127143
@router.post("/signup", response_model=UserPublic)
128144
def register_user(session: SessionDep, user_in: UserRegister) -> Any:
129145
"""
@@ -195,7 +211,7 @@ def update_user(
195211
return db_user
196212

197213

198-
@router.delete("/{user_id}")
214+
@router.delete("/{user_id}", dependencies=[Depends(get_current_active_superuser)])
199215
def delete_user(
200216
session: SessionDep, current_user: CurrentUser, user_id: int
201217
) -> Message:
@@ -205,15 +221,10 @@ def delete_user(
205221
user = session.get(User, user_id)
206222
if not user:
207223
raise HTTPException(status_code=404, detail="User not found")
208-
elif user != current_user and not current_user.is_superuser:
209-
raise HTTPException(
210-
status_code=403, detail="The user doesn't have enough privileges"
211-
)
212-
elif user == current_user and current_user.is_superuser:
224+
if user == current_user:
213225
raise HTTPException(
214226
status_code=403, detail="Super users are not allowed to delete themselves"
215227
)
216-
217228
statement = delete(Item).where(col(Item.owner_id) == user_id)
218229
session.exec(statement) # type: ignore
219230
session.delete(user)

backend/app/tests/api/routes/test_users.py

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def test_create_user_by_normal_user(
142142
headers=normal_user_token_headers,
143143
json=data,
144144
)
145-
assert r.status_code == 400
145+
assert r.status_code == 403
146146

147147

148148
def test_retrieve_users(
@@ -402,50 +402,66 @@ def test_update_user_email_exists(
402402
assert r.json()["detail"] == "User with this email already exists"
403403

404404

405-
def test_delete_user_super_user(
406-
client: TestClient, superuser_token_headers: dict[str, str], db: Session
407-
) -> None:
405+
def test_delete_user_me(client: TestClient, db: Session) -> None:
408406
username = random_email()
409407
password = random_lower_string()
410408
user_in = UserCreate(email=username, password=password)
411409
user = crud.create_user(session=db, user_create=user_in)
412410
user_id = user.id
411+
412+
login_data = {
413+
"username": username,
414+
"password": password,
415+
}
416+
r = client.post(f"{settings.API_V1_STR}/login/access-token", data=login_data)
417+
tokens = r.json()
418+
a_token = tokens["access_token"]
419+
headers = {"Authorization": f"Bearer {a_token}"}
420+
413421
r = client.delete(
414-
f"{settings.API_V1_STR}/users/{user_id}",
415-
headers=superuser_token_headers,
422+
f"{settings.API_V1_STR}/users/me",
423+
headers=headers,
416424
)
417425
assert r.status_code == 200
418426
deleted_user = r.json()
419427
assert deleted_user["message"] == "User deleted successfully"
428+
result = db.exec(select(User).where(User.id == user_id)).first()
429+
assert result is None
420430

421431
user_query = select(User).where(User.id == user_id)
422432
user_db = db.execute(user_query).first()
423433
assert user_db is None
424434

425435

426-
def test_delete_user_current_user(client: TestClient, db: Session) -> None:
436+
def test_delete_user_me_as_superuser(
437+
client: TestClient, superuser_token_headers: dict[str, str]
438+
) -> None:
439+
r = client.delete(
440+
f"{settings.API_V1_STR}/users/me",
441+
headers=superuser_token_headers,
442+
)
443+
assert r.status_code == 403
444+
response = r.json()
445+
assert response["detail"] == "Super users are not allowed to delete themselves"
446+
447+
448+
def test_delete_user_super_user(
449+
client: TestClient, superuser_token_headers: dict[str, str], db: Session
450+
) -> None:
427451
username = random_email()
428452
password = random_lower_string()
429453
user_in = UserCreate(email=username, password=password)
430454
user = crud.create_user(session=db, user_create=user_in)
431455
user_id = user.id
432-
433-
login_data = {
434-
"username": username,
435-
"password": password,
436-
}
437-
r = client.post(f"{settings.API_V1_STR}/login/access-token", data=login_data)
438-
tokens = r.json()
439-
a_token = tokens["access_token"]
440-
headers = {"Authorization": f"Bearer {a_token}"}
441-
442456
r = client.delete(
443457
f"{settings.API_V1_STR}/users/{user_id}",
444-
headers=headers,
458+
headers=superuser_token_headers,
445459
)
446460
assert r.status_code == 200
447461
deleted_user = r.json()
448462
assert deleted_user["message"] == "User deleted successfully"
463+
result = db.exec(select(User).where(User.id == user_id)).first()
464+
assert result is None
449465

450466
user_query = select(User).where(User.id == user_id)
451467
user_db = db.execute(user_query).first()

0 commit comments

Comments
 (0)