|
|
@ -30,8 +30,10 @@ def test_get_users_normal_user_me( |
|
|
|
|
|
|
|
|
|
|
|
def test_create_user_new_email( |
|
|
|
client: TestClient, superuser_token_headers: dict, db: Session |
|
|
|
client: TestClient, superuser_token_headers: dict, db: Session, mocker |
|
|
|
) -> None: |
|
|
|
mocker.patch("app.utils.send_new_account_email") |
|
|
|
mocker.patch("app.core.config.settings.EMAILS_ENABLED", True) |
|
|
|
username = random_email() |
|
|
|
password = random_lower_string() |
|
|
|
data = {"email": username, "password": password} |
|
|
@ -66,6 +68,46 @@ def test_get_existing_user( |
|
|
|
assert existing_user.email == api_user["email"] |
|
|
|
|
|
|
|
|
|
|
|
def test_get_existing_user_current_user( |
|
|
|
client: TestClient, db: Session |
|
|
|
) -> None: |
|
|
|
username = random_email() |
|
|
|
password = random_lower_string() |
|
|
|
user_in = UserCreate(email=username, password=password) |
|
|
|
user = crud.create_user(session=db, user_create=user_in) |
|
|
|
user_id = user.id |
|
|
|
|
|
|
|
login_data = { |
|
|
|
"username": username, |
|
|
|
"password": password, |
|
|
|
} |
|
|
|
r = client.post(f"{settings.API_V1_STR}/login/access-token", data=login_data) |
|
|
|
tokens = r.json() |
|
|
|
a_token = tokens["access_token"] |
|
|
|
headers = {"Authorization": f"Bearer {a_token}"} |
|
|
|
|
|
|
|
r = client.get( |
|
|
|
f"{settings.API_V1_STR}/users/{user_id}", |
|
|
|
headers=headers, |
|
|
|
) |
|
|
|
assert 200 <= r.status_code < 300 |
|
|
|
api_user = r.json() |
|
|
|
existing_user = crud.get_user_by_email(session=db, email=username) |
|
|
|
assert existing_user |
|
|
|
assert existing_user.email == api_user["email"] |
|
|
|
|
|
|
|
|
|
|
|
def test_get_existing_user_permissions_error( |
|
|
|
client: TestClient, normal_user_token_headers: dict[str, str], db: Session |
|
|
|
) -> None: |
|
|
|
r = client.get( |
|
|
|
f"{settings.API_V1_STR}/users/999999", |
|
|
|
headers=normal_user_token_headers, |
|
|
|
) |
|
|
|
assert r.status_code == 403 |
|
|
|
assert r.json() == {"detail": "The user doesn't have enough privileges"} |
|
|
|
|
|
|
|
|
|
|
|
def test_create_user_existing_username( |
|
|
|
client: TestClient, superuser_token_headers: dict, db: Session |
|
|
|
) -> None: |
|
|
@ -119,3 +161,223 @@ def test_retrieve_users( |
|
|
|
assert "count" in all_users |
|
|
|
for item in all_users["data"]: |
|
|
|
assert "email" in item |
|
|
|
|
|
|
|
|
|
|
|
def test_update_user_me( |
|
|
|
client: TestClient, normal_user_token_headers: dict[str, str], db: Session |
|
|
|
) -> None: |
|
|
|
full_name = "Updated Name" |
|
|
|
email = "updated email" |
|
|
|
data = {"full_name": full_name, "email": email} |
|
|
|
r = client.patch( |
|
|
|
f"{settings.API_V1_STR}/users/me", |
|
|
|
headers=normal_user_token_headers, |
|
|
|
json=data, |
|
|
|
) |
|
|
|
assert r.status_code == 200 |
|
|
|
updated_user = r.json() |
|
|
|
assert updated_user["email"] == email |
|
|
|
assert updated_user["full_name"] == full_name |
|
|
|
|
|
|
|
|
|
|
|
def test_update_password_me( |
|
|
|
client: TestClient, superuser_token_headers: dict, db: Session |
|
|
|
) -> None: |
|
|
|
new_password = random_lower_string() |
|
|
|
data = {"current_password": settings.FIRST_SUPERUSER_PASSWORD, "new_password": new_password} |
|
|
|
r = client.patch( |
|
|
|
f"{settings.API_V1_STR}/users/me/password", |
|
|
|
headers=superuser_token_headers, |
|
|
|
json=data, |
|
|
|
) |
|
|
|
assert r.status_code == 200 |
|
|
|
updated_user = r.json() |
|
|
|
assert updated_user["message"] == "Password updated successfully" |
|
|
|
|
|
|
|
# Revert to the old password to keep consistency in test |
|
|
|
old_data = {"current_password": new_password, "new_password": settings.FIRST_SUPERUSER_PASSWORD} |
|
|
|
r = client.patch( |
|
|
|
f"{settings.API_V1_STR}/users/me/password", |
|
|
|
headers=superuser_token_headers, |
|
|
|
json=old_data, |
|
|
|
) |
|
|
|
assert r.status_code == 200 |
|
|
|
|
|
|
|
|
|
|
|
def test_update_password_me_incorrect_password( |
|
|
|
client: TestClient, superuser_token_headers: dict, db: Session |
|
|
|
) -> None: |
|
|
|
new_password = random_lower_string() |
|
|
|
data = {"current_password": new_password, "new_password": new_password} |
|
|
|
r = client.patch( |
|
|
|
f"{settings.API_V1_STR}/users/me/password", |
|
|
|
headers=superuser_token_headers, |
|
|
|
json=data, |
|
|
|
) |
|
|
|
assert r.status_code == 400 |
|
|
|
updated_user = r.json() |
|
|
|
assert updated_user["detail"] == "Incorrect password" |
|
|
|
|
|
|
|
|
|
|
|
def test_update_password_me_same_password_error( |
|
|
|
client: TestClient, superuser_token_headers: dict, db: Session |
|
|
|
) -> None: |
|
|
|
data = {"current_password": settings.FIRST_SUPERUSER_PASSWORD, "new_password": settings.FIRST_SUPERUSER_PASSWORD} |
|
|
|
r = client.patch( |
|
|
|
f"{settings.API_V1_STR}/users/me/password", |
|
|
|
headers=superuser_token_headers, |
|
|
|
json=data, |
|
|
|
) |
|
|
|
assert r.status_code == 400 |
|
|
|
updated_user = r.json() |
|
|
|
assert updated_user["detail"] == "New password cannot be the same as the current one" |
|
|
|
|
|
|
|
|
|
|
|
def test_create_user_open( |
|
|
|
client: TestClient, mocker |
|
|
|
) -> None: |
|
|
|
mocker.patch("app.core.config.settings.USERS_OPEN_REGISTRATION", True) |
|
|
|
username = random_email() |
|
|
|
password = random_lower_string() |
|
|
|
full_name = random_lower_string() |
|
|
|
data = {"email": username, "password": password, "full_name": full_name} |
|
|
|
r = client.post( |
|
|
|
f"{settings.API_V1_STR}/users/open", |
|
|
|
json=data, |
|
|
|
) |
|
|
|
assert r.status_code == 200 |
|
|
|
created_user = r.json() |
|
|
|
assert created_user["email"] == username |
|
|
|
assert created_user["full_name"] == full_name |
|
|
|
|
|
|
|
|
|
|
|
def test_create_user_open_forbidden_error( |
|
|
|
client: TestClient, mocker |
|
|
|
) -> None: |
|
|
|
mocker.patch("app.core.config.settings.USERS_OPEN_REGISTRATION", False) |
|
|
|
username = random_email() |
|
|
|
password = random_lower_string() |
|
|
|
full_name = random_lower_string() |
|
|
|
data = {"email": username, "password": password, "full_name": full_name} |
|
|
|
r = client.post( |
|
|
|
f"{settings.API_V1_STR}/users/open", |
|
|
|
json=data, |
|
|
|
) |
|
|
|
assert r.status_code == 403 |
|
|
|
assert r.json()["detail"] == "Open user registration is forbidden on this server" |
|
|
|
|
|
|
|
|
|
|
|
def test_create_user_open_already_exists_error( |
|
|
|
client: TestClient, mocker |
|
|
|
) -> None: |
|
|
|
mocker.patch("app.core.config.settings.USERS_OPEN_REGISTRATION", True) |
|
|
|
password = random_lower_string() |
|
|
|
full_name = random_lower_string() |
|
|
|
data = {"email": settings.FIRST_SUPERUSER, "password": password, "full_name": full_name} |
|
|
|
r = client.post( |
|
|
|
f"{settings.API_V1_STR}/users/open", |
|
|
|
json=data, |
|
|
|
) |
|
|
|
assert r.status_code == 400 |
|
|
|
assert r.json()["detail"] == "The user with this username already exists in the system" |
|
|
|
|
|
|
|
|
|
|
|
def test_update_user( |
|
|
|
client: TestClient, superuser_token_headers: dict[str, str], db: Session |
|
|
|
) -> None: |
|
|
|
username = random_email() |
|
|
|
password = random_lower_string() |
|
|
|
user_in = UserCreate(email=username, password=password) |
|
|
|
user = crud.create_user(session=db, user_create=user_in) |
|
|
|
|
|
|
|
data = {"full_name": "Updated_full_name"} |
|
|
|
r = client.patch( |
|
|
|
f"{settings.API_V1_STR}/users/{user.id}", |
|
|
|
headers=superuser_token_headers, |
|
|
|
json=data, |
|
|
|
) |
|
|
|
assert r.status_code == 200 |
|
|
|
updated_user = r.json() |
|
|
|
assert updated_user["full_name"] == "Updated_full_name" |
|
|
|
|
|
|
|
|
|
|
|
def test_update_user_not_exists( |
|
|
|
client: TestClient, superuser_token_headers: dict[str, str], db: Session |
|
|
|
) -> None: |
|
|
|
data = {"full_name": "Updated_full_name"} |
|
|
|
r = client.patch( |
|
|
|
f"{settings.API_V1_STR}/users/99999999", |
|
|
|
headers=superuser_token_headers, |
|
|
|
json=data, |
|
|
|
) |
|
|
|
assert r.status_code == 404 |
|
|
|
assert r.json()["detail"] == "The user with this username does not exist in the system" |
|
|
|
|
|
|
|
|
|
|
|
def test_delete_user_super_user( |
|
|
|
client: TestClient, superuser_token_headers: dict[str, str], db: Session |
|
|
|
) -> None: |
|
|
|
username = random_email() |
|
|
|
password = random_lower_string() |
|
|
|
user_in = UserCreate(email=username, password=password) |
|
|
|
user = crud.create_user(session=db, user_create=user_in) |
|
|
|
user_id = user.id |
|
|
|
r = client.delete( |
|
|
|
f"{settings.API_V1_STR}/users/{user_id}", |
|
|
|
headers=superuser_token_headers, |
|
|
|
) |
|
|
|
assert r.status_code == 200 |
|
|
|
deleted_user = r.json() |
|
|
|
assert deleted_user["message"] == "User deleted successfully" |
|
|
|
|
|
|
|
|
|
|
|
def test_delete_user_current_user( |
|
|
|
client: TestClient, db: Session |
|
|
|
) -> None: |
|
|
|
username = random_email() |
|
|
|
password = random_lower_string() |
|
|
|
user_in = UserCreate(email=username, password=password) |
|
|
|
user = crud.create_user(session=db, user_create=user_in) |
|
|
|
user_id = user.id |
|
|
|
|
|
|
|
login_data = { |
|
|
|
"username": username, |
|
|
|
"password": password, |
|
|
|
} |
|
|
|
r = client.post(f"{settings.API_V1_STR}/login/access-token", data=login_data) |
|
|
|
tokens = r.json() |
|
|
|
a_token = tokens["access_token"] |
|
|
|
headers = {"Authorization": f"Bearer {a_token}"} |
|
|
|
|
|
|
|
r = client.delete( |
|
|
|
f"{settings.API_V1_STR}/users/{user_id}", |
|
|
|
headers=headers, |
|
|
|
) |
|
|
|
assert r.status_code == 200 |
|
|
|
deleted_user = r.json() |
|
|
|
assert deleted_user["message"] == "User deleted successfully" |
|
|
|
|
|
|
|
|
|
|
|
def test_delete_user_not_found( |
|
|
|
client: TestClient, superuser_token_headers: dict[str, str], db: Session |
|
|
|
) -> None: |
|
|
|
r = client.delete( |
|
|
|
f"{settings.API_V1_STR}/users/99999999", |
|
|
|
headers=superuser_token_headers, |
|
|
|
) |
|
|
|
assert r.status_code == 404 |
|
|
|
assert r.json()["detail"] == "User not found" |
|
|
|
|
|
|
|
|
|
|
|
def test_delete_user_current_super_user_error( |
|
|
|
client: TestClient, superuser_token_headers: dict[str, str], db: Session |
|
|
|
) -> None: |
|
|
|
super_user = crud.get_user_by_email(session=db, email=settings.FIRST_SUPERUSER) |
|
|
|
user_id = super_user.id |
|
|
|
|
|
|
|
r = client.delete( |
|
|
|
f"{settings.API_V1_STR}/users/{user_id}", |
|
|
|
headers=superuser_token_headers, |
|
|
|
) |
|
|
|
assert r.status_code == 403 |
|
|
|
assert r.json()["detail"] == "Super users are not allowed to delete themselves" |
|
|
|