|
| 1 | +import datetime |
| 2 | + |
| 3 | +from telegram_mcp.tools import messages |
| 4 | +from telegram_mcp.tools.messages import message_to_dict |
| 5 | + |
| 6 | + |
| 7 | +class _FwdHeader: |
| 8 | + """telethon.tl.types.MessageFwdHeader, trimmed to what the code reads.""" |
| 9 | + |
| 10 | + def __init__(self, date=None, from_name=None, channel_post=None, post_author=None): |
| 11 | + self.date = date |
| 12 | + self.from_name = from_name |
| 13 | + self.channel_post = channel_post |
| 14 | + self.post_author = post_author |
| 15 | + self.from_id = object() # a Peer; the code never inspects it directly |
| 16 | + |
| 17 | + |
| 18 | +class _Chat: |
| 19 | + def __init__(self, title=None, username=None, first_name=None, last_name=None): |
| 20 | + self.title = title |
| 21 | + self.username = username |
| 22 | + self.first_name = first_name |
| 23 | + self.last_name = last_name |
| 24 | + |
| 25 | + |
| 26 | +class _Forward: |
| 27 | + """telethon.tl.custom.Forward — resolves the peer from response entities.""" |
| 28 | + |
| 29 | + def __init__(self, chat=None, chat_id=None, sender=None): |
| 30 | + self.chat = chat |
| 31 | + self.chat_id = chat_id |
| 32 | + self.sender = sender |
| 33 | + |
| 34 | + |
| 35 | +class _Msg: |
| 36 | + def __init__(self, fwd_from=None, forward=None): |
| 37 | + self.id = 184 |
| 38 | + self.date = datetime.datetime(2026, 8, 5, 16, 38, 3, tzinfo=datetime.timezone.utc) |
| 39 | + self.message = "post body" |
| 40 | + self.sender = None |
| 41 | + self.fwd_from = fwd_from |
| 42 | + self.forward = forward |
| 43 | + |
| 44 | + |
| 45 | +FWD_DATE = datetime.datetime(2026, 7, 15, 12, 1, 2, tzinfo=datetime.timezone.utc) |
| 46 | + |
| 47 | + |
| 48 | +def test_public_channel_forward_keeps_attribution_and_builds_permalink(): |
| 49 | + """from_name is empty on an ordinary channel forward — the origin is in from_id. |
| 50 | +
|
| 51 | + Reading only from_name loses everything the Telegram UI shows as |
| 52 | + "Forwarded from ...", which is the common case rather than an edge one. |
| 53 | + """ |
| 54 | + msg = _Msg( |
| 55 | + fwd_from=_FwdHeader(date=FWD_DATE, channel_post=6279), |
| 56 | + forward=_Forward( |
| 57 | + chat=_Chat(title="Полезный Парфун", username="ParfunA"), chat_id=-1001626974925 |
| 58 | + ), |
| 59 | + ) |
| 60 | + |
| 61 | + fwd = message_to_dict(msg)["forwarded"] |
| 62 | + |
| 63 | + assert fwd["date"] == FWD_DATE |
| 64 | + assert fwd["from_chat"] == "Полезный Парфун" |
| 65 | + assert fwd["from_username"] == "ParfunA" |
| 66 | + assert fwd["from_chat_id"] == -1001626974925 |
| 67 | + assert fwd["channel_post"] == 6279 |
| 68 | + assert fwd["post_link"] == "https://t.me/ParfunA/6279" |
| 69 | + |
| 70 | + |
| 71 | +def test_private_channel_forward_uses_the_members_only_link_form(): |
| 72 | + msg = _Msg( |
| 73 | + fwd_from=_FwdHeader(date=FWD_DATE, channel_post=42), |
| 74 | + forward=_Forward(chat=_Chat(title="Private notes"), chat_id=-1001626974925), |
| 75 | + ) |
| 76 | + |
| 77 | + fwd = message_to_dict(msg)["forwarded"] |
| 78 | + |
| 79 | + assert "from_username" not in fwd |
| 80 | + assert fwd["post_link"] == "https://t.me/c/1626974925/42" |
| 81 | + |
| 82 | + |
| 83 | +def test_user_forward_reports_the_sender_name(): |
| 84 | + msg = _Msg( |
| 85 | + fwd_from=_FwdHeader(date=FWD_DATE), |
| 86 | + forward=_Forward(sender=_Chat(first_name="Ada", last_name="Lovelace"), chat_id=None), |
| 87 | + ) |
| 88 | + |
| 89 | + fwd = message_to_dict(msg)["forwarded"] |
| 90 | + |
| 91 | + assert fwd["from_user"] == "Ada Lovelace" |
| 92 | + assert "post_link" not in fwd |
| 93 | + |
| 94 | + |
| 95 | +def test_hidden_profile_forward_still_falls_back_to_from_name(): |
| 96 | + """Telegram sets from_name only when the original author hides their profile.""" |
| 97 | + msg = _Msg( |
| 98 | + fwd_from=_FwdHeader(date=FWD_DATE, from_name="Someone"), |
| 99 | + forward=_Forward(), |
| 100 | + ) |
| 101 | + |
| 102 | + fwd = message_to_dict(msg)["forwarded"] |
| 103 | + |
| 104 | + assert fwd["from_name"] == "Someone" |
| 105 | + assert "from_chat" not in fwd |
| 106 | + |
| 107 | + |
| 108 | +def test_message_without_forward_header_is_unaffected(): |
| 109 | + assert "forwarded" not in message_to_dict(_Msg()) |
| 110 | + |
| 111 | + |
| 112 | +def test_link_domain_is_overridable(monkeypatch): |
| 113 | + """t.me was unreachable for a day in July 2026; the domain must not be hardcoded.""" |
| 114 | + monkeypatch.setattr(messages, "LINK_DOMAIN", "telegram.me") |
| 115 | + msg = _Msg( |
| 116 | + fwd_from=_FwdHeader(date=FWD_DATE, channel_post=6279), |
| 117 | + forward=_Forward(chat=_Chat(title="Полезный Парфун", username="ParfunA")), |
| 118 | + ) |
| 119 | + |
| 120 | + assert message_to_dict(msg)["forwarded"]["post_link"] == "https://telegram.me/ParfunA/6279" |
0 commit comments