mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-12 18:19:34 +00:00
Added create_channel_bot_link function
This commit is contained in:
parent
62a9f0cb6e
commit
cf269e15f4
2 changed files with 100 additions and 4 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue