import pytest from httpx import AsyncClient from sqlalchemy.ext.asyncio import AsyncSession from ..utils import create_user_and_login, create_branch pytestmark = pytest.mark.asyncio @pytest.fixture async def admin_token(client: AsyncClient) -> str: """Create an admin user and return their token""" user_data = await create_user_and_login( client, email="admin@example.com", password="adminpass123", full_name="Admin User", is_superuser=True ) return user_data["token"] @pytest.fixture async def regular_token(client: AsyncClient) -> str: """Create a regular user and return their token""" user_data = await create_user_and_login( client, email="user@example.com", password="userpass123", full_name="Regular User", is_superuser=False ) return user_data["token"] async def test_create_branch(client: AsyncClient, admin_token: str): # Test creating a branch as admin response = await client.post( "/api/v1/branches/", json={ "name": "Test Branch", "location": "Test Location", "contact_email": "branch@example.com", "phone": "1234567890" }, headers={"Authorization": f"Bearer {admin_token}"} ) assert response.status_code == 200 data = response.json() assert data["name"] == "Test Branch" assert data["location"] == "Test Location" return data["id"] async def test_create_branch_unauthorized(client: AsyncClient, regular_token: str): # Test creating a branch as regular user (should fail) response = await client.post( "/api/v1/branches/", json={ "name": "Test Branch", "location": "Test Location" }, headers={"Authorization": f"Bearer {regular_token}"} ) assert response.status_code == 403 async def test_get_branch(client: AsyncClient, admin_token: str): # First create a branch branch_id = await test_create_branch(client, admin_token) # Test getting the branch response = await client.get( f"/api/v1/branches/{branch_id}", headers={"Authorization": f"Bearer {admin_token}"} ) assert response.status_code == 200 data = response.json() assert data["id"] == branch_id assert data["name"] == "Test Branch" async def test_list_branches(client: AsyncClient, admin_token: str): # Create multiple branches await test_create_branch(client, admin_token) await client.post( "/api/v1/branches/", json={ "name": "Another Branch", "location": "Another Location", "contact_email": "another@example.com", "phone": "0987654321" }, headers={"Authorization": f"Bearer {admin_token}"} ) # Test listing branches response = await client.get( "/api/v1/branches/", headers={"Authorization": f"Bearer {admin_token}"} ) assert response.status_code == 200 data = response.json() assert len(data) >= 2 assert any(b["name"] == "Test Branch" for b in data) assert any(b["name"] == "Another Branch" for b in data) async def test_update_branch(client: AsyncClient, admin_token: str): # First create a branch branch_id = await test_create_branch(client, admin_token) # Test updating the branch response = await client.put( f"/api/v1/branches/{branch_id}", json={ "name": "Updated Branch", "location": "Updated Location", "contact_email": "updated@example.com", "phone": "1112223333" }, headers={"Authorization": f"Bearer {admin_token}"} ) assert response.status_code == 200 data = response.json() assert data["name"] == "Updated Branch" assert data["location"] == "Updated Location" assert data["contact_email"] == "updated@example.com" async def test_delete_branch(client: AsyncClient, admin_token: str): # First create a branch branch_id = await test_create_branch(client, admin_token) # Test deleting the branch response = await client.delete( f"/api/v1/branches/{branch_id}", headers={"Authorization": f"Bearer {admin_token}"} ) assert response.status_code == 200 # Verify branch is deleted response = await client.get( f"/api/v1/branches/{branch_id}", headers={"Authorization": f"Bearer {admin_token}"} ) assert response.status_code == 404 async def test_branch_statistics(client: AsyncClient, admin_token: str): # First create a branch branch_id = await test_create_branch(client, admin_token) # Test getting branch statistics response = await client.get( f"/api/v1/branches/{branch_id}/statistics", headers={"Authorization": f"Bearer {admin_token}"} ) assert response.status_code == 200 data = response.json() assert "total_products" in data assert "total_orders" in data assert "total_revenue" in data assert "average_order_value" in data