From fc2bf6d58b664f4413af21ec2b1d6d45059bada8 Mon Sep 17 00:00:00 2001 From: Ilya Samartsev Date: Fri, 4 Sep 2020 17:40:40 +0300 Subject: [PATCH] add tests and small fixes --- aiogram/utils/text_decorations.py | 16 +++++++++++---- tests/test_utils/test_text_decorations.py | 25 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 tests/test_utils/test_text_decorations.py diff --git a/aiogram/utils/text_decorations.py b/aiogram/utils/text_decorations.py index 58812d57..81592465 100644 --- a/aiogram/utils/text_decorations.py +++ b/aiogram/utils/text_decorations.py @@ -57,7 +57,7 @@ class TextDecoration(ABC): """ result = "".join( self._unparse_entities( - text.encode('utf-16-le'), sorted(entities, key=lambda item: item.offset) if entities else [] + self._add_surrogates(text), sorted(entities, key=lambda item: item.offset) if entities else [] ) ) return result @@ -76,8 +76,8 @@ class TextDecoration(ABC): for index, entity in enumerate(entities): if entity.offset * 2 < offset: continue - if entity.offset * 2> offset: - yield self.quote(text[offset : entity.offset * 2].decode('utf-16-le')) + if entity.offset * 2 > offset: + yield self.quote(self._remove_surrogates(text[offset : entity.offset * 2])) start = entity.offset * 2 offset = entity.offset * 2 + entity.length * 2 @@ -94,7 +94,15 @@ class TextDecoration(ABC): ) if offset < length: - yield self.quote(text[offset:length].decode('utf-16-le')) + yield self.quote(self._remove_surrogates(text[offset:length])) + + @staticmethod + def _add_surrogates(text: str): + return text.encode('utf-16-le') + + @staticmethod + def _remove_surrogates(text: bytes): + return text.decode('utf-16-le') @abstractmethod def link(self, value: str, link: str) -> str: # pragma: no cover diff --git a/tests/test_utils/test_text_decorations.py b/tests/test_utils/test_text_decorations.py new file mode 100644 index 00000000..dd0e595d --- /dev/null +++ b/tests/test_utils/test_text_decorations.py @@ -0,0 +1,25 @@ +from aiogram.types import MessageEntity, MessageEntityType +from aiogram.utils import text_decorations + + +class TestTextDecorations: + def test_unparse_entities_normal_text(self): + assert text_decorations.markdown_decoration.unparse( + "hi i'm bold and italic and still bold", + entities=[ + MessageEntity(offset=3, length=34, type=MessageEntityType.BOLD), + MessageEntity(offset=12, length=10, type=MessageEntityType.ITALIC), + ] + ) == "hi *i'm bold _and italic_\r and still bold*" + + def test_unparse_entities_emoji_text(self): + """ + emoji is encoded as two chars in json + """ + assert text_decorations.markdown_decoration.unparse( + "🚀 i'm bold and italic and still bold", + entities=[ + MessageEntity(offset=3, length=34, type=MessageEntityType.BOLD), + MessageEntity(offset=12, length=10, type=MessageEntityType.ITALIC), + ] + ) == "🚀 *i'm bold _and italic_\r and still bold*"