mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-12 10:11:52 +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:
|
def create_telegram_link(*path: str, **kwargs: Any) -> str:
|
||||||
return _format_url("https://t.me", *path, **kwargs)
|
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 typing import Any, Dict
|
||||||
|
from urllib.parse import parse_qs
|
||||||
|
|
||||||
import pytest
|
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:
|
class TestLink:
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"base,params,result",
|
"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):
|
def test_create_tg_link(self, base: str, params: Dict[str, Any], result: str):
|
||||||
assert create_tg_link(base, **params) == result
|
assert create_tg_link(base, **params) == result
|
||||||
|
|
@ -16,8 +24,8 @@ class TestLink:
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"base,params,result",
|
"base,params,result",
|
||||||
[
|
[
|
||||||
["username", dict(), "https://t.me/username"],
|
["username", {}, "https://t.me/username"],
|
||||||
["username", dict(start="test"), "https://t.me/username?start=test"],
|
["username", {"start": "test"}, "https://t.me/username?start=test"],
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_create_telegram_link(self, base: str, params: Dict[str, Any], result: str):
|
def test_create_telegram_link(self, base: str, params: Dict[str, Any], result: str):
|
||||||
|
|
@ -31,3 +39,45 @@ class TestLink:
|
||||||
|
|
||||||
def test_docs(self):
|
def test_docs(self):
|
||||||
assert docs_url("test.html") == f"https://docs.aiogram.dev/en/{BRANCH}/test.html"
|
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