from __future__ import annotations
import pytest
from app.agent.graph import ProductAgent
class FakeMCPClient:
def __init__(self) -> None:
self.products = [
{
"id": 1,
"name": "Клавиатура",
"price": 3000.0,
"category": "Электроника",
"in_stock": True,
},
{
"id": 2,
"name": "Книга",
"price": 1000.0,
"category": "Книги",
"in_stock": True,
},
]
async def list_products(self, category=None):
if not category:
return self.products
return [p for p in self.products if p["category"].lower() == category.lower()]
async def get_product(self, product_id):
for product in self.products:
if product["id"] == product_id:
return product
raise ValueError("not found")
async def add_product(self, name, price, category, in_stock=True):
item = {
"id": len(self.products) + 1,
"name": name,
"price": float(price),
"category": category,
"in_stock": bool(in_stock),
}
self.products.append(item)
return item
async def get_statistics(self):
average = sum(p["price"] for p in self.products) / len(self.products)
return {"count": len(self.products), "average_price": round(average, 2)}
@pytest.mark.asyncio
async def test_agent_returns_average_price():
agent = ProductAgent(mcp_client=FakeMCPClient())
result = await agent.run("Какая средняя цена продуктов?")
assert result["action"] == "get_average_price"
assert "Средняя цена" in result["response"]
assert result["tool_result"]["count"] == 2
@pytest.mark.asyncio
async def test_agent_calculates_discount():
agent = ProductAgent(mcp_client=FakeMCPClient())
result = await agent.run("Посчитай скидку 15% на товар с ID 1")
assert result["action"] == "discount_by_id"
assert "Скидка 15.0%" in result["response"]
assert result["tool_result"]["discounted_price"] == 2550.0