From 5fc5e292c42fac6e639234543a9521812f3937d5 Mon Sep 17 00:00:00 2001 From: AzideCupric Date: Thu, 15 Feb 2024 00:14:21 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E2=9C=A8=20=E4=BC=98=E5=8C=96=20P?= =?UTF-8?q?ost=20=E7=9A=84=20=5F=5Fstr=5F=5F=20=E8=BE=93=E5=87=BA=20(#476)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :sparkles: 优化Post类的__str__ * :white_check_mark: 补充转发测试 --- nonebot_bison/post/post.py | 27 ++++++++- tests/post/test_generate.py | 106 ++++++++++++++++++++++++++++++++++-- 2 files changed, 127 insertions(+), 6 deletions(-) diff --git a/nonebot_bison/post/post.py b/nonebot_bison/post/post.py index 107c60e..5e68925 100644 --- a/nonebot_bison/post/post.py +++ b/nonebot_bison/post/post.py @@ -1,7 +1,8 @@ +import reprlib from io import BytesIO from pathlib import Path from typing import TYPE_CHECKING -from dataclasses import dataclass +from dataclasses import fields, dataclass from nonebot.log import logger from nonebot_plugin_saa import MessageSegmentFactory @@ -82,3 +83,27 @@ class Post(AbstractPost): continue else: raise ThemeRenderError(f"No theme can render Post of {self.platform.__class__.__name__}") + + def __str__(self) -> str: + aRepr = reprlib.Repr() + aRepr.maxstring = 100 + + post_format = f"""## Post: {id(self):X} ## + +{self.content if len(self.content) < 200 else self.content[:200] + '...'} + +来源: +""" + post_format += "附加信息:\n" + for field in fields(self): + if field.name in ("content", "platform", "repost"): + continue + value = getattr(self, field.name) + if value is not None: + post_format += f"- {field.name}: {aRepr.repr(value)}\n" + + if self.repost: + post_format += "\n转发:\n" + post_format += str(self.repost) + + return post_format diff --git a/tests/post/test_generate.py b/tests/post/test_generate.py index 2f27125..9780924 100644 --- a/tests/post/test_generate.py +++ b/tests/post/test_generate.py @@ -24,8 +24,8 @@ def mock_platform(app: App): from nonebot_bison.platform.platform import NewMessage class MockPlatform(NewMessage): - platform_name = "mock_platform" - name = "Mock Platform" + platform_name = "mock-platform" + name = "Mock-Platform" enabled = True is_common = True schedule_interval = 10 @@ -37,7 +37,7 @@ def mock_platform(app: App): @classmethod async def get_target_name(cls, client, _: "Target"): - return "MockPlatform" + return "MockPlatformTarget" def get_id(self, post: "RawPost") -> Any: return post["id"] @@ -50,7 +50,7 @@ def mock_platform(app: App): self, raw_post["text"], url="http://t.tt/" + str(self.get_id(raw_post)), - nickname="Mock", + nickname="MockNick", ) @classmethod @@ -64,6 +64,102 @@ def mock_platform(app: App): return MockPlatform +async def test_display(mock_platform): + from nonebot_bison.post import Post + + post = Post( + mock_platform, + "Rebum delenit iusto augue in rebum sanctus diam stet clita voluptua amet tempor sea in.\n" + "Vel ullamcorper dolore clita eos amet tempor velit amet in.\n" + "Vero hendrerit vero diam et lorem blandit ex diam ex amet.\n" + "Voluptua et sed diam erat et diam lorem lorem no euismod sadipscing rebum feugiat est elitr autem.\n", + title="Ipsum consectetuer voluptua eirmod aliquyam dolore eu volutpat ipsum ipsum eirmod nulla.", + images=[ + b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89", + b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89", + ], + timestamp=1612345678, + url="http://t.tt/diam-duo-autem-sed-sadipscing-invidunt", + avatar=( + b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89" + ), + nickname="Mock", + description="Labore amet ut invidunt dolor consectetuer ipsum sadipscing sed minim diam rebum justo tincidunt.", + ) + assert str(post) == rf"""## Post: {id(post):X} ## + +Rebum delenit iusto augue in rebum sanctus diam stet clita voluptua amet tempor sea in. +Vel ullamcorper dolore clita eos amet tempor velit amet in. +Vero hendrerit vero diam et lorem blandit ex diam ex... + +来源: +附加信息: +- compress: False +- title: 'Ipsum consectetuer voluptua eirmod aliquyam dolore eu volutpat ipsum ipsum eirmod nulla.' +- images: [b'\x89PNG\r\n...f\x15\xc4\x89', b'\x89PNG\r\n...f\x15\xc4\x89'] +- timestamp: 1612345678 +- url: 'http://t.tt/diam-duo-autem-sed-sadipscing-invidunt' +- avatar: b'\x89PNG\r\n...f\x15\xc4\x89' +- nickname: 'Mock' +- description: 'Labore amet ut invidunt dolor consectetuer ipsum sadipscing sed minim diam rebum justo tincidunt.' +""" # noqa: E501 + post2 = Post( + mock_platform, + "Rebum delenit iusto augue in rebum sanctus diam stet clita voluptua amet tempor sea in.\n" + "Vel ullamcorper dolore clita eos amet tempor velit amet in.\n" + "Vero hendrerit vero diam et lorem blandit ex diam ex amet.\n" + "Voluptua et sed diam erat et diam lorem lorem no euismod sadipscing rebum feugiat est elitr autem.\n", + title="Ipsum consectetuer voluptua eirmod aliquyam dolore eu volutpat ipsum ipsum eirmod nulla.", + images=[ + b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89", + b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89", + ], + timestamp=1612345678, + url="http://t.tt/diam-duo-autem-sed-sadipscing-invidunt", + avatar=( + b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89" + ), + nickname="Mock2", + description="Labore amet ut invidunt dolor consectetuer ipsum sadipscing sed minim diam rebum justo tincidunt.", + repost=post, + ) + assert str(post2) == rf"""## Post: {id(post2):X} ## + +Rebum delenit iusto augue in rebum sanctus diam stet clita voluptua amet tempor sea in. +Vel ullamcorper dolore clita eos amet tempor velit amet in. +Vero hendrerit vero diam et lorem blandit ex diam ex... + +来源: +附加信息: +- compress: False +- title: 'Ipsum consectetuer voluptua eirmod aliquyam dolore eu volutpat ipsum ipsum eirmod nulla.' +- images: [b'\x89PNG\r\n...f\x15\xc4\x89', b'\x89PNG\r\n...f\x15\xc4\x89'] +- timestamp: 1612345678 +- url: 'http://t.tt/diam-duo-autem-sed-sadipscing-invidunt' +- avatar: b'\x89PNG\r\n...f\x15\xc4\x89' +- nickname: 'Mock2' +- description: 'Labore amet ut invidunt dolor consectetuer ipsum sadipscing sed minim diam rebum justo tincidunt.' + +转发: +## Post: {id(post):X} ## + +Rebum delenit iusto augue in rebum sanctus diam stet clita voluptua amet tempor sea in. +Vel ullamcorper dolore clita eos amet tempor velit amet in. +Vero hendrerit vero diam et lorem blandit ex diam ex... + +来源: +附加信息: +- compress: False +- title: 'Ipsum consectetuer voluptua eirmod aliquyam dolore eu volutpat ipsum ipsum eirmod nulla.' +- images: [b'\x89PNG\r\n...f\x15\xc4\x89', b'\x89PNG\r\n...f\x15\xc4\x89'] +- timestamp: 1612345678 +- url: 'http://t.tt/diam-duo-autem-sed-sadipscing-invidunt' +- avatar: b'\x89PNG\r\n...f\x15\xc4\x89' +- nickname: 'Mock' +- description: 'Labore amet ut invidunt dolor consectetuer ipsum sadipscing sed minim diam rebum justo tincidunt.' +""" + + @pytest.mark.asyncio async def test_generate_msg(mock_platform): from nonebot_plugin_saa import Text, Image @@ -77,7 +173,7 @@ async def test_generate_msg(mock_platform): res = await post.generate() assert len(res) == 1 assert isinstance(res[0], Text) - assert str(res[0]) == "p1\n来源: Mock Platform Mock\n详情: http://t.tt/1" + assert str(res[0]) == "p1\n来源: Mock-Platform MockNick\n详情: http://t.tt/1" post.platform.default_theme = "ht2i" assert post.get_config_theme() is None