diff --git a/aiogram/api/types/user.py b/aiogram/api/types/user.py index 273bba38..075c18cd 100644 --- a/aiogram/api/types/user.py +++ b/aiogram/api/types/user.py @@ -46,6 +46,16 @@ class User(TelegramObject): return f"{self.first_name} {self.last_name}" return self.first_name + @property + def mention(self) -> str: + """ + Get user's username to mention him. + Full name will be returned if user has no username. + """ + if self.username: + return "@" + self.username + return self.full_name + @property def url(self) -> str: """ diff --git a/tests/test_api/test_types/test_user.py b/tests/test_api/test_types/test_user.py index 9d18a609..ee5da13f 100644 --- a/tests/test_api/test_types/test_user.py +++ b/tests/test_api/test_types/test_user.py @@ -1,6 +1,5 @@ -from asyncio import Future from unittest import mock -from unittest.mock import PropertyMock, _patch, patch +from unittest.mock import PropertyMock, _patch import pytest @@ -31,6 +30,22 @@ class TestUser: user = User(id=42, is_bot=False, first_name=first_name, last_name=last_name) assert user.full_name == expected_full_name + @pytest.mark.parametrize( + "first_name, last_name, username, expected_mention", + [ + ["User", "Name", None, "User Name"], + ["User", "Name", "", "User Name"], + ["User", "Name", "UserName", "@UserName"], + ["Only", "Space", " ", "@ "], + ["With", "Space", "with space", "@with space"], + ], + ) + def test_mention(self, first_name: str, last_name: str, username: str, expected_mention: str): + user = User( + id=42, is_bot=False, first_name=first_name, last_name=last_name, username=username + ) + assert user.mention == expected_mention + @pytest.mark.parametrize( "user_id, expected_url", [