Coverage for app/tests/api/routes/test_login.py: 100%
50 statements
« prev ^ index » next coverage.py v7.6.1, created at 2026-03-24 11:40 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2026-03-24 11:40 +0000
1from unittest.mock import patch
3from fastapi.testclient import TestClient
4from sqlmodel import Session, select
6from app.core.config import settings
7from app.core.security import verify_password
8from app.models import User
9from app.utils import generate_password_reset_token
12def test_get_access_token(client: TestClient) -> None:
13 login_data = {
14 "username": settings.FIRST_SUPERUSER,
15 "password": settings.FIRST_SUPERUSER_PASSWORD,
16 }
17 r = client.post(f"{settings.API_V1_STR}/login/access-token", data=login_data)
18 tokens = r.json()
19 assert r.status_code == 200
20 assert "access_token" in tokens
21 assert tokens["access_token"]
24def test_get_access_token_incorrect_password(client: TestClient) -> None:
25 login_data = {
26 "username": settings.FIRST_SUPERUSER,
27 "password": "incorrect",
28 }
29 r = client.post(f"{settings.API_V1_STR}/login/access-token", data=login_data)
30 assert r.status_code == 400
33def test_use_access_token(
34 client: TestClient, superuser_token_headers: dict[str, str]
35) -> None:
36 r = client.post(
37 f"{settings.API_V1_STR}/login/test-token",
38 headers=superuser_token_headers,
39 )
40 result = r.json()
41 assert r.status_code == 200
42 assert "email" in result
45def test_recovery_password(
46 client: TestClient, normal_user_token_headers: dict[str, str]
47) -> None:
48 with (
49 patch("app.core.config.settings.SMTP_HOST", "smtp.example.com"),
50 patch("app.core.config.settings.SMTP_USER", "admin@example.com"),
51 ):
52 email = "test@example.com"
53 r = client.post(
54 f"{settings.API_V1_STR}/password-recovery/{email}",
55 headers=normal_user_token_headers,
56 )
57 assert r.status_code == 200
58 assert r.json() == {"message": "Password recovery email sent"}
61def test_recovery_password_user_not_exits(
62 client: TestClient, normal_user_token_headers: dict[str, str]
63) -> None:
64 email = "jVgQr@example.com"
65 r = client.post(
66 f"{settings.API_V1_STR}/password-recovery/{email}",
67 headers=normal_user_token_headers,
68 )
69 assert r.status_code == 404
72def test_reset_password(
73 client: TestClient, superuser_token_headers: dict[str, str], db: Session
74) -> None:
75 token = generate_password_reset_token(email=settings.FIRST_SUPERUSER)
76 data = {"new_password": "changethis", "token": token}
77 r = client.post(
78 f"{settings.API_V1_STR}/reset-password/",
79 headers=superuser_token_headers,
80 json=data,
81 )
82 assert r.status_code == 200
83 assert r.json() == {"message": "Password updated successfully"}
85 user_query = select(User).where(User.email == settings.FIRST_SUPERUSER)
86 user = db.exec(user_query).first()
87 assert user
88 assert verify_password(data["new_password"], user.hashed_password)
91def test_reset_password_invalid_token(
92 client: TestClient, superuser_token_headers: dict[str, str]
93) -> None:
94 data = {"new_password": "changethis", "token": "invalid"}
95 r = client.post(
96 f"{settings.API_V1_STR}/reset-password/",
97 headers=superuser_token_headers,
98 json=data,
99 )
100 response = r.json()
102 assert "detail" in response
103 assert r.status_code == 400
104 assert response["detail"] == "Invalid token"