File size: 4,151 Bytes
4c5298a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
117
118
119
120
121
122
123
124
125
126
127
128
import pytest
from httpx import AsyncClient
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.security import create_access_token

pytestmark = pytest.mark.asyncio

@pytest.fixture
async def user_token(client: AsyncClient) -> str:
    """Create a test user and return their token"""
    # Register user
    await client.post(
        "/api/v1/auth/register",
        data={
            "username": "testuser@example.com",
            "password": "testpass123",
            "full_name": "Test User"
        }
    )
    
    # Login to get token
    response = await client.post(
        "/api/v1/auth/login",
        data={
            "username": "testuser@example.com",
            "password": "testpass123"
        }
    )
    return response.json()["access_token"]

async def test_create_product(client: AsyncClient, user_token: str):
    # Test creating a product
    response = await client.post(
        "/api/v1/products/",
        json={
            "name": "Test Product",
            "description": "A test product",
            "price": 99.99,
            "category": "test",
            "inventory_count": 10
        },
        headers={"Authorization": f"Bearer {user_token}"}
    )
    assert response.status_code == 200
    data = response.json()
    assert data["name"] == "Test Product"
    assert data["price"] == 99.99
    return data["id"]

async def test_get_product(client: AsyncClient, user_token: str):
    # First create a product
    product_id = await test_create_product(client, user_token)
    
    # Test getting the product
    response = await client.get(
        f"/api/v1/products/{product_id}",
        headers={"Authorization": f"Bearer {user_token}"}
    )
    assert response.status_code == 200
    data = response.json()
    assert data["id"] == product_id
    assert data["name"] == "Test Product"

async def test_list_products(client: AsyncClient, user_token: str):
    # Create multiple products
    await test_create_product(client, user_token)
    await client.post(
        "/api/v1/products/",
        json={
            "name": "Another Product",
            "description": "Another test product",
            "price": 49.99,
            "category": "test",
            "inventory_count": 5
        },
        headers={"Authorization": f"Bearer {user_token}"}
    )
    
    # Test listing products
    response = await client.get(
        "/api/v1/products/",
        headers={"Authorization": f"Bearer {user_token}"}
    )
    assert response.status_code == 200
    data = response.json()
    assert len(data) >= 2
    assert any(p["name"] == "Test Product" for p in data)
    assert any(p["name"] == "Another Product" for p in data)

async def test_update_product(client: AsyncClient, user_token: str):
    # First create a product
    product_id = await test_create_product(client, user_token)
    
    # Test updating the product
    response = await client.put(
        f"/api/v1/products/{product_id}",
        json={
            "name": "Updated Product",
            "description": "Updated description",
            "price": 149.99,
            "category": "test",
            "inventory_count": 20
        },
        headers={"Authorization": f"Bearer {user_token}"}
    )
    assert response.status_code == 200
    data = response.json()
    assert data["name"] == "Updated Product"
    assert data["price"] == 149.99
    assert data["inventory_count"] == 20

async def test_delete_product(client: AsyncClient, user_token: str):
    # First create a product
    product_id = await test_create_product(client, user_token)
    
    # Test deleting the product
    response = await client.delete(
        f"/api/v1/products/{product_id}",
        headers={"Authorization": f"Bearer {user_token}"}
    )
    assert response.status_code == 200
    
    # Verify product is deleted
    response = await client.get(
        f"/api/v1/products/{product_id}",
        headers={"Authorization": f"Bearer {user_token}"}
    )
    assert response.status_code == 404