From cf269e15f4a098b051f97bc68bb2e710d3d61d8a Mon Sep 17 00:00:00 2001 From: Alex Root Junior Date: Sun, 23 Apr 2023 03:30:48 +0300 Subject: [PATCH] Added `create_channel_bot_link` function --- aiogram/utils/link.py | 46 +++++++++++++++++++++++++++ tests/test_utils/test_link.py | 58 ++++++++++++++++++++++++++++++++--- 2 files changed, 100 insertions(+), 4 deletions(-) diff --git a/aiogram/utils/link.py b/aiogram/utils/link.py index e4bc28f2..051247fa 100644 --- a/aiogram/utils/link.py +++ b/aiogram/utils/link.py @@ -26,3 +26,49 @@ def create_tg_link(link: str, **kwargs: Any) -> str: def create_telegram_link(*path: str, **kwargs: Any) -> str: return _format_url("https://t.me", *path, **kwargs) + + +def create_channel_bot_link( + username: str, + parameter: Optional[str] = None, + change_info: bool = False, + post_messages: bool = False, + edit_messages: bool = False, + delete_messages: bool = False, + restrict_members: bool = False, + invite_users: bool = False, + pin_messages: bool = False, + promote_members: bool = False, + manage_video_chats: bool = False, + anonymous: bool = False, + manage_chat: bool = False, +) -> str: + params = {} + if parameter is not None: + params["startgroup"] = parameter + permissions = [] + if change_info: + permissions.append("change_info") + if post_messages: + permissions.append("post_messages") + if edit_messages: + permissions.append("edit_messages") + if delete_messages: + permissions.append("delete_messages") + if restrict_members: + permissions.append("restrict_members") + if invite_users: + permissions.append("invite_users") + if pin_messages: + permissions.append("pin_messages") + if promote_members: + permissions.append("promote_members") + if manage_video_chats: + permissions.append("manage_video_chats") + if anonymous: + permissions.append("anonymous") + if manage_chat: + permissions.append("manage_chat") + if permissions: + params["admin"] = "+".join(permissions) + return create_telegram_link(username, **params) diff --git a/tests/test_utils/test_link.py b/tests/test_utils/test_link.py index 8d74f0c6..77419441 100644 --- a/tests/test_utils/test_link.py +++ b/tests/test_utils/test_link.py @@ -1,14 +1,22 @@ +from itertools import product from typing import Any, Dict +from urllib.parse import parse_qs import pytest -from aiogram.utils.link import BRANCH, create_telegram_link, create_tg_link, docs_url +from aiogram.utils.link import ( + BRANCH, + create_telegram_link, + create_tg_link, + docs_url, + create_channel_bot_link, +) class TestLink: @pytest.mark.parametrize( "base,params,result", - [["user", dict(id=42), "tg://user?id=42"]], + [["user", {"id": 42}, "tg://user?id=42"]], ) def test_create_tg_link(self, base: str, params: Dict[str, Any], result: str): assert create_tg_link(base, **params) == result @@ -16,8 +24,8 @@ class TestLink: @pytest.mark.parametrize( "base,params,result", [ - ["username", dict(), "https://t.me/username"], - ["username", dict(start="test"), "https://t.me/username?start=test"], + ["username", {}, "https://t.me/username"], + ["username", {"start": "test"}, "https://t.me/username?start=test"], ], ) def test_create_telegram_link(self, base: str, params: Dict[str, Any], result: str): @@ -31,3 +39,45 @@ class TestLink: def test_docs(self): assert docs_url("test.html") == f"https://docs.aiogram.dev/en/{BRANCH}/test.html" + + +class TestCreateChannelBotLink: + def test_without_params(self): + assert create_channel_bot_link("test_bot") == "https://t.me/test_bot" + + def test_parameter(self): + assert ( + create_channel_bot_link("test_bot", parameter="parameter in group") + == "https://t.me/test_bot?startgroup=parameter+in+group" + ) + + def test_permissions(self): + # Is bad idea to put over 2k cases into parameterized test, + # so I've preferred to implement it inside the test + + params = { + "change_info", + "post_messages", + "edit_messages", + "delete_messages", + "restrict_members", + "invite_users", + "pin_messages", + "promote_members", + "manage_video_chats", + "anonymous", + "manage_chat", + } + + variants = product([True, False], repeat=len(params)) + for index, variants in enumerate(variants): + kwargs = {k: v for k, v in zip(params, variants) if v} + if not kwargs: + # Variant without additional arguments is already covered + continue + + link = create_channel_bot_link("test", **kwargs) + query = parse_qs(link.split("?", maxsplit=1)[-1], max_num_fields=1) + assert "admin" in query + admin = query["admin"][0] + assert set(admin.split("+")) == set(kwargs)