♻️ refactor client of scheduler_config

This commit is contained in:
felinae98
2024-05-28 20:59:39 +08:00
parent c21b24b385
commit 2fc11a9653
30 changed files with 185 additions and 143 deletions
+10 -8
View File
@@ -2,8 +2,8 @@ from time import time
import respx
import pytest
from httpx import Response
from nonebug.app import App
from httpx import Response, AsyncClient
from nonebot.compat import model_dump, type_validate_python
from .utils import get_file, get_json
@@ -13,8 +13,9 @@ from .utils import get_file, get_json
def arknights(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils.scheduler_config import DefaultClientManager
return platform_manager["arknights"](ProcessContext(), AsyncClient())
return platform_manager["arknights"](ProcessContext(DefaultClientManager()))
@pytest.fixture(scope="module")
@@ -44,9 +45,8 @@ def monster_siren_list_1():
@respx.mock
async def test_url_parse(app: App):
from httpx import AsyncClient
from nonebot_bison.utils import ProcessContext
from nonebot_bison.utils.scheduler_config import DefaultClientManager
from nonebot_bison.platform.arknights import Arknights, BulletinData, BulletinListItem, ArkBulletinResponse
cid_router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletin/1")
@@ -93,7 +93,7 @@ async def test_url_parse(app: App):
b4 = make_bulletin_obj("http://www.baidu.com")
assert b4.jump_link == "http://www.baidu.com"
ark = Arknights(ProcessContext(), AsyncClient())
ark = Arknights(ProcessContext(DefaultClientManager()))
cid_router.mock(return_value=make_response(b1))
p1 = await ark.parse(make_bulletin_list_item_obj())
@@ -115,9 +115,10 @@ async def test_url_parse(app: App):
@pytest.mark.asyncio()
async def test_get_date_in_bulletin(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.utils.scheduler_config import DefaultClientManager
from nonebot_bison.platform.arknights import Arknights, BulletinListItem
arknights = Arknights(ProcessContext(), AsyncClient())
arknights = Arknights(ProcessContext(DefaultClientManager()))
assert (
arknights.get_date(
BulletinListItem(
@@ -136,13 +137,14 @@ async def test_get_date_in_bulletin(app: App):
@pytest.mark.asyncio()
@respx.mock
async def test_parse_with_breakline(app: App):
from nonebot_bison.utils import ProcessContext, http_client
from nonebot_bison.utils import ProcessContext
from nonebot_bison.utils.scheduler_config import DefaultClientManager
from nonebot_bison.platform.arknights import Arknights, BulletinListItem
detail = get_json("arknights-detail-805")
detail["data"]["header"] = ""
arknights = Arknights(ProcessContext(), http_client())
arknights = Arknights(ProcessContext(DefaultClientManager()))
router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletin/1")
router.mock(return_value=Response(200, json=detail))
+3 -2
View File
@@ -3,8 +3,8 @@ from datetime import datetime
import respx
import pytest
from httpx import Response
from nonebug.app import App
from httpx import Response, AsyncClient
from nonebot.compat import model_dump, type_validate_python
from .utils import get_json
@@ -25,8 +25,9 @@ if typing.TYPE_CHECKING:
def bilibili(app: App) -> "Bilibili":
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils.scheduler_config import DefaultClientManager
return platform_manager["bilibili"](ProcessContext(), AsyncClient()) # type: ignore
return platform_manager["bilibili"](ProcessContext(DefaultClientManager())) # type: ignore
@pytest.fixture()
+3 -2
View File
@@ -2,8 +2,8 @@ import typing
import respx
import pytest
from httpx import Response
from nonebug.app import App
from httpx import Response, AsyncClient
from .utils import get_json
@@ -15,8 +15,9 @@ if typing.TYPE_CHECKING:
def bili_bangumi(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils.scheduler_config import DefaultClientManager
return platform_manager["bilibili-bangumi"](ProcessContext(), AsyncClient())
return platform_manager["bilibili-bangumi"](ProcessContext(DefaultClientManager()))
async def test_parse_target(bili_bangumi: "BilibiliBangumi"):
+3 -23
View File
@@ -3,8 +3,8 @@ from typing import TYPE_CHECKING
import respx
import pytest
from httpx import Response
from nonebug.app import App
from httpx import Response, AsyncClient
from .utils import get_json
@@ -16,8 +16,9 @@ if TYPE_CHECKING:
def bili_live(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.platform.bilibili import BilibiliClient
return platform_manager["bilibili-live"](ProcessContext(), AsyncClient())
return platform_manager["bilibili-live"](ProcessContext(BilibiliClient()))
@pytest.fixture()
@@ -30,27 +31,6 @@ def dummy_only_open_user_subinfo(app: App):
return UserSubInfo(user=user, categories=[1], tags=[])
@pytest.mark.asyncio
async def test_http_client_equal(app: App):
from nonebot_bison.types import Target
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
empty_target = Target("0")
bilibili = platform_manager["bilibili"](ProcessContext(), AsyncClient())
bilibili_live = platform_manager["bilibili-live"](ProcessContext(), AsyncClient())
bilibili_scheduler = bilibili.scheduler()
bilibili_live_scheduler = bilibili_live.scheduler()
assert await bilibili_scheduler.get_client(empty_target) == await bilibili_live_scheduler.get_client(empty_target)
assert await bilibili_live_scheduler.get_client(empty_target) != bilibili_live_scheduler.default_http_client
assert await bilibili_scheduler.get_query_name_client() == await bilibili_live_scheduler.get_query_name_client()
assert await bilibili_scheduler.get_query_name_client() != bilibili_live_scheduler.default_http_client
@pytest.mark.asyncio
@respx.mock
async def test_fetch_bililive_no_room(bili_live, dummy_only_open_user_subinfo):
+3 -2
View File
@@ -1,7 +1,7 @@
import respx
import pytest
from httpx import Response
from nonebug.app import App
from httpx import Response, AsyncClient
from .utils import get_json
@@ -10,8 +10,9 @@ from .utils import get_json
def ff14(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils.scheduler_config import DefaultClientManager
return platform_manager["ff14"](ProcessContext(), AsyncClient())
return platform_manager["ff14"](ProcessContext(DefaultClientManager()))
@pytest.fixture(scope="module")
+3 -2
View File
@@ -3,8 +3,8 @@ import typing
import respx
import pytest
from httpx import Response
from nonebug.app import App
from httpx import Response, AsyncClient
from .utils import get_json
@@ -16,8 +16,9 @@ if typing.TYPE_CHECKING:
def ncm_artist(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils.scheduler_config import DefaultClientManager
return platform_manager["ncm-artist"](ProcessContext(), AsyncClient())
return platform_manager["ncm-artist"](ProcessContext(DefaultClientManager()))
@pytest.fixture(scope="module")
+3 -2
View File
@@ -3,8 +3,8 @@ import typing
import respx
import pytest
from httpx import Response
from nonebug.app import App
from httpx import Response, AsyncClient
from .utils import get_json
@@ -16,8 +16,9 @@ if typing.TYPE_CHECKING:
def ncm_radio(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils.scheduler_config import DefaultClientManager
return platform_manager["ncm-radio"](ProcessContext(), AsyncClient())
return platform_manager["ncm-radio"](ProcessContext(DefaultClientManager()))
@pytest.fixture(scope="module")
+22 -16
View File
@@ -3,7 +3,6 @@ from typing import Any
import pytest
from nonebug.app import App
from httpx import AsyncClient
now = time()
passed = now - 3 * 60 * 60
@@ -326,12 +325,13 @@ def mock_status_change(app: App):
async def test_new_message_target_without_cats_tags(mock_platform_without_cats_tags, user_info_factory):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.types import Target, SubUnit
from nonebot_bison.utils.scheduler_config import DefaultClientManager
res1 = await mock_platform_without_cats_tags(ProcessContext(), AsyncClient()).fetch_new_post(
res1 = await mock_platform_without_cats_tags(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(Target("dummy"), [user_info_factory([1, 2], [])])
)
assert len(res1) == 0
res2 = await mock_platform_without_cats_tags(ProcessContext(), AsyncClient()).fetch_new_post(
res2 = await mock_platform_without_cats_tags(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(Target("dummy"), [user_info_factory([], [])]),
)
assert len(res2) == 1
@@ -347,12 +347,13 @@ async def test_new_message_target_without_cats_tags(mock_platform_without_cats_t
async def test_new_message_target(mock_platform, user_info_factory):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.types import Target, SubUnit
from nonebot_bison.utils.scheduler_config import DefaultClientManager
res1 = await mock_platform(ProcessContext(), AsyncClient()).fetch_new_post(
res1 = await mock_platform(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(Target("dummy"), [user_info_factory([1, 2], [])])
)
assert len(res1) == 0
res2 = await mock_platform(ProcessContext(), AsyncClient()).fetch_new_post(
res2 = await mock_platform(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(
Target("dummy"),
[
@@ -382,12 +383,13 @@ async def test_new_message_target(mock_platform, user_info_factory):
async def test_new_message_no_target(mock_platform_no_target, user_info_factory):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.types import Target, SubUnit
from nonebot_bison.utils.scheduler_config import DefaultClientManager
res1 = await mock_platform_no_target(ProcessContext(), AsyncClient()).fetch_new_post(
res1 = await mock_platform_no_target(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(Target("dummy"), [user_info_factory([1, 2], [])])
)
assert len(res1) == 0
res2 = await mock_platform_no_target(ProcessContext(), AsyncClient()).fetch_new_post(
res2 = await mock_platform_no_target(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(
Target("dummy"),
[
@@ -411,7 +413,7 @@ async def test_new_message_no_target(mock_platform_no_target, user_info_factory)
assert "p3" in id_set_1
assert "p2" in id_set_2
assert "p2" in id_set_3
res3 = await mock_platform_no_target(ProcessContext(), AsyncClient()).fetch_new_post(
res3 = await mock_platform_no_target(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(Target("dummy"), [user_info_factory([1, 2], [])])
)
assert len(res3) == 0
@@ -421,19 +423,20 @@ async def test_new_message_no_target(mock_platform_no_target, user_info_factory)
async def test_status_change(mock_status_change, user_info_factory):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.types import Target, SubUnit
from nonebot_bison.utils.scheduler_config import DefaultClientManager
res1 = await mock_status_change(ProcessContext(), AsyncClient()).fetch_new_post(
res1 = await mock_status_change(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(Target("dummy"), [user_info_factory([1, 2], [])])
)
assert len(res1) == 0
res2 = await mock_status_change(ProcessContext(), AsyncClient()).fetch_new_post(
res2 = await mock_status_change(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(Target("dummy"), [user_info_factory([1, 2], [])])
)
assert len(res2) == 1
posts = res2[0][1]
assert len(posts) == 1
assert posts[0].content == "on"
res3 = await mock_status_change(ProcessContext(), AsyncClient()).fetch_new_post(
res3 = await mock_status_change(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(
Target("dummy"),
[
@@ -446,7 +449,7 @@ async def test_status_change(mock_status_change, user_info_factory):
assert len(res3[0][1]) == 1
assert res3[0][1][0].content == "off"
assert len(res3[1][1]) == 0
res4 = await mock_status_change(ProcessContext(), AsyncClient()).fetch_new_post(
res4 = await mock_status_change(ProcessContext(DefaultClientManager())).fetch_new_post(
SubUnit(Target("dummy"), [user_info_factory([1, 2], [])])
)
assert len(res4) == 0
@@ -459,14 +462,15 @@ async def test_group(
mock_platform_no_target_2,
user_info_factory,
):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.types import Target, SubUnit
from nonebot_bison.utils import ProcessContext, http_client
from nonebot_bison.platform.platform import make_no_target_group
from nonebot_bison.utils.scheduler_config import DefaultClientManager
dummy = Target("dummy")
group_platform_class = make_no_target_group([mock_platform_no_target, mock_platform_no_target_2])
group_platform = group_platform_class(ProcessContext(), http_client())
group_platform = group_platform_class(ProcessContext(DefaultClientManager()))
res1 = await group_platform.fetch_new_post(SubUnit(dummy, [user_info_factory([1, 4], [])]))
assert len(res1) == 0
res2 = await group_platform.fetch_new_post(SubUnit(dummy, [user_info_factory([1, 4], [])]))
@@ -487,6 +491,7 @@ async def test_batch_fetch_new_message(app: App):
from nonebot_bison.platform.platform import NewMessage
from nonebot_bison.utils.context import ProcessContext
from nonebot_bison.types import Target, RawPost, SubUnit, UserSubInfo
from nonebot_bison.utils.scheduler_config import DefaultClientManager
class BatchNewMessage(NewMessage):
platform_name = "mock_platform"
@@ -538,7 +543,7 @@ async def test_batch_fetch_new_message(app: App):
user1 = UserSubInfo(TargetQQGroup(group_id=123), [1, 2, 3], [])
user2 = UserSubInfo(TargetQQGroup(group_id=234), [1, 2, 3], [])
platform_obj = BatchNewMessage(ProcessContext(), None) # type:ignore
platform_obj = BatchNewMessage(ProcessContext(DefaultClientManager())) # type:ignore
res1 = await platform_obj.batch_fetch_new_post(
[
@@ -572,6 +577,7 @@ async def test_batch_fetch_compare_status(app: App):
from nonebot_bison.post import Post
from nonebot_bison.utils.context import ProcessContext
from nonebot_bison.platform.platform import StatusChange
from nonebot_bison.utils.scheduler_config import DefaultClientManager
from nonebot_bison.types import Target, RawPost, SubUnit, Category, UserSubInfo
class BatchStatusChange(StatusChange):
@@ -612,7 +618,7 @@ async def test_batch_fetch_compare_status(app: App):
def get_category(self, raw_post):
return raw_post["cat"]
batch_status_change = BatchStatusChange(ProcessContext(), None) # type: ignore
batch_status_change = BatchStatusChange(ProcessContext(DefaultClientManager()))
user1 = UserSubInfo(TargetQQGroup(group_id=123), [1, 2, 3], [])
user2 = UserSubInfo(TargetQQGroup(group_id=234), [1, 2, 3], [])
+4 -3
View File
@@ -1,6 +1,5 @@
import pytest
from nonebug.app import App
from httpx import AsyncClient
from .utils import get_json
@@ -15,8 +14,9 @@ def test_cases():
async def test_filter_user_custom_tag(app: App, test_cases):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils.scheduler_config import DefaultClientManager
bilibili = platform_manager["bilibili"](ProcessContext(), AsyncClient())
bilibili = platform_manager["bilibili"](ProcessContext(DefaultClientManager()))
for case in test_cases:
res = bilibili.is_banned_post(**case["case"])
assert res == case["result"]
@@ -27,8 +27,9 @@ async def test_filter_user_custom_tag(app: App, test_cases):
async def test_tag_separator(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils.scheduler_config import DefaultClientManager
bilibili = platform_manager["bilibili"](ProcessContext(), AsyncClient())
bilibili = platform_manager["bilibili"](ProcessContext(DefaultClientManager()))
tags = ["~111", "222", "333", "~444", "555"]
res = bilibili.tag_separator(tags)
assert res[0] == ["222", "333", "555"]
+3 -2
View File
@@ -5,8 +5,8 @@ import xml.etree.ElementTree as ET
import pytz
import respx
import pytest
from httpx import Response
from nonebug.app import App
from httpx import Response, AsyncClient
from .utils import get_file
@@ -36,8 +36,9 @@ def user_info_factory(app: App, dummy_user):
def rss(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils.scheduler_config import DefaultClientManager
return platform_manager["rss"](ProcessContext(), AsyncClient())
return platform_manager["rss"](ProcessContext(DefaultClientManager()))
@pytest.fixture()
+2 -1
View File
@@ -20,8 +20,9 @@ image_cdn_router = respx.route(host__regex=r"wx\d.sinaimg.cn", path__startswith=
def weibo(app: App):
from nonebot_bison.utils import ProcessContext
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils.scheduler_config import DefaultClientManager
return platform_manager["weibo"](ProcessContext(), AsyncClient())
return platform_manager["weibo"](ProcessContext(DefaultClientManager()))
@pytest.fixture(scope="module")
+4 -3
View File
@@ -3,7 +3,6 @@ from typing import Any
import pytest
from nonebug.app import App
from httpx import AsyncClient
now = time()
passed = now - 3 * 60 * 60
@@ -173,8 +172,9 @@ async def test_generate_msg(mock_platform):
from nonebot_bison.post import Post
from nonebot_bison.utils import ProcessContext
from nonebot_bison.plugin_config import plugin_config
from nonebot_bison.utils.scheduler_config import DefaultClientManager
post: Post = await mock_platform(ProcessContext(), AsyncClient()).parse(raw_post_list_1[0])
post: Post = await mock_platform(ProcessContext(DefaultClientManager())).parse(raw_post_list_1[0])
assert post.platform.default_theme == "basic"
res = await post.generate()
assert len(res) == 1
@@ -203,10 +203,11 @@ async def test_msg_segments_convert(mock_platform):
from nonebot_bison.post import Post
from nonebot_bison.utils import ProcessContext
from nonebot_bison.plugin_config import plugin_config
from nonebot_bison.utils.scheduler_config import DefaultClientManager
plugin_config.bison_use_pic = True
post: Post = await mock_platform(ProcessContext(), AsyncClient()).parse(raw_post_list_1[0])
post: Post = await mock_platform(ProcessContext(DefaultClientManager())).parse(raw_post_list_1[0])
assert post.platform.default_theme == "basic"
res = await post.generate_messages()
assert len(res) == 1
+2 -2
View File
@@ -3,7 +3,6 @@ from datetime import time
from unittest.mock import AsyncMock
from nonebug import App
from httpx import AsyncClient
from pytest_mock import MockerFixture
if typing.TYPE_CHECKING:
@@ -61,11 +60,12 @@ async def test_scheduler_batch_api(init_scheduler, mocker: MockerFixture):
from nonebot_bison.types import Target as T_Target
from nonebot_bison.scheduler.manager import init_scheduler
from nonebot_bison.platform.bilibili import BililiveSchedConf
from nonebot_bison.utils.scheduler_config import DefaultClientManager
await config.add_subscribe(TargetQQGroup(group_id=123), T_Target("t1"), "target1", "bilibili-live", [], [])
await config.add_subscribe(TargetQQGroup(group_id=123), T_Target("t2"), "target2", "bilibili-live", [], [])
mocker.patch.object(BililiveSchedConf, "get_client", return_value=AsyncClient())
mocker.patch.object(BililiveSchedConf, "client_man", DefaultClientManager)
await init_scheduler()
+3 -2
View File
@@ -6,13 +6,14 @@ from nonebug.app import App
@respx.mock
async def test_http_error(app: App):
from nonebot_bison.utils import ProcessContext, http_client
from nonebot_bison.utils.scheduler_config import DefaultClientManager
example_route = respx.get("https://example.com")
example_route.mock(httpx.Response(403, json={"error": "gg"}))
ctx = ProcessContext()
ctx = ProcessContext(DefaultClientManager())
async with http_client() as client:
ctx.register_to_client(client)
ctx._register_to_client(client)
await client.get("https://example.com")
assert ctx.gen_req_records() == [
+2 -2
View File
@@ -5,7 +5,6 @@ from inspect import cleandoc
import pytest
from flaky import flaky
from nonebug import App
from httpx import AsyncClient
now = time()
passed = now - 3 * 60 * 60
@@ -69,9 +68,10 @@ def mock_platform(app: App):
def mock_post(app: App, mock_platform):
from nonebot_bison.post import Post
from nonebot_bison.utils import ProcessContext
from nonebot_bison.utils.scheduler_config import DefaultClientManager
return Post(
m := mock_platform(ProcessContext(), AsyncClient()),
m := mock_platform(ProcessContext(DefaultClientManager())),
"text",
title="title",
images=["http://t.tt/1.jpg"],