feat(mcp): 6 outils shopping + tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -8,8 +8,13 @@ from app.api.mcp_server import (
|
||||
from app.api.mcp_server import (
|
||||
search_notes, get_note, create_note, update_note, delete_note,
|
||||
)
|
||||
from app.api.mcp_server import (
|
||||
get_shopping_lists, get_active_shopping_list, search_products,
|
||||
create_shopping_list, add_shopping_item, check_shopping_item,
|
||||
)
|
||||
from app.models.todos import TodoItem
|
||||
from app.models.notes import NoteItem
|
||||
from app.models.shopping import ShoppingList, ListItem
|
||||
|
||||
pytestmark = pytest.mark.usefixtures("mcp_nullpool_session")
|
||||
|
||||
@@ -21,6 +26,7 @@ async def cleanup_mcp_todos():
|
||||
async with mcp_server_module.AsyncSessionLocal() as session:
|
||||
await session.execute(delete(TodoItem).where(TodoItem.title.like("TEST_MCP_%")))
|
||||
await session.execute(delete(NoteItem).where(NoteItem.title.like("TEST_MCP_%")))
|
||||
await session.execute(delete(ShoppingList).where(ShoppingList.name.like("TEST_MCP_%")))
|
||||
await session.commit()
|
||||
|
||||
|
||||
@@ -128,3 +134,72 @@ async def test_get_note_introuvable():
|
||||
result = await get_note(id="00000000-0000-0000-0000-000000000000")
|
||||
data = json.loads(result)
|
||||
assert "error" in data
|
||||
|
||||
|
||||
# ── SHOPPING ──────────────────────────────────────────────────────────────────
|
||||
|
||||
async def test_get_shopping_lists_retourne_liste():
|
||||
result = await get_shopping_lists()
|
||||
data = json.loads(result)
|
||||
assert isinstance(data, list)
|
||||
|
||||
|
||||
async def test_create_shopping_list_outil():
|
||||
result = await create_shopping_list(name="TEST_MCP_liste")
|
||||
data = json.loads(result)
|
||||
assert data["name"] == "TEST_MCP_liste"
|
||||
assert data["status"] == "draft"
|
||||
assert "id" in data
|
||||
|
||||
|
||||
async def test_create_shopping_list_nom_auto():
|
||||
result = await create_shopping_list()
|
||||
data = json.loads(result)
|
||||
assert data["name"].startswith("S")
|
||||
|
||||
|
||||
async def test_add_shopping_item_outil():
|
||||
liste = json.loads(await create_shopping_list(name="TEST_MCP_liste_item"))
|
||||
result = await add_shopping_item(
|
||||
list_id=str(liste["id"]),
|
||||
name="TEST_MCP_article",
|
||||
quantity=2.0,
|
||||
unit="kg",
|
||||
)
|
||||
data = json.loads(result)
|
||||
assert data["name"] == "TEST_MCP_article"
|
||||
assert data["is_checked"] is False
|
||||
assert float(data["quantity"]) == 2.0
|
||||
|
||||
|
||||
async def test_check_shopping_item_outil():
|
||||
liste = json.loads(await create_shopping_list(name="TEST_MCP_liste_check"))
|
||||
article = json.loads(await add_shopping_item(
|
||||
list_id=str(liste["id"]),
|
||||
name="TEST_MCP_article_check",
|
||||
))
|
||||
result = await check_shopping_item(
|
||||
list_id=str(liste["id"]),
|
||||
item_id=str(article["id"]),
|
||||
)
|
||||
data = json.loads(result)
|
||||
assert data["is_checked"] is True
|
||||
|
||||
|
||||
async def test_search_products_retourne_liste():
|
||||
result = await search_products(q="inexistant_xyz_abc_999")
|
||||
data = json.loads(result)
|
||||
assert isinstance(data, list)
|
||||
assert data == []
|
||||
|
||||
|
||||
async def test_get_active_shopping_list_structure():
|
||||
result = await get_active_shopping_list()
|
||||
data = json.loads(result)
|
||||
assert isinstance(data, dict)
|
||||
|
||||
|
||||
async def test_add_item_liste_invalide():
|
||||
result = await add_shopping_item(list_id="pas-un-uuid", name="article")
|
||||
data = json.loads(result)
|
||||
assert "error" in data
|
||||
|
||||
Reference in New Issue
Block a user