fix: test

This commit is contained in:
Soulter
2024-11-22 11:20:55 +08:00
parent ca19754a30
commit 017426501c
4 changed files with 82 additions and 68 deletions
+5
View File
@@ -1,6 +1,7 @@
import asyncio
import traceback
import os
import threading
from astrbot.message.handler import MessageHandler
from astrbot.db.sqlite import SQLiteDatabase
from dashboard.server import AstrBotDashboard
@@ -82,6 +83,10 @@ class AstrBotBootstrap():
dashboard_server_task = asyncio.create_task(self.dashboard.run(), name="dashboard")
if self.test_mode:
def run_dashboard():
asyncio.run(self.dashboard.run())
dashboard_thread = threading.Thread(target=run_dashboard, name="dashboard_thread", daemon=False)
dashboard_thread.start()
return
# load plugins, plugins' commands.
+3 -3
View File
@@ -4,8 +4,8 @@ from aiocqhttp import Event
class MockOneBotMessage():
def __init__(self):
# 这些数据不是敏感的
self.group_event_sample = Event.from_payload({'self_id': 3430871669, 'user_id': 905617992, 'time': 1723882500, 'message_id': -2147480159, 'message_seq': -2147480159, 'real_id': -2147480159, 'message_type': 'group', 'sender': {'user_id': 905617992, 'nickname': 'Soulter', 'card': '', 'role': 'owner'}, 'raw_message': '[CQ:at,qq=3430871669] just reply me `ok`', 'font': 14, 'sub_type': 'normal', 'message': [{'data': {'qq': '3430871669'}, 'type': 'at'}, {'data': {'text': ' just reply me `ok`'}, 'type': 'text'}], 'message_format': 'array', 'post_type': 'message', 'group_id': 849750470})
self.friend_event_sample = Event.from_payload({'self_id': 3430871669, 'user_id': 905617992, 'time': 1723882599, 'message_id': -2147480157, 'message_seq': -2147480157, 'real_id': -2147480157, 'message_type': 'private', 'sender': {'user_id': 905617992, 'nickname': 'Soulter', 'card': ''}, 'raw_message': 'just reply me `ok`', 'font': 14, 'sub_type': 'friend', 'message': [{'data': {'text': 'just reply me `ok`'}, 'type': 'text'}], 'message_format': 'array', 'post_type': 'message'})
self.group_event_sample = Event.from_payload({'self_id': 3430871669, 'user_id': 'test', 'time': 1723882500, 'message_id': -2147480159, 'message_seq': -2147480159, 'real_id': -2147480159, 'message_type': 'group', 'sender': {'user_id': 'test', 'nickname': 'Soulter', 'card': '', 'role': 'owner'}, 'raw_message': '[CQ:at,qq=3430871669] just reply me `ok`', 'font': 14, 'sub_type': 'normal', 'message': [{'data': {'qq': '3430871669'}, 'type': 'at'}, {'data': {'text': ' just reply me `ok`'}, 'type': 'text'}], 'message_format': 'array', 'post_type': 'message', 'group_id': 849750470})
self.friend_event_sample = Event.from_payload({'self_id': 3430871669, 'user_id': 'test', 'time': 1723882599, 'message_id': -2147480157, 'message_seq': -2147480157, 'real_id': -2147480157, 'message_type': 'private', 'sender': {'user_id': 'test', 'nickname': 'Soulter', 'card': ''}, 'raw_message': 'just reply me `ok`', 'font': 14, 'sub_type': 'friend', 'message': [{'data': {'text': 'just reply me `ok`'}, 'type': 'text'}], 'message_format': 'array', 'post_type': 'message'})
def create_random_group_message(self):
return self.group_event_sample
@@ -14,5 +14,5 @@ class MockOneBotMessage():
return self.friend_event_sample
def create_msg(self, text: str):
self.group_event_sample.message = [{'data': {'qq': '3430871669'}, 'type': 'at'}, {'data': {'text': text}, 'type': 'text'}]
self.group_event_sample.message = [{'data': {'qq': 'test'}, 'type': 'at'}, {'data': {'text': text}, 'type': 'text'}]
return self.group_event_sample
-51
View File
@@ -1,51 +0,0 @@
import aiohttp
import pytest
BASE_URL = "http://0.0.0.0:6185/api"
async def get_url(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.json()
async def post_url(url, data):
async with aiohttp.ClientSession() as session:
async with session.post(url, json=data) as response:
return await response.json()
class TestHTTPServer:
@pytest.mark.asyncio
async def test_config(self):
configs = await get_url(f"{BASE_URL}/configs")
assert 'data' in configs and 'metadata' in configs['data'] \
and 'config' in configs['data']
config = configs['data']['config']
# test post config
await post_url(f"{BASE_URL}/astrbot-configs", config)
# text post config with invalid data
assert 'rate_limit' in config['platform_settings']
config['platform_settings']['rate_limit'] = "invalid"
ret = await post_url(f"{BASE_URL}/astrbot-configs", config)
assert 'status' in ret and ret['status'] == 'error'
@pytest.mark.asyncio
async def test_update(self):
await get_url(f"{BASE_URL}/check_update")
@pytest.mark.asyncio
async def test_plugins(self):
pname = "astrbot_plugin_bilibili"
url = f"https://github.com/Soulter/{pname}"
await get_url(f"{BASE_URL}/extensions")
# test install plugin
await post_url(f"{BASE_URL}/extensions/install", {
"url": url
})
# test uninstall plugin
await post_url(f"{BASE_URL}/extensions/uninstall", {
"name": pname
})
+74 -14
View File
@@ -1,4 +1,4 @@
import asyncio
import asyncio, aiohttp
import pytest
import os
@@ -52,14 +52,6 @@ class TestBasicMessageHandle():
abm = qq_official._parse_from_qqofficial(guild_message, MessageType.GUILD_MESSAGE)
ret = await qq_official.handle_msg(abm)
print(ret)
# 有共同性,为了节约开销,不测试频道私聊。
# @pytest.mark.asyncio
# async def test_qqofficial_private_message(self):
# private_message = MockQQOfficialMessage().create_random_direct_message()
# abm = qq_official._parse_from_qqofficial(private_message, MessageType.FRIEND_MESSAGE)
# ret = await qq_official.handle_msg(abm)
# print(ret)
@pytest.mark.asyncio
async def test_aiocqhttp_group_message(self):
@@ -75,7 +67,7 @@ class TestBasicMessageHandle():
ret = await aiocqhttp.handle_msg(abm)
print(ret)
class TestInteralCommandHsandle():
class TestInteralCommandHandle():
def create(self, text: str):
event = MockOneBotMessage().create_msg(text)
abm = aiocqhttp.convert_message(event)
@@ -140,10 +132,10 @@ class TestInteralCommandHsandle():
await self.fast_test(f"/plugin i {url}")
await self.fast_test(f"/plugin u {url}")
await self.fast_test(f"/plugin d {pname}")
class TestLLMChat():
@pytest.mark.asyncio
async def test_llm_chat(self):
async def test_llm(self):
await self.fast_test("/reset")
os.environ["TEST_LLM"] = "on"
ret = await llm_provider.text_chat("Just reply `ok`", "test")
print(ret)
@@ -152,4 +144,72 @@ class TestLLMChat():
ret = await aiocqhttp.handle_msg(abm)
print(ret)
os.environ["TEST_LLM"] = "off"
await self.fast_test("/reset")
await self.fast_test("/status")
await self.fast_test("/his")
await self.fast_test("/switch")
await self.fast_test("/set")
await self.fast_test("/set list")
await self.fast_test("/unset")
BASE_URL = "http://0.0.0.0:6185/api"
class TestHTTPServer:
async def get_url(self, url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.json(), response.status
async def post_url(self, url, data):
async with aiohttp.ClientSession() as session:
async with session.post(url, json=data) as response:
return await response.json(), response.status
@pytest.mark.asyncio
async def test_config(self):
configs, status = await self.get_url(f"{BASE_URL}/config/get")
assert status == 200
assert 'data' in configs and 'metadata' in configs['data'] \
and 'config' in configs['data']
config = configs['data']['config']
# test post config
await self.post_url(f"{BASE_URL}/config/astrbot/update", config)
# text post config with invalid data
assert 'rate_limit' in config['platform_settings']
config['platform_settings']['rate_limit'] = "invalid"
ret, status = await self.post_url(f"{BASE_URL}/config/astrbot/update", config)
assert status == 200
assert 'status' in ret and ret['status'] == 'error'
@pytest.mark.asyncio
async def test_update(self):
_, status = await self.get_url(f"{BASE_URL}/update/check")
assert status == 200
@pytest.mark.asyncio
async def test_stats(self):
_, status = await self.get_url(f"{BASE_URL}/stat/get")
_, status = await self.get_url(f"{BASE_URL}/stat/version")
_, status = await self.get_url(f"{BASE_URL}/stat/start-time")
assert status == 200
@pytest.mark.asyncio
async def test_plugins(self):
pname = "astrbot_plugin_bilibili"
url = f"https://github.com/Soulter/{pname}"
_, status = await self.get_url(f"{BASE_URL}/plugin/get")
# test install plugin
_, status = await self.post_url(f"{BASE_URL}/plugin/install", {
"url": url
})
# test uninstall plugin
_, status = await self.post_url(f"{BASE_URL}/plugin/uninstall", {
"name": pname
})
assert status == 200
bootstrap.context.running = False