优化 Post 的 __str__ 输出 (#476)

*  优化Post类的__str__

*  补充转发测试
This commit is contained in:
AzideCupric 2024-02-15 00:14:21 +08:00 committed by felinae98
parent 1cbf53363b
commit 5fc5e292c4
2 changed files with 127 additions and 6 deletions

View File

@ -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] + '...'}
来源: <Platform {self.platform.platform_name}>
"""
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

View File

@ -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...
来源: <Platform mock-platform>
附加信息:
- 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...
来源: <Platform mock-platform>
附加信息:
- 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...
来源: <Platform mock-platform>
附加信息:
- 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