File size: 4,594 Bytes
358dfff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import pytest
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session

from models.user import User
from schemas.user import UserCreate


def test_user_registration(client: TestClient, sample_user_data: dict):
    """Test user registration endpoint"""
    response = client.post("/users/registration/signup", json=sample_user_data)
    assert response.status_code == 200
    data = response.json()
    assert "token" in data
    assert data["token"].startswith("fake_token_for_")


def test_user_registration_duplicate_email(client: TestClient, sample_user_data: dict):
    """Test user registration with duplicate email"""
    # Register the user first
    response = client.post("/users/registration/signup", json=sample_user_data)
    assert response.status_code == 200
    
    # Try to register with the same email
    response = client.post("/users/registration/signup", json=sample_user_data)
    assert response.status_code == 400
    assert "already registered" in response.json()["detail"]


def test_user_login_success(client: TestClient, sample_user_data: dict):
    """Test successful user login"""
    # Register the user first
    response = client.post("/users/registration/signup", json=sample_user_data)
    assert response.status_code == 200
    
    # Login with correct credentials
    login_data = {
        "email": sample_user_data["email"],
        "password": sample_user_data["password"]
    }
    response = client.post("/users/registration/login", json=login_data)
    assert response.status_code == 200
    data = response.json()
    assert "token" in data
    assert data["token"].startswith("fake_token_for_")


def test_user_login_invalid_credentials(client: TestClient, sample_user_data: dict):
    """Test user login with invalid credentials"""
    # Register the user first
    response = client.post("/users/registration/signup", json=sample_user_data)
    assert response.status_code == 200
    
    # Login with incorrect password
    login_data = {
        "email": sample_user_data["email"],
        "password": "wrongpassword"
    }
    response = client.post("/users/registration/login", json=login_data)
    assert response.status_code == 401
    assert "Incorrect email or password" in response.json()["detail"]


def test_user_logout(client: TestClient, sample_user_data: dict):
    """Test user logout"""
    # Register the user first
    response = client.post("/users/registration/signup", json=sample_user_data)
    assert response.status_code == 200
    
    # Logout (should always succeed)
    response = client.post("/users/registration/logout", json={})
    assert response.status_code == 200


def test_get_user_details(client: TestClient, sample_user_data: dict, db_session: Session):
    """Test getting user details by ID"""
    # Register the user first
    response = client.post("/users/registration/signup", json=sample_user_data)
    assert response.status_code == 200
    token_response = response.json()
    # Extract user ID from token (format is "fake_token_for_{user_id}")
    user_id = token_response["token"].replace("fake_token_for_", "")
    
    # Get user details
    response = client.get(f"/users/{user_id}")
    assert response.status_code == 200
    user_data = response.json()
    assert user_data["email"] == sample_user_data["email"]
    assert user_data["first_name"] == sample_user_data["first_name"]
    assert user_data["last_name"] == sample_user_data["last_name"]
    assert user_data["role"] == sample_user_data["role"]


def test_get_current_user_data(client: TestClient, sample_user_data: dict):
    """Test getting current user's data based on token"""
    # Register the user first
    response = client.post("/users/registration/signup", json=sample_user_data)
    assert response.status_code == 200
    token_response = response.json()
    token = token_response["token"]

    # Get current user data using the token
    response = client.get("/users/me", headers={"Authorization": f"Bearer {token}"})
    assert response.status_code == 200
    user_data = response.json()
    assert user_data["email"] == sample_user_data["email"]
    assert user_data["first_name"] == sample_user_data["first_name"]
    assert user_data["last_name"] == sample_user_data["last_name"]
    assert user_data["role"] == sample_user_data["role"]


def test_get_nonexistent_user(client: TestClient):
    """Test getting details for a nonexistent user"""
    response = client.get("/users/nonexistent-id")
    assert response.status_code == 404
    assert "User not found" in response.json()["detail"]