Newer
Older
tgclient-mcp / backend / tests / test_tool_boundary.py
"""Граница `_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"]