|
3 | 3 |
|
4 | 4 | import pytest |
5 | 5 | from fastapi.testclient import TestClient |
| 6 | +from sqlmodel import Session |
6 | 7 |
|
| 8 | +from app import crud |
7 | 9 | from app.core.config import settings |
| 10 | +from app.models import UserCreate, UserUpdate |
8 | 11 | from tests.utils.user import ( |
9 | 12 | user_authentication_headers, |
10 | 13 | ) |
| 14 | +from tests.utils.utils import random_email, random_lower_string |
11 | 15 |
|
12 | 16 |
|
13 | 17 | def test_manager_can_list_users( |
@@ -105,6 +109,61 @@ def test_metrics_admin_and_manager_allowed_member_denied( |
105 | 109 | assert member_response.status_code == 403 |
106 | 110 |
|
107 | 111 |
|
| 112 | +def test_invalid_access_token(client: TestClient) -> None: |
| 113 | + headers = {"Authorization": "Bearer invalid-token"} |
| 114 | + response = client.get(f"{settings.API_V1_STR}/users/me", headers=headers) |
| 115 | + assert response.status_code == 403 |
| 116 | + assert response.json()["detail"] == "Could not validate credentials" |
| 117 | + |
| 118 | + |
| 119 | +def test_inactive_user_cannot_access(client: TestClient, db: Session) -> None: |
| 120 | + email = random_email() |
| 121 | + password = random_lower_string() |
| 122 | + user_in = UserCreate(email=email, password=password, is_active=True) |
| 123 | + user = crud.create_user(session=db, user_create=user_in) |
| 124 | + headers = user_authentication_headers(client=client, email=email, password=password) |
| 125 | + |
| 126 | + user_in_update = UserUpdate(is_active=False) |
| 127 | + crud.update_user(session=db, db_user=user, user_in=user_in_update) |
| 128 | + |
| 129 | + response = client.get(f"{settings.API_V1_STR}/users/me", headers=headers) |
| 130 | + assert response.status_code == 400 |
| 131 | + assert response.json()["detail"] == "Inactive user" |
| 132 | + |
| 133 | + |
| 134 | +def test_token_for_deleted_user_returns_not_found( |
| 135 | + client: TestClient, db: Session |
| 136 | +) -> None: |
| 137 | + email = random_email() |
| 138 | + password = random_lower_string() |
| 139 | + user_in = UserCreate(email=email, password=password) |
| 140 | + user = crud.create_user(session=db, user_create=user_in) |
| 141 | + headers = user_authentication_headers(client=client, email=email, password=password) |
| 142 | + db.delete(user) |
| 143 | + db.commit() |
| 144 | + |
| 145 | + response = client.get(f"{settings.API_V1_STR}/users/me", headers=headers) |
| 146 | + assert response.status_code == 404 |
| 147 | + assert response.json()["detail"] == "User not found" |
| 148 | + |
| 149 | + |
| 150 | +def test_non_admin_cannot_access_superuser_utils_endpoint( |
| 151 | + client: TestClient, |
| 152 | + member_token_headers: dict[str, str], |
| 153 | + caplog: pytest.LogCaptureFixture, |
| 154 | +) -> None: |
| 155 | + with caplog.at_level(logging.WARNING, logger="app.api.deps"): |
| 156 | + response = client.post( |
| 157 | + f"{settings.API_V1_STR}/utils/test-email/?email_to=member@example.com", |
| 158 | + headers=member_token_headers, |
| 159 | + ) |
| 160 | + |
| 161 | + assert response.status_code == 403 |
| 162 | + assert response.json()["detail"] == "The user doesn't have enough privileges" |
| 163 | + assert "Access denied" in caplog.text |
| 164 | + assert "admin" in caplog.text.lower() |
| 165 | + |
| 166 | + |
108 | 167 | def test_member_cannot_update_other_users( |
109 | 168 | client: TestClient, |
110 | 169 | member_token_headers: dict[str, str], |
|
0 commit comments