♻️ use saa

This commit is contained in:
felinae98
2023-03-24 21:17:52 +08:00
parent 4118329bb0
commit da8e988ee9
15 changed files with 223 additions and 308 deletions
+7
View File
@@ -3,6 +3,7 @@ from pathlib import Path
import nonebot
import pytest
from nonebot.adapters.onebot.v11 import Adapter as OnebotV11Adapter
from nonebug import NONEBOT_INIT_KWARGS, App
from pytest_mock.plugin import MockerFixture
from sqlalchemy import delete
@@ -19,6 +20,12 @@ def pytest_configure(config: pytest.Config) -> None:
}
@pytest.fixture(scope="session", autouse=True)
def load_adapters(nonebug_init: None):
driver = nonebot.get_driver()
driver.register_adapter(OnebotV11Adapter)
@pytest.fixture
async def app(tmp_path: Path, request: pytest.FixtureRequest, mocker: MockerFixture):
sys.path.append(str(Path(__file__).parent.parent / "src" / "plugins"))
+7 -5
View File
@@ -1,6 +1,7 @@
import pytest
import respx
from httpx import Response
from nonebot_plugin_saa.nonebug import should_send_saa
from nonebug.app import App
from .platforms.utils import get_json
@@ -279,7 +280,7 @@ async def test_abort_add_on_tag(app: App, init_scheduler):
async def test_abort_del_sub(app: App, init_scheduler):
from nonebot.adapters.onebot.v11.bot import Bot
from nonebot.adapters.onebot.v11.message import Message
from nonebot_plugin_saa import TargetQQGroup
from nonebot_plugin_saa import MessageFactory, TargetQQGroup
from nonebot_bison.config import config
from nonebot_bison.config_manager import del_sub_matcher
@@ -303,12 +304,13 @@ async def test_abort_del_sub(app: App, init_scheduler):
ctx.receive_event(bot, event)
ctx.should_pass_rule()
ctx.should_pass_permission()
ctx.should_call_send(
event,
Message(
should_send_saa(
ctx,
MessageFactory(
"订阅的帐号为:\n1 weibo 明日方舟Arknights 6279793937\n [图文] 明日方舟\n请输入要删除的订阅的序号\n输入'取消'中止"
),
True,
bot,
event=event,
)
event_abort = fake_group_message_event(
message=Message("取消"), sender=fake_admin_user
+18 -10
View File
@@ -1,6 +1,7 @@
import pytest
import respx
from httpx import Response
from nonebot_plugin_saa.nonebug import should_send_saa
from nonebug.app import App
from .platforms.utils import get_json
@@ -9,8 +10,9 @@ from .utils import fake_admin_user, fake_group_message_event
@pytest.mark.asyncio
async def test_query_sub(app: App, init_scheduler):
from nonebot.adapters.onebot.v11.message import Message
from nonebot_plugin_saa import TargetQQGroup
from nonebot import get_driver
from nonebot.adapters.onebot.v11 import Bot, Message
from nonebot_plugin_saa import MessageFactory, SupportedAdapters, TargetQQGroup
from nonebot_bison.config import config
from nonebot_bison.config_manager import query_sub_matcher
@@ -26,13 +28,18 @@ async def test_query_sub(app: App, init_scheduler):
["明日方舟"],
)
async with app.test_matcher(query_sub_matcher) as ctx:
bot = ctx.create_bot()
adapter = get_driver()._adapters[str(SupportedAdapters.onebot_v11)]
bot = ctx.create_bot(base=Bot, adapter=adapter)
event = fake_group_message_event(message=Message("查询订阅"), to_me=True)
ctx.receive_event(bot, event)
ctx.should_pass_rule()
ctx.should_pass_permission()
ctx.should_call_send(
event, Message("订阅的帐号为:\nweibo 明日方舟Arknights 6279793937 [图文] 明日方舟\n"), True
should_send_saa(
ctx,
MessageFactory("订阅的帐号为:\nweibo 明日方舟Arknights 6279793937 [图文] 明日方舟\n"),
bot,
event=event,
)
@@ -40,7 +47,7 @@ async def test_query_sub(app: App, init_scheduler):
async def test_del_sub(app: App, init_scheduler):
from nonebot.adapters.onebot.v11.bot import Bot
from nonebot.adapters.onebot.v11.message import Message
from nonebot_plugin_saa import TargetQQGroup
from nonebot_plugin_saa import MessageFactory, TargetQQGroup
from nonebot_bison.config import config
from nonebot_bison.config_manager import del_sub_matcher
@@ -64,12 +71,13 @@ async def test_del_sub(app: App, init_scheduler):
ctx.receive_event(bot, event)
ctx.should_pass_rule()
ctx.should_pass_permission()
ctx.should_call_send(
event,
Message(
should_send_saa(
ctx,
MessageFactory(
"订阅的帐号为:\n1 weibo 明日方舟Arknights 6279793937\n [图文] 明日方舟\n请输入要删除的订阅的序号\n输入'取消'中止"
),
True,
bot,
event=event,
)
event_1_err = fake_group_message_event(
message=Message("2"), sender=fake_admin_user
+9 -14
View File
@@ -1,28 +1,23 @@
import base64
import hashlib
import platform
from io import UnsupportedOperation
from pathlib import Path
import pytest
import respx
from httpx import Response
from nonebot.adapters.onebot.v11.message import MessageSegment
from nonebot_plugin_saa import Image, MessageSegmentFactory, Text
from nonebug.app import App
@pytest.fixture
def ms_list():
msg_segments: list[MessageSegment] = []
msg_segments.append(MessageSegment.text("【Zc】每早合约日替攻略!"))
msg_segments: list[MessageSegmentFactory] = []
msg_segments.append(Text("【Zc】每早合约日替攻略!"))
msg_segments.append(
MessageSegment.image(
file="http://i0.hdslb.com/bfs/live/new_room_cover/cf7d4d3b2f336c6dba299644c3af952c5db82612.jpg",
cache=0,
Image(
image="http://i0.hdslb.com/bfs/live/new_room_cover/cf7d4d3b2f336c6dba299644c3af952c5db82612.jpg",
)
)
msg_segments.append(MessageSegment.text("来源: Bilibili直播 魔法Zc目录"))
msg_segments.append(MessageSegment.text("详情: https://live.bilibili.com/3044248"))
msg_segments.append(Text("来源: Bilibili直播 魔法Zc目录"))
msg_segments.append(Text("详情: https://live.bilibili.com/3044248"))
return msg_segments
@@ -35,7 +30,7 @@ def expected_md():
def test_gene_md(app: App, expected_md, ms_list):
from nonebot_bison.post.custom_post import CustomPost
cp = CustomPost(message_segments=ms_list)
cp = CustomPost(ms_factories=ms_list)
cp_md = cp._generate_md()
assert cp_md == expected_md
@@ -55,7 +50,7 @@ async def test_gene_pic(app: App, ms_list, expected_md):
pic_router.mock(return_value=Response(200, stream=mock_pic))
cp = CustomPost(message_segments=ms_list)
cp = CustomPost(ms_factories=ms_list)
cp_pic_msg_md: str = cp._generate_md()
assert cp_pic_msg_md == expected_md
+3 -1
View File
@@ -8,6 +8,8 @@ from nonebug.app import App
@pytest.mark.asyncio
@pytest.mark.render
async def test_render(app: App):
from nonebot_plugin_saa import Image
from nonebot_bison.plugin_config import plugin_config
from nonebot_bison.utils import parse_text
@@ -23,4 +25,4 @@ VuePress 由两部分组成:第一部分是一个极简静态网站生成器
每一个由 VuePress 生成的页面都带有预渲染好的 HTML,也因此具有非常好的加载性能和搜索引擎优化(SEO)。同时,一旦页面被加载,Vue 将接管这些静态内容,并将其转换成一个完整的单页应用(SPA),其他的页面则会只在用户浏览到的时候才按需加载。
"""
)
assert res.type == "image"
assert isinstance(res, Image)
+62 -144
View File
@@ -3,36 +3,34 @@ import typing
import pytest
from flaky import flaky
from nonebot_plugin_saa.nonebug import should_send_saa
from nonebug import App
from pytest_mock.plugin import MockerFixture
if typing.TYPE_CHECKING:
from nonebot.adapters.onebot.v11.message import Message, MessageSegment
@pytest.mark.asyncio
async def test_send_no_queue(app: App, mocker: MockerFixture):
from nonebot.adapters.onebot.v11.bot import Bot
from nonebot.adapters.onebot.v11.message import Message
from nonebot_plugin_saa import MessageFactory, TargetQQGroup, TargetQQPrivate
from nonebot_bison.plugin_config import plugin_config
from nonebot_bison.send import send_msgs
mocker.patch.object(plugin_config, "bison_use_queue", False)
group_target = TargetQQGroup(group_id=1233)
private_target = TargetQQPrivate(user_id=666)
async with app.test_api() as ctx:
bot = ctx.create_bot(base=Bot)
assert isinstance(bot, Bot)
ctx.should_call_api(
"send_group_msg", {"group_id": "1233", "message": Message("msg1")}, True
should_send_saa(ctx, MessageFactory("msg1"), bot, target=group_target)
should_send_saa(ctx, MessageFactory("msg2"), bot, target=group_target)
should_send_saa(ctx, MessageFactory("priv"), bot, target=private_target)
await send_msgs(
bot, group_target, [MessageFactory("msg1"), MessageFactory("msg2")]
)
ctx.should_call_api(
"send_group_msg", {"group_id": "1233", "message": Message("msg2")}, True
)
ctx.should_call_api(
"send_private_msg", {"user_id": "666", "message": Message("priv")}, True
)
await send_msgs(bot, "1233", "group", [Message("msg1"), Message("msg2")])
await send_msgs(bot, "666", "private", [Message("priv")])
await send_msgs(bot, private_target, [MessageFactory("priv")])
assert ctx.wait_list.empty()
@@ -40,11 +38,10 @@ async def test_send_no_queue(app: App, mocker: MockerFixture):
async def test_send_queue(app: App, mocker: MockerFixture):
import nonebot
from nonebot.adapters.onebot.v11.bot import Bot
from nonebot.adapters.onebot.v11.message import Message, MessageSegment
from nonebot_plugin_saa import MessageFactory, TargetQQGroup
from nonebot_bison import send
from nonebot_bison.plugin_config import plugin_config
from nonebot_bison.send import MESSGE_SEND_INTERVAL, do_send_msgs, send_msgs
from nonebot_bison.send import MESSGE_SEND_INTERVAL, send_msgs
mocker.patch.object(plugin_config, "bison_use_queue", True)
async with app.test_api() as ctx:
@@ -53,39 +50,28 @@ async def test_send_queue(app: App, mocker: MockerFixture):
bot = nonebot.get_bot()
assert isinstance(bot, Bot)
assert bot == new_bot
ctx.should_call_api(
"send_group_msg",
{"group_id": "1233", "message": [MessageSegment.text("msg")]},
True,
)
ctx.should_call_api(
"send_group_msg",
{"group_id": "1233", "message": [MessageSegment.text("msg2")]},
True,
)
await send_msgs(bot, "1233", "group", [Message("msg")])
await send_msgs(bot, "1233", "group", [Message("msg2")])
target = TargetQQGroup(group_id=1233)
should_send_saa(ctx, MessageFactory("msg"), bot, target=target)
should_send_saa(ctx, MessageFactory("msg2"), bot, target=target)
await send_msgs(bot, target, [MessageFactory("msg")])
await send_msgs(bot, target, [MessageFactory("msg2")])
assert not ctx.wait_list.empty()
await asyncio.sleep(2 * MESSGE_SEND_INTERVAL)
assert ctx.wait_list.empty()
def gen_node(id, name, content: "Message"):
from nonebot.adapters.onebot.v11.message import MessageSegment
return MessageSegment.node_custom(id, name, content)
def _merge_messge(nodes):
from nonebot.adapters.onebot.v11.message import Message
return Message(nodes)
@pytest.mark.asyncio
async def test_send_merge_no_queue(app: App):
from nonebot.adapters.onebot.v11.bot import Bot
from nonebot.adapters.onebot.v11.message import Message, MessageSegment
from nonebot_plugin_saa import (
AggregatedMessageFactory,
Image,
MessageFactory,
TargetQQGroup,
Text,
)
from nonebot_bison.plugin_config import plugin_config
from nonebot_bison.send import send_msgs
@@ -96,100 +82,46 @@ async def test_send_merge_no_queue(app: App):
async with app.test_api() as ctx:
bot = ctx.create_bot(base=Bot, self_id="8888")
assert isinstance(bot, Bot)
message = [
Message(MessageSegment.text("test msg")),
Message(MessageSegment.image("https://picsum.photos/200/300")),
]
ctx.should_call_api(
"send_group_msg",
{"group_id": 633, "message": Message(MessageSegment.text("test msg"))},
None,
)
ctx.should_call_api(
"send_group_msg",
{"group_id": 633, "message": message[1]},
None,
)
await send_msgs(bot, 633, "group", message)
target = TargetQQGroup(group_id=633)
message = [
Message(MessageSegment.text("test msg")),
Message(MessageSegment.image("https://picsum.photos/200/300")),
Message(MessageSegment.image("https://picsum.photos/200/300")),
MessageFactory(Text("test msg")),
MessageFactory(Image("https://picsum.photos/200/300")),
]
ctx.should_call_api(
"send_group_msg",
{"group_id": 633, "message": Message(MessageSegment.text("test msg"))},
None,
)
ctx.should_call_api(
"get_group_member_info",
{"group_id": 633, "user_id": 8888, "no_cache": True},
{"user_id": 8888, "card": "admin", "nickname": "adminuser"},
)
merged_message = _merge_messge(
[gen_node(8888, "admin", message[1]), gen_node(8888, "admin", message[2])]
)
ctx.should_call_api(
"send_group_forward_msg",
{"group_id": 633, "messages": merged_message},
None,
)
await send_msgs(bot, 633, "group", message)
should_send_saa(ctx, message[0], bot, target=target)
should_send_saa(ctx, message[1], bot, target=target)
await send_msgs(bot, target, message)
message = [
Message(MessageSegment.text("test msg")),
Message(MessageSegment.image("https://picsum.photos/200/300")),
Message(MessageSegment.image("https://picsum.photos/200/300")),
Message(MessageSegment.image("https://picsum.photos/200/300")),
MessageFactory(Text("test msg")),
MessageFactory(Image("https://picsum.photos/200/300")),
MessageFactory(Image("https://picsum.photos/200/300")),
]
ctx.should_call_api(
"send_group_msg",
{"group_id": 633, "message": Message(MessageSegment.text("test msg"))},
None,
)
ctx.should_call_api(
"get_group_member_info",
{"group_id": 633, "user_id": 8888, "no_cache": True},
{"user_id": 8888, "card": None, "nickname": "adminuser"},
)
merged_message = _merge_messge(
[
gen_node(8888, "adminuser", message[1]),
gen_node(8888, "adminuser", message[2]),
gen_node(8888, "adminuser", message[3]),
]
)
ctx.should_call_api(
"send_group_forward_msg",
{"group_id": 633, "messages": merged_message},
None,
)
await send_msgs(bot, 633, "group", message)
should_send_saa(ctx, message[0], bot, target=target)
should_send_saa(ctx, AggregatedMessageFactory(message[1:]), bot, target=target)
# import ipdb; ipdb.set_trace()
await send_msgs(bot, target, message)
# private user should not send in forward
message = [
Message(MessageSegment.text("test msg")),
Message(MessageSegment.image("https://picsum.photos/200/300")),
Message(MessageSegment.image("https://picsum.photos/200/300")),
MessageFactory(Text("test msg")),
MessageFactory(Image("https://picsum.photos/200/300")),
MessageFactory(Image("https://picsum.photos/200/300")),
MessageFactory(Image("https://picsum.photos/200/300")),
]
ctx.should_call_api(
"send_private_msg",
{"user_id": 633, "message": Message(MessageSegment.text("test msg"))},
None,
)
ctx.should_call_api(
"send_private_msg", {"user_id": 633, "message": message[1]}, None
)
ctx.should_call_api(
"send_private_msg", {"user_id": 633, "message": message[2]}, None
)
await send_msgs(bot, 633, "private", message)
should_send_saa(ctx, message[0], bot, target=target)
should_send_saa(ctx, AggregatedMessageFactory(message[1:]), bot, target=target)
await send_msgs(bot, target, message)
async def test_send_merge2_no_queue(app: App):
from nonebot.adapters.onebot.v11.bot import Bot
from nonebot.adapters.onebot.v11.message import Message, MessageSegment
from nonebot_plugin_saa import (
AggregatedMessageFactory,
Image,
MessageFactory,
TargetQQGroup,
Text,
)
from nonebot_bison.plugin_config import plugin_config
from nonebot_bison.send import send_msgs
@@ -200,26 +132,12 @@ async def test_send_merge2_no_queue(app: App):
async with app.test_api() as ctx:
bot = ctx.create_bot(base=Bot, self_id="8888")
assert isinstance(bot, Bot)
target = TargetQQGroup(group_id=633)
message = [
Message(MessageSegment.text("test msg")),
Message(MessageSegment.image("https://picsum.photos/200/300")),
Message(MessageSegment.image("https://picsum.photos/200/300")),
MessageFactory(Text("test msg")),
MessageFactory(Image("https://picsum.photos/200/300")),
MessageFactory(Image("https://picsum.photos/200/300")),
]
ctx.should_call_api(
"get_group_member_info",
{"group_id": 633, "user_id": 8888, "no_cache": True},
{"user_id": 8888, "card": "admin", "nickname": "adminuser"},
)
merged_message = _merge_messge(
[
gen_node(8888, "admin", message[0]),
gen_node(8888, "admin", message[1]),
gen_node(8888, "admin", message[2]),
]
)
ctx.should_call_api(
"send_group_forward_msg",
{"group_id": 633, "messages": merged_message},
None,
)
await send_msgs(bot, 633, "group", message)
should_send_saa(ctx, AggregatedMessageFactory(message), bot, target=target)
await send_msgs(bot, target, message)