import asyncio import typing from pathlib import Path import nonebot import pytest from nonebug.app import App @pytest.fixture async def app(nonebug_init: None, tmp_path: Path, monkeypatch: pytest.MonkeyPatch): import nonebot config = nonebot.get_driver().config config.bison_config_path = str(tmp_path) config.command_start = {""} config.superusers = {"10001"} config.log_level = "TRACE" config.bison_filter_log = False return App(monkeypatch) @pytest.fixture def dummy_user_subinfo(app: App): from nonebot_bison.types import User, UserSubInfo user = User(123, "group") return UserSubInfo(user=user, category_getter=lambda _: [], tag_getter=lambda _: []) @pytest.fixture def task_watchdog(request): def cancel_test_on_exception(task: asyncio.Task): def maybe_cancel_clbk(t: asyncio.Task): exception = t.exception() if exception is None: return for task in asyncio.all_tasks(): coro = task.get_coro() if coro.__qualname__ == request.function.__qualname__: task.cancel() return task.add_done_callback(maybe_cancel_clbk) return cancel_test_on_exception