import pytest import os from quart import Quart from astrbot.dashboard.server import AstrBotDashboard from astrbot.core.db.sqlite import SQLiteDatabase from astrbot.core.core_lifecycle import AstrBotCoreLifecycle from astrbot.core import LogBroker from astrbot.core.star.star_handler import star_handlers_registry from astrbot.core.star.star import star_registry @pytest.fixture(scope="module") def core_lifecycle_td(): db = SQLiteDatabase("data/data_v3.db") log_broker = LogBroker() core_lifecycle_td = AstrBotCoreLifecycle(log_broker, db) return core_lifecycle_td @pytest.fixture(scope="module") def app(core_lifecycle_td): db = SQLiteDatabase("data/data_v3.db") server = AstrBotDashboard(core_lifecycle_td, db) return server.app @pytest.fixture(scope="module") def header(): return {} @pytest.mark.asyncio async def test_init_core_lifecycle_td(core_lifecycle_td): await core_lifecycle_td.initialize() assert core_lifecycle_td is not None @pytest.mark.asyncio async def test_auth_login(app: Quart, core_lifecycle_td: AstrBotCoreLifecycle, header: dict): test_client = app.test_client() response = await test_client.post('/api/auth/login', json={ "username": "wrong", "password": "password" }) data = await response.get_json() assert data['status'] == 'error' response = await test_client.post('/api/auth/login', json={ "username": core_lifecycle_td.astrbot_config['dashboard']['username'], "password": core_lifecycle_td.astrbot_config['dashboard']['password'] }) data = await response.get_json() assert data['status'] == 'ok' and 'token' in data['data'] header['Authorization'] = f"Bearer {data['data']['token']}" @pytest.mark.asyncio async def test_get_stat(app: Quart, header: dict): test_client = app.test_client() response = await test_client.get('/api/stat/get') assert response.status_code == 401 response = await test_client.get('/api/stat/get', headers=header) assert response.status_code == 200 data = await response.get_json() assert data['status'] == 'ok' and 'platform' in data['data'] @pytest.mark.asyncio async def test_plugins(app: Quart, header: dict): test_client = app.test_client() # 已经安装的插件 response = await test_client.get('/api/plugin/get', headers=header) assert response.status_code == 200 data = await response.get_json() assert data['status'] == 'ok' # 插件市场 response = await test_client.get('/api/plugin/market_list', headers=header) assert response.status_code == 200 data = await response.get_json() assert data['status'] == 'ok' # 插件安装 response = await test_client.post('/api/plugin/install', json={ "url": "https://github.com/Soulter/astrbot_plugin_essential" }, headers=header) assert response.status_code == 200 data = await response.get_json() assert data['status'] == 'ok' exists = False for md in star_registry: if md.name == "astrbot_plugin_essential": exists = True break assert exists is True, "插件 astrbot_plugin_essential 未成功载入" # 插件更新 response = await test_client.post('/api/plugin/update', json={ "name": "astrbot_plugin_essential" }, headers=header) assert response.status_code == 200 data = await response.get_json() assert data['status'] == 'ok' # 插件卸载 response = await test_client.post('/api/plugin/uninstall', json={ "name": "astrbot_plugin_essential" }, headers=header) assert response.status_code == 200 data = await response.get_json() assert data['status'] == 'ok' exists = False for md in star_registry: if md.name == "astrbot_plugin_essential": exists = True break assert exists is False, "插件 astrbot_plugin_essential 未成功卸载" exists = False for md in star_handlers_registry: if "astrbot_plugin_essential" in md.handler_module_path: exists = True break assert exists is False, "插件 astrbot_plugin_essential 未成功卸载" @pytest.mark.asyncio async def test_check_update(app: Quart, header: dict): test_client = app.test_client() response = await test_client.get('/api/update/check', headers=header) assert response.status_code == 200 data = await response.get_json() assert data['status'] == 'success' @pytest.mark.asyncio async def test_do_update(app: Quart, header: dict, core_lifecycle_td: AstrBotCoreLifecycle): global VERSION test_client = app.test_client() os.makedirs("data/astrbot_release", exist_ok=True) core_lifecycle_td.astrbot_updator.MAIN_PATH = "data/astrbot_release" VERSION = "114.514.1919810" response = await test_client.post('/api/update/do', headers=header, json={ "version": "latest" }) assert response.status_code == 200 data = await response.get_json() assert data['status'] == 'error' # 已经是最新版本 response = await test_client.post('/api/update/do', headers=header, json={ "version": "v3.4.0", "reboot": False }) assert response.status_code == 200 data = await response.get_json() assert data['status'] == 'ok' assert os.path.exists("data/astrbot_release/astrbot")