2021-09-09 08:51:29 -08:00
|
|
|
import json
|
|
|
|
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
2022-04-20 20:07:46 +02:00
|
|
|
from mealie.core.config import get_app_settings
|
2022-08-13 13:18:12 -08:00
|
|
|
from mealie.repos.repository_factory import AllRepositories
|
|
|
|
from mealie.services.user_services.user_service import UserService
|
2021-11-25 14:17:02 -09:00
|
|
|
from tests.utils.app_routes import AppRoutes
|
2022-01-13 13:06:52 -09:00
|
|
|
from tests.utils.fixture_schemas import TestUser
|
2021-09-09 08:51:29 -08:00
|
|
|
|
|
|
|
|
|
|
|
def test_failed_login(api_client: TestClient, api_routes: AppRoutes):
|
2022-04-20 20:07:46 +02:00
|
|
|
settings = get_app_settings()
|
|
|
|
|
|
|
|
form_data = {"username": settings.DEFAULT_EMAIL, "password": "WRONG_PASSWORD"}
|
2021-09-09 08:51:29 -08:00
|
|
|
response = api_client.post(api_routes.auth_token, form_data)
|
|
|
|
|
|
|
|
assert response.status_code == 401
|
|
|
|
|
|
|
|
|
|
|
|
def test_superuser_login(api_client: TestClient, api_routes: AppRoutes, admin_token):
|
2022-04-20 20:07:46 +02:00
|
|
|
settings = get_app_settings()
|
|
|
|
|
|
|
|
form_data = {"username": settings.DEFAULT_EMAIL, "password": settings.DEFAULT_PASSWORD}
|
2021-09-09 08:51:29 -08:00
|
|
|
response = api_client.post(api_routes.auth_token, form_data)
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
new_token = json.loads(response.text).get("access_token")
|
|
|
|
|
|
|
|
response = api_client.get(api_routes.users_self, headers=admin_token)
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
|
|
return {"Authorization": f"Bearer {new_token}"}
|
2022-01-13 13:06:52 -09:00
|
|
|
|
|
|
|
|
|
|
|
def test_user_token_refresh(api_client: TestClient, api_routes: AppRoutes, admin_user: TestUser):
|
|
|
|
response = api_client.post(api_routes.auth_refresh, headers=admin_user.token)
|
|
|
|
response = api_client.get(api_routes.users_self, headers=admin_user.token)
|
|
|
|
assert response.status_code == 200
|
2022-08-13 13:18:12 -08:00
|
|
|
|
|
|
|
|
|
|
|
def test_user_lockout_after_bad_attemps(api_client: TestClient, unique_user: TestUser, database: AllRepositories):
|
|
|
|
"""
|
2022-09-25 23:17:27 +00:00
|
|
|
if the user has more than 5 bad login attempts the user will be locked out for 4 hours
|
2022-08-13 13:18:12 -08:00
|
|
|
This only applies if there is a user in the database with the same username
|
|
|
|
"""
|
|
|
|
routes = AppRoutes()
|
|
|
|
settings = get_app_settings()
|
|
|
|
|
|
|
|
for _ in range(settings.SECURITY_MAX_LOGIN_ATTEMPTS):
|
|
|
|
form_data = {"username": unique_user.email, "password": "bad_password"}
|
|
|
|
response = api_client.post(routes.auth_token, form_data)
|
|
|
|
|
|
|
|
assert response.status_code == 401
|
|
|
|
|
|
|
|
valid_data = {"username": unique_user.email, "password": unique_user.password}
|
|
|
|
response = api_client.post(routes.auth_token, valid_data)
|
|
|
|
assert response.status_code == 423
|
|
|
|
|
|
|
|
# Cleanup
|
|
|
|
user_service = UserService(database)
|
|
|
|
user = database.users.get_one(unique_user.user_id)
|
|
|
|
user_service.unlock_user(user)
|