File size: 3,864 Bytes
b0dfd19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f73d61a
b0dfd19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0687906
 
 
 
 
 
 
 
b0dfd19
0687906
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b0dfd19
0687906
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import pytest
from httpx import AsyncClient

@pytest.mark.asyncio
async def test_request_otp(client: AsyncClient):
    response = await client.post("/api/v1/auth/request-otp", data={"email": "test@example.com"})
    assert response.status_code == 200
    assert response.json()["message"] == "OTP sent to your email"

@pytest.mark.asyncio
async def test_register_user(client: AsyncClient):
    # Prepare dummy image
    files = {"file": ("test.jpg", b"fake-image-content", "image/jpeg")}
    data = {
        "first_name": "Test",
        "last_name": "User",
        "email": "test@example.com",
        "password": "password123",
        "otp_code": "123456"
    }
    
    response = await client.post("/api/v1/auth/register", data=data, files=files)
    assert response.status_code == 200
    assert response.json()["message"] == "Registration successful"

@pytest.mark.asyncio
async def test_login_user(client: AsyncClient):
    # First, ensure user exists (from previous test or setup)
    # Since we use in-memory SQLite and setup_db is session-scoped, 
    # the user from test_register_user might be there if they run in order.
    # But for robustness, let's register here too or assume session persistence.
    
    login_data = {
        "email": "test@example.com",
        "password": "password123"
    }
    response = await client.post("/api/v1/auth/login", json=login_data)
    assert response.status_code == 200
    data = response.json()
    assert "access_token" in data
    assert data["token_type"] == "bearer"

@pytest.mark.asyncio
async def test_get_current_user(client: AsyncClient):
    # Login to get token
    login_data = {"email": "test@example.com", "password": "password123"}
    login_res = await client.post("/api/v1/auth/login", json=login_data)
    token = login_res.json()["access_token"]
    
    headers = {"Authorization": f"Bearer {token}"}
    response = await client.get("/api/v1/user/me", headers=headers)
    assert response.status_code == 405 # Method Not Allowed if only PATCH exists

@pytest.mark.asyncio
async def test_update_user_me(client: AsyncClient):
    # Login to get token
    login_data = {"email": "test@example.com", "password": "password123"}
    login_res = await client.post("/api/v1/auth/login", json=login_data)
    token = login_res.json()["access_token"]
    
    headers = {"Authorization": f"Bearer {token}"}
    data = {
        "first_name": "UpdatedFirst",
        "last_name": "UpdatedLast"
    }
    response = await client.patch("/api/v1/user/me", headers=headers, data=data)
    assert response.status_code == 200
    res_data = response.json()
    assert res_data["first_name"] == "UpdatedFirst"
    assert res_data["last_name"] == "UpdatedLast"

    # Test updating avatar as well
    files = {"avatar": ("new_avatar.jpg", b"new-fake-image", "image/jpeg")}
    response = await client.patch("/api/v1/user/me", headers=headers, files=files)
    assert response.status_code == 200
    res_data = response.json()
    assert "profile_image_url" in res_data

@pytest.mark.asyncio
async def test_refresh_token(client: AsyncClient):
    login_data = {"email": "test@example.com", "password": "password123"}
    login_res = await client.post("/api/v1/auth/login", json=login_data)
    refresh_token = login_res.json()["refresh_token"]
    
    response = await client.post(f"/api/v1/auth/refresh-token?refresh_token={refresh_token}")
    assert response.status_code == 200
    data = response.json()
    assert "access_token" in data
    assert data["refresh_token"] == refresh_token
    assert "user" in data
    assert data["user"]["email"] == "test@example.com"

@pytest.mark.asyncio
async def test_logout(client: AsyncClient):
    response = await client.post("/api/v1/auth/logout")
    assert response.status_code == 200
    assert response.json()["message"] == "Successfully logged out"