summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/__init__.py0
-rw-r--r--test/test_plugin_anime_search.py32
-rw-r--r--test/test_plugin_chat.py84
-rw-r--r--test/test_plugin_code_runner.py75
-rw-r--r--test/test_plugin_funny.py117
-rw-r--r--test/test_plugin_help.py154
-rw-r--r--test/test_plugin_manage.py293
-rw-r--r--test/test_plugin_rich.py28
-rw-r--r--test/test_plugin_saucenao.py32
-rw-r--r--test/test_plugin_setu.py20
-rw-r--r--test/utils.py87
11 files changed, 922 insertions, 0 deletions
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/__init__.py
diff --git a/test/test_plugin_anime_search.py b/test/test_plugin_anime_search.py
new file mode 100644
index 0000000..2782ba9
--- /dev/null
+++ b/test/test_plugin_anime_search.py
@@ -0,0 +1,32 @@
+import pytest
+from nonebug import App
+
+from nonebot.adapters.onebot.v11 import MessageSegment
+
+from .utils import make_fake_message, make_fake_event
+
+
+async def test_saucenao(app: App):
+ from ATRI.plugins.saucenao import saucenao
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(saucenao) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("以图搜图")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "图呢?", True)
+
+ msg = Message(
+ MessageSegment.image(
+ "https://cdn.jsdelivr.net/gh/Kyomotoi/CDN@master/noting/88674944_p0.png"
+ )
+ )
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "失败了...", False)
diff --git a/test/test_plugin_chat.py b/test/test_plugin_chat.py
new file mode 100644
index 0000000..e04f1d3
--- /dev/null
+++ b/test/test_plugin_chat.py
@@ -0,0 +1,84 @@
+import pytest
+from nonebug import App
+from nonebot.adapters.onebot.v11 import MessageSegment
+
+from .utils import make_fake_message, make_fake_event
+
+
+async def test_chat(app: App):
+ from ATRI.plugins.chat import chat
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(chat) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("爱你")
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "是…是嘛(脸红)呐,其实咱也……", True)
+
+
+async def test_my_name_is(app: App):
+ from ATRI.plugins.chat import my_name_is
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(my_name_is) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("叫我")
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "欧尼酱想让咱如何称呼呢!0w0", True)
+
+ msg = Message("欧尼酱")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "好~w 那咱以后就称呼你为欧尼酱!", True)
+
+
+async def test_say(app: App):
+ from ATRI.plugins.chat import say
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(say) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("说")
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "想要咱复读啥呢...", True)
+
+ msg = Message("nya~")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "nya~", True)
+
+ async with app.test_matcher(say) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("说")
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "想要咱复读啥呢...", True)
+
+ msg = Message(
+ MessageSegment.image(
+ "https://cdn.jsdelivr.net/gh/Kyomotoi/CDN@master/noting/88674944_p0.png"
+ )
+ )
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "不要...", True)
diff --git a/test/test_plugin_code_runner.py b/test/test_plugin_code_runner.py
new file mode 100644
index 0000000..584ebb0
--- /dev/null
+++ b/test/test_plugin_code_runner.py
@@ -0,0 +1,75 @@
+import pytest
+from nonebug import App
+
+from .utils import make_fake_message, make_fake_event
+
+
+async def test_code_runner(app: App):
+ from ATRI.plugins.code_runner import code_runner
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(code_runner) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("/code")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "请键入 /code help 以获取帮助~!", True)
+
+ async with app.test_matcher(code_runner) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("/code help")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ """
+ /code {语言}
+ {代码}
+ For example:
+ /code python
+ print('hello world')
+ """,
+ True,
+ )
+
+ async with app.test_matcher(code_runner) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("/code list")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ """
+ 咱现在支持的语言如下:
+ assembly, bash, c, clojure,
+ coffeescript, cpp, csharp,
+ erlang, fsharp, go, groovy,
+ haskell, java, javascript,
+ julia, kotlin, lua, perl,
+ php, python, ruby, rust,
+ scala, swift, typescript
+ """,
+ True,
+ )
+
+ async with app.test_matcher(code_runner) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message(
+ """
+ /code python
+ print("hello world")
+ """
+ )
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "stdout:\nhello world", True)
diff --git a/test/test_plugin_funny.py b/test/test_plugin_funny.py
new file mode 100644
index 0000000..851a922
--- /dev/null
+++ b/test/test_plugin_funny.py
@@ -0,0 +1,117 @@
+import pytest
+from nonebug import App
+
+from .utils import make_fake_message, make_fake_event
+
+
+async def test_get_laugh(app: App):
+ from ATRI.plugins.funny import get_laugh
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(get_laugh) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("来句笑话")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "哈 哈 哈", True)
+
+
+async def test_me_re_you(app: App):
+ from ATRI.plugins.funny import me_re_you
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(me_re_you) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("超市我")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "超市你", True)
+
+
+async def test_fake_msg(app: App):
+ from ATRI.plugins.funny import fake_msg
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(fake_msg) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("/fakemsg")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "内容呢?格式:qq-name-content\n可构造多条,以上仅为一条,使用空格隔开", True)
+
+ msg = Message("114514")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "内容格式错误,请检查(", True)
+
+ async with app.test_matcher(fake_msg) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("/fakemsg")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "内容呢?格式:qq-name-content\n可构造多条,以上仅为一条,使用空格隔开", True)
+
+ msg = Message("114514-0w0-testing")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ "[{'type': 'node', 'data': {'name': '0w0', 'uin': '114514', 'content': 'testing'}}]",
+ True,
+ )
+
+ async with app.test_matcher(fake_msg) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("/fakemsg")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "内容呢?格式:qq-name-content\n可构造多条,以上仅为一条,使用空格隔开", True)
+
+ msg = Message("114514-0w0-testing")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "构造失败惹...可能是被制裁了(", True)
+
+ async with app.test_matcher(fake_msg) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("/fakemsg")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "慢...慢一..点❤", True)
+
+
+async def test_eat_what(app: App):
+ from ATRI.plugins.funny import eat_what
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(eat_what) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("今天吃什么")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "欧尼酱的智商低下想不到今天要吃甚么,所以由我来选择,我给的答案是(串烧)。选我正解!!", True)
diff --git a/test/test_plugin_help.py b/test/test_plugin_help.py
new file mode 100644
index 0000000..e107150
--- /dev/null
+++ b/test/test_plugin_help.py
@@ -0,0 +1,154 @@
+import pytest
+from nonebug import App
+
+from .utils import make_fake_message, make_fake_event
+
+
+async def test_main_help(app: App):
+ from ATRI.plugins.help import main_help
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(main_help) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("菜单")
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ """
+ 哦呀?~需要帮助?
+ 关于 -查看bot基本信息
+ 服务列表 -以查看所有可用服务
+ 帮助 [服务] -以查看对应服务帮助
+ Tip: 均需要at触发。@bot 菜单 以打开此页面
+ """,
+ True,
+ )
+
+
+async def test_about_me(app: App):
+ from ATRI import __version__
+ from ATRI.config import BotSelfConfig
+ from ATRI.plugins.help import about_me
+
+ temp_list = list()
+ for i in BotSelfConfig.nickname:
+ temp_list.append(i)
+ nickname = "、".join(map(str, temp_list))
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(about_me) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("关于")
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ f"""
+ 唔...是来认识咱的么
+ 可以称呼咱:{nickname}
+ 咱的型号是:{__version__}
+ 想进一步了解:
+ https://github.com/Kyomotoi/ATRI
+ """,
+ True,
+ )
+
+
+async def test_service_list(app: App):
+ import os
+
+ from ATRI.service import SERVICES_DIR
+ from ATRI.plugins.help import service_list
+
+ files = os.listdir(SERVICES_DIR)
+ temp_list = list()
+ for i in files:
+ service = i.replace(".json", "")
+ temp_list.append(service)
+
+ services = "、".join(map(str, temp_list))
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(service_list) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("服务列表")
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ f"""
+ 咱搭载了以下服务~
+ {services}
+ @bot 帮助 [服务] -以查看对应服务帮助
+ """,
+ True,
+ )
+
+
+async def test_service_info(app: App):
+ from ATRI.plugins.help import service_info
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(service_info) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("帮助")
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "请检查是否输入错误...", True)
+
+ async with app.test_matcher(service_info) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("帮助 状态")
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ """
+ 服务名:状态
+ 说明:
+ 检查咱自身状态
+
+ 可用命令:
+ /ping、/status
+ 是否全局启用:True
+ Tip: 帮助 [服务] [命令] 以查看对应命令详细信息
+ """,
+ True,
+ )
+
+ async with app.test_matcher(service_info) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("帮助 状态 /ping")
+ event = make_fake_event(_message=msg, _to_me=True)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ """
+ 命令:/ping
+ 类型:command
+ 说明:检测bot简单信息处理速度
+ 更多触发方式:[]
+ """,
+ True,
+ )
diff --git a/test/test_plugin_manage.py b/test/test_plugin_manage.py
new file mode 100644
index 0000000..8f3042a
--- /dev/null
+++ b/test/test_plugin_manage.py
@@ -0,0 +1,293 @@
+import pytest
+from nonebug import App
+
+from ATRI.config import RUNTIME_CONFIG
+from .utils import make_fake_message, make_fake_event
+
+
+async def test_block_user(app: App):
+ from ATRI.plugins.manage import block_user
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(block_user) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("封禁用户")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "哪位?GKD!", True)
+
+ msg = Message("114514")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "用户 114514 危!", True)
+
+
+async def test_unblock_user(app: App):
+ from ATRI.plugins.manage import unblock_user
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(unblock_user) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("解封用户")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "哪位?GKD!", True)
+
+ msg = Message("114514")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "好欸! 114514 重获新生!", True)
+
+
+async def test_block_group(app: App):
+ from ATRI.plugins.manage import block_group
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(block_group) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("封禁群")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "哪位?GKD!", True)
+
+ msg = Message("114514")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "群 114514 危!", True)
+
+
+async def test_unblock_group(app: App):
+ from ATRI.plugins.manage import unblock_group
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(unblock_group) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("解封群")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "哪个群?GKD!", True)
+
+ msg = Message("114514")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "好欸! 114514 重获新生!", True)
+
+
+async def test_global_block_service(app: App):
+ from ATRI.plugins.manage import global_block_service
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(global_block_service) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("全局封禁")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "阿...是哪个服务呢", True)
+
+ msg = Message("状态")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "服务 状态 已被禁用", True)
+
+
+async def test_global_unblock_service(app: App):
+ from ATRI.plugins.manage import global_unblock_service
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(global_unblock_service) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("全局启用")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "阿...是哪个服务呢", True)
+
+ msg = Message("状态")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "服务 状态 已启用", True)
+
+
+async def test_user_block_service(app: App):
+ from ATRI.plugins.manage import user_block_service
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(user_block_service) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("对用户114514禁用状态")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "完成~已禁止用户 114514 使用 状态", True)
+
+
+async def test_user_unblock_service(app: App):
+ from ATRI.plugins.manage import user_unblock_service
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(user_unblock_service) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("对用户114514启用状态")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "完成~已允许用户 114514 使用 状态", True)
+
+
+async def test_group_block_service(app: App):
+ from ATRI.plugins.manage import group_block_service
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(group_block_service) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("禁用")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "阿...是哪个服务呢", True)
+
+ msg = Message("状态")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "完成!~已禁止本群使用服务:状态", True)
+
+
+async def test_group_unblock_service(app: App):
+ from ATRI.plugins.manage import group_unblock_service
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(group_unblock_service) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("启用")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "阿...是哪个服务呢", True)
+
+ msg = Message("状态")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "完成!~已允许本群使用服务:状态", True)
+
+
+async def test_get_friend_add_list(app: App):
+ from ATRI.plugins.manage import get_friend_add_list
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(get_friend_add_list) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("获取好友申请")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ """
+ 申请人ID | 申请信息 | 申请码
+ Tip: 使用 同意/拒绝好友 [申请码] 以决定
+ """,
+ True,
+ )
+
+
+# @pytest.mark.asyncio
+# async def test_approve_friend_add(app: App):
+# from ATRI.plugins.manage import approve_friend_add
+
+# Message = make_fake_message()
+
+# async with app.test_matcher(approve_friend_add) as ctx:
+# bot = ctx.create_bot()
+
+# msg = Message("同意好友")
+# event = make_fake_event(_message=msg)()
+
+# ctx.receive_event(bot, event)
+# ctx.should_call_send(event, "申请码GKD!", True)
+
+# msg = Message()
+
+
+async def test_get_group_invite_list(app: App):
+ from ATRI.plugins.manage import get_group_invite_list
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(get_group_invite_list) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("获取邀请列表")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ """
+ 申请人ID | 申请信息 | 申请码
+ Tip: 使用 同意/拒绝邀请 [申请码] 以决定
+ """,
+ True,
+ )
+
+
+async def test_track_error(app: App):
+ from ATRI.plugins.manage import track_error
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(track_error) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("/track")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "请检查ID是否正确...", True)
diff --git a/test/test_plugin_rich.py b/test/test_plugin_rich.py
new file mode 100644
index 0000000..3e63f4a
--- /dev/null
+++ b/test/test_plugin_rich.py
@@ -0,0 +1,28 @@
+import pytest
+from nonebug import App
+
+from .utils import make_fake_message, make_fake_event
+
+
+async def test_bili_rich(app: App):
+ from ATRI.plugins.rich import bili_rich
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(bili_rich) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("BV1Ff4y1C7YR")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(
+ event,
+ """
+ BV1Ff4y1C7YR INFO:
+ Title: 【8K30fps】这可能是画质最高的Rick Roll (doge)
+ Link: https://b23.tv/BV1Ff4y1C7YR
+ """,
+ True,
+ )
diff --git a/test/test_plugin_saucenao.py b/test/test_plugin_saucenao.py
new file mode 100644
index 0000000..2782ba9
--- /dev/null
+++ b/test/test_plugin_saucenao.py
@@ -0,0 +1,32 @@
+import pytest
+from nonebug import App
+
+from nonebot.adapters.onebot.v11 import MessageSegment
+
+from .utils import make_fake_message, make_fake_event
+
+
+async def test_saucenao(app: App):
+ from ATRI.plugins.saucenao import saucenao
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(saucenao) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("以图搜图")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "图呢?", True)
+
+ msg = Message(
+ MessageSegment.image(
+ "https://cdn.jsdelivr.net/gh/Kyomotoi/CDN@master/noting/88674944_p0.png"
+ )
+ )
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "失败了...", False)
diff --git a/test/test_plugin_setu.py b/test/test_plugin_setu.py
new file mode 100644
index 0000000..b5a7ff2
--- /dev/null
+++ b/test/test_plugin_setu.py
@@ -0,0 +1,20 @@
+import pytest
+from nonebug import App
+
+from .utils import make_fake_message, make_fake_event
+
+
+async def test_random_setu(app: App):
+ from ATRI.plugins.setu import random_setu
+
+ Message = make_fake_message()
+
+ async with app.test_matcher(random_setu) as ctx:
+ bot = ctx.create_bot()
+
+ msg = Message("来张涩图")
+ event = make_fake_event(_message=msg)()
+
+ ctx.receive_event(bot, event)
+ ctx.should_call_send(event, "hso(发不出", False)
diff --git a/test/utils.py b/test/utils.py
new file mode 100644
index 0000000..70d1a27
--- /dev/null
+++ b/test/utils.py
@@ -0,0 +1,87 @@
+"""
+Fork from: https://github.com/nonebot/nonebot2/blob/master/tests/utils.py
+"""
+from typing import TYPE_CHECKING, Type, Optional
+
+from pydantic import create_model
+
+if TYPE_CHECKING:
+ from nonebot.adapters import Event, Message
+
+
+def make_fake_message() -> Type["Message"]:
+ from nonebot.adapters import Message, MessageSegment
+
+ class FakeMessageSegment(MessageSegment):
+ @classmethod
+ def get_message_class(cls):
+ return FakeMessage
+
+ def __str__(self) -> str:
+ return self.data["text"] if self.type == "text" else f"[fake:{self.type}]"
+
+ @classmethod
+ def text(cls, text: str):
+ return cls("text", {"text": text})
+
+ @classmethod
+ def image(cls, url: str):
+ return cls("image", {"url": url})
+
+ def is_text(self) -> bool:
+ return self.type == "text"
+
+ class FakeMessage(Message):
+ @classmethod
+ def get_segment_class(cls):
+ return FakeMessageSegment
+
+ @staticmethod
+ def _construct(msg: str):
+ yield FakeMessageSegment.text(msg)
+
+ return FakeMessage
+
+
+def make_fake_event(
+ _type: str = "message",
+ _name: str = "test",
+ _description: str = "test",
+ _user_id: str = "test",
+ _session_id: str = "test",
+ _message: Optional["Message"] = None,
+ _to_me: bool = True,
+ **fields,
+) -> Type["Event"]:
+ from nonebot.adapters import Event
+
+ _Fake = create_model("_Fake", __base__=Event, **fields)
+
+ class FakeEvent(_Fake):
+ def get_type(self) -> str:
+ return _type
+
+ def get_event_name(self) -> str:
+ return _name
+
+ def get_event_description(self) -> str:
+ return _description
+
+ def get_user_id(self) -> str:
+ return _user_id
+
+ def get_session_id(self) -> str:
+ return _session_id
+
+ def get_message(self) -> "Message":
+ if _message is not None:
+ return _message
+ raise NotImplementedError
+
+ def is_tome(self) -> bool:
+ return _to_me
+
+ class Config:
+ extra = "forbid"
+
+ return FakeEvent