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

1from unittest.mock import patch 

2 

3from fastapi.testclient import TestClient 

4from sqlmodel import Session, select 

5 

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 

10 

11 

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"] 

22 

23 

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 

31 

32 

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 

43 

44 

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"} 

59 

60 

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 

70 

71 

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"} 

84 

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) 

89 

90 

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() 

101 

102 assert "detail" in response 

103 assert r.status_code == 400 

104 assert response["detail"] == "Invalid token"