import sys from pathlib import Path import pytest from mcp.server.mcpserver import Image sys.path.insert(0, str(Path(__file__).resolve().parents[1])) import server # noqa: E402 def _fake_attachment(monkeypatch, **fields): attachment = { "id": "a1", "name": "f", "kind": "file", "mime": None, "size": 0, "date": None, "url": "https://trello.com/1/x", **fields, } async def fake_get_attachment(card_id, attachment_id): return dict(attachment) monkeypatch.setattr(server.trello, "get_attachment", fake_get_attachment) @pytest.mark.asyncio async def test_png_returned_as_image(monkeypatch): _fake_attachment(monkeypatch, kind="image", mime="image/png", data=b"\x89PNG", path="/tmp/x.png") meta, image = await server.trello_get_attachment("card1", "a1") assert isinstance(image, Image) assert "data" not in meta and meta["path"] == "/tmp/x.png" @pytest.mark.asyncio async def test_svg_only_path(monkeypatch): _fake_attachment(monkeypatch, kind="image", mime="image/svg+xml", data=b"", path="/tmp/x.svg") result = await server.trello_get_attachment("card1", "a1") assert isinstance(result, dict) and result["path"] == "/tmp/x.svg" @pytest.mark.asyncio async def test_small_text_file_inlined(monkeypatch): _fake_attachment(monkeypatch, mime="text/plain", data="ошибка 500".encode(), path="/tmp/x.txt") result = await server.trello_get_attachment("card1", "a1") assert result["text"] == "ошибка 500" @pytest.mark.asyncio async def test_pdf_only_path(monkeypatch): _fake_attachment(monkeypatch, mime="application/pdf", data=b"%PDF", path="/tmp/x.pdf") result = await server.trello_get_attachment("card1", "a1") assert "text" not in result and "data" not in result @pytest.mark.asyncio async def test_linked_card_fetched(monkeypatch): _fake_attachment(monkeypatch, kind="card", url="https://trello.com/c/zzz/1-x") async def fake_get_card(url): return {"id": "linked", "url": url} monkeypatch.setattr(server.trello, "get_card", fake_get_card) result = await server.trello_get_attachment("card1", "a1") assert result["card"] == {"id": "linked", "url": "https://trello.com/c/zzz/1-x"}