nutricore / tests /test_api.py
GitHub Actions
Deploy: fd7352bd4a3722db55d92a07f0e5e9dd211faf54
0d8c5a5
Raw
History Blame Contribute Delete
3.8 kB
"""
Tests for Nutricore FastAPI endpoints
"""
import pytest
from httpx import AsyncClient, ASGITransport
import database
import sys, os
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
@pytest.fixture
async def client(tmp_path):
db_path = str(tmp_path / "test.db")
database.DB_PATH = db_path
database.init_db()
from main import app
transport = ASGITransport(app=app)
async with AsyncClient(transport=transport, base_url="http://test") as ac:
yield ac
@pytest.mark.asyncio
async def test_root(client):
r = await client.get("/")
assert r.status_code == 200
data = r.json()
assert "Nutricore" in data["service"]
assert data["status"] == "running"
@pytest.mark.asyncio
async def test_health(client):
r = await client.get("/health")
assert r.status_code == 200
assert r.json()["status"] == "healthy"
@pytest.mark.asyncio
async def test_get_all_products(client):
r = await client.get("/api/products")
assert r.status_code == 200
data = r.json()
assert "products" in data
assert data["total"] == 12
assert len(data["products"]) == 12
@pytest.mark.asyncio
async def test_get_products_by_category_fruit(client):
r = await client.get("/api/products?category=Fruit")
assert r.status_code == 200
data = r.json()
assert data["total"] == 5
for p in data["products"]:
assert "Fruit" in p["category"]
@pytest.mark.asyncio
async def test_get_products_by_category_vegetable(client):
r = await client.get("/api/products?category=Vegetable")
assert r.status_code == 200
data = r.json()
assert data["total"] == 4
@pytest.mark.asyncio
async def test_get_products_by_category_green(client):
r = await client.get("/api/products?category=Green")
assert r.status_code == 200
data = r.json()
assert data["total"] == 3
@pytest.mark.asyncio
async def test_get_product_by_id(client):
r = await client.get("/api/products/1")
assert r.status_code == 200
data = r.json()
assert data["id"] == 1
assert data["name"] == "Banana Powder"
assert data["price"] == 850
@pytest.mark.asyncio
async def test_get_product_not_found(client):
r = await client.get("/api/products/999")
assert r.status_code == 404
@pytest.mark.asyncio
async def test_get_categories(client):
r = await client.get("/api/products/categories")
assert r.status_code == 200
data = r.json()
assert "categories" in data
assert len(data["categories"]) == 3
assert "Fruit Powders" in data["categories"]
assert "Vegetable Powders" in data["categories"]
assert "Green Leaf Powders" in data["categories"]
@pytest.mark.asyncio
async def test_get_orders_empty(client):
r = await client.get("/api/orders")
assert r.status_code == 200
data = r.json()
assert data["orders"] == []
@pytest.mark.asyncio
async def test_get_delivery_info(client):
r = await client.get("/api/delivery")
assert r.status_code == 200
data = r.json()
assert "delivery" in data
assert "lahore" in data["delivery"]
assert "karachi" in data["delivery"]
@pytest.mark.asyncio
async def test_products_have_required_fields(client):
r = await client.get("/api/products")
data = r.json()
required = ["id", "name", "category", "weight", "price", "description", "image"]
for p in data["products"]:
for field in required:
assert field in p, f"Missing field: {field} in product {p.get('name')}"
@pytest.mark.asyncio
async def test_products_prices_in_pkr(client):
r = await client.get("/api/products")
data = r.json()
for p in data["products"]:
assert p["price"] >= 400, f"Price too low for {p['name']}"
assert p["price"] <= 1500, f"Price too high for {p['name']}"