"""Граница `_tool` должна возвращать ошибку данными, а не падать сама.
Регресс: в Telethon 1.45 нет `EntityNotFoundError` — старый
`except errors.EntityNotFoundError` поднимал AttributeError в момент
вычисления except-клаузы, и любой неожиданный баг тулов уходил на агент как
«module telethon.errors has no attribute ...» вместо нормального error-конверта.
Тестам не нужен Telethon-клиент — только модуль errors и сам tools: тул-фабрика
не вызывается, проверяется прямо `_tool` (импорт tools безопасен при пустой
конфигурации, т.к. manager резолвится внутри вызовов).
"""
import asyncio
import sys
from pathlib import Path
BACKEND = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(BACKEND))
import telethon.errors
from app.mcp import tools
from app.tg.login_flow import DomainError
def test_tool_boundary_maps_errors():
# DomainError → свой код/детайл
async def dom():
raise DomainError(404, "нет аккаунтов")
out = asyncio.run(tools._tool(dom))
assert out == {"error": 404, "detail": "нет аккаунтов"}
def test_tool_boundary_entity_not_found_variants():
"""Telethon-объектные «диалог не найден» → 404-данные, не AttributeError."""
async def peer():
raise telethon.errors.PeerIdInvalidError(request=object())
out = asyncio.run(tools._tool(peer))
assert out["error"] == 404
async def chan():
raise telethon.errors.ChannelPrivateError(request=object())
out = asyncio.run(tools._tool(chan))
assert out["error"] == 404
# get_input_entity без кеша поднимает ValueError — тоже 404
async def unresolved():
raise ValueError("Could not find the input entity for PeerUser(user_id=7)")
out = asyncio.run(tools._tool(unresolved))
assert out["error"] == 404
def test_tool_boundary_unknown_exception_is_500_data():
async def boom():
raise KeyError("x")
out = asyncio.run(tools._tool(boom))
assert out["error"] == 500
assert "KeyError" in out["detail"]