nonebot-bison/tests/platforms/test_arknights.py
Cateon Huo 9e5dcb3912
实现 Post.content 相关扩展协议 (#553)
*  `post` 新增 `get_content()` 方法

* 🚨 make linter happy

* 💄 auto fix by pre-commit hooks

* 🐛 fix: 调整函数使用

* 💄 auto fix by pre-commit hooks

*  转用函数处理文本

* 💄 auto fix by pre-commit hooks

* 🔨 使用`Dict`存储`content_handlers`

* 💄 auto fix by pre-commit hooks

* 🎨 fix

* :arts: 简化函数使用

* 🐛 移除`Theme`的过时参数

* 🗑️ 复用 `self.plain_content`

* 💄 auto fix by pre-commit hooks

*  注册式装饰器写法

* 💄 auto fix by pre-commit hooks

* 🐛 fix

* 💄 auto fix by pre-commit hooks

* :feat: 通用纯文本处理函数

* 💄 auto fix by pre-commit hooks

* :downgrade: 复用`==`处理标题

* 🎨 简化(?)写法

*  测试修复

* ♻️ via ContentSupport extensions

* 🐛 fix test

* 💄 auto fix by pre-commit hooks

* 🐛 for clean text

* 🐛 fix

* 💄 auto fix by pre-commit hooks

* fix: for xml

* 💄 auto fix by pre-commit hooks

* chore: art

* 💄 auto fix by pre-commit hooks

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-08-04 18:39:12 +08:00

314 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from time import time
import respx
import pytest
from httpx import Response
from nonebug.app import App
from nonebot.compat import model_dump, type_validate_python
from .utils import get_file, get_json
@pytest.fixture()
def arknights(app: App):
from nonebot_bison.platform import platform_manager
from nonebot_bison.utils import ProcessContext, DefaultClientManager
return platform_manager["arknights"](ProcessContext(DefaultClientManager()))
@pytest.fixture(scope="module")
def arknights_list_0():
return get_json("arknights_list_0.json")
@pytest.fixture(scope="module")
def arknights_list__1():
return get_json("arknights_list_-1.json")
@pytest.fixture(scope="module")
def arknights_list_1():
return get_json("arknights_list_1.json")
@pytest.fixture(scope="module")
def monster_siren_list_0():
return get_json("monster-siren_list_0.json")
@pytest.fixture(scope="module")
def monster_siren_list_1():
return get_json("monster-siren_list_1.json")
@respx.mock
async def test_url_parse(app: App):
from nonebot_bison.utils import ProcessContext, DefaultClientManager
from nonebot_bison.platform.arknights import Arknights, BulletinData, BulletinListItem, ArkBulletinResponse
cid_router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletin/1")
def make_bulletin_obj(jump_link: str):
return type_validate_python(
BulletinData,
{
"cid": "1",
"displayType": 1,
"title": "title",
"category": 1,
"header": "header",
"content": "content",
"jumpLink": jump_link,
"bannerImageUrl": "https://www.baidu.com",
"displayTime": "2021-08-01",
"updatedAt": 1627795200,
},
)
def make_bulletin_list_item_obj():
return BulletinListItem(
cid="1",
title="title",
category=1,
displayTime="2021-08-01",
updatedAt=1627795200,
sticky=False,
)
def make_response(b: BulletinData):
return Response(200, json=model_dump(ArkBulletinResponse(code=0, msg="", data=b), by_alias=True))
b1 = make_bulletin_obj("")
assert b1.jump_link == ""
b2 = make_bulletin_obj("uniwebview://move?target=shop&param1=SKINSHOP")
assert b2.jump_link == "uniwebview://move?target=shop&param1=SKINSHOP"
b3 = make_bulletin_obj("https://www.baidu.com")
assert b3.jump_link == "https://www.baidu.com"
b4 = make_bulletin_obj("http://www.baidu.com")
assert b4.jump_link == "http://www.baidu.com"
ark = Arknights(ProcessContext(DefaultClientManager()))
cid_router.mock(return_value=make_response(b1))
p1 = await ark.parse(make_bulletin_list_item_obj())
assert p1.url is None
cid_router.mock(return_value=make_response(b2))
p2 = await ark.parse(make_bulletin_list_item_obj())
assert p2.url is None
cid_router.mock(return_value=make_response(b3))
p3 = await ark.parse(make_bulletin_list_item_obj())
assert p3.url == "https://www.baidu.com/"
cid_router.mock(return_value=make_response(b4))
p4 = await ark.parse(make_bulletin_list_item_obj())
assert p4.url == "http://www.baidu.com/"
@pytest.mark.asyncio()
async def test_get_date_in_bulletin(app: App):
from nonebot_bison.utils import ProcessContext, DefaultClientManager
from nonebot_bison.platform.arknights import Arknights, BulletinListItem
arknights = Arknights(ProcessContext(DefaultClientManager()))
assert (
arknights.get_date(
BulletinListItem(
cid="1",
title="",
category=1,
displayTime="",
updatedAt=1627036800,
sticky=False,
)
)
is None
)
@pytest.mark.asyncio()
@respx.mock
async def test_parse_with_breakline(app: App):
from nonebot_bison.utils import ProcessContext, DefaultClientManager
from nonebot_bison.platform.arknights import Arknights, BulletinListItem
detail = get_json("arknights-detail-805")
detail["data"]["header"] = ""
arknights = Arknights(ProcessContext(DefaultClientManager()))
router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletin/1")
router.mock(return_value=Response(200, json=detail))
post = await arknights.parse(
BulletinListItem(
cid="1",
title="【公开招募】\\n标签刷新通知",
category=1,
displayTime="",
updatedAt=1627036800,
sticky=False,
)
)
assert post.title == "【公开招募】 - 标签刷新通知"
@pytest.mark.asyncio()
@respx.mock
async def test_fetch_new(
arknights,
dummy_user_subinfo,
arknights_list_0,
arknights_list__1,
monster_siren_list_0,
monster_siren_list_1,
):
from nonebot_bison.post import Post
from nonebot_bison.types import Target, SubUnit
from nonebot_bison.platform.arknights import ArknightsPost
ak_list_router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletinList?target=IOS")
detail_router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletin/5716")
version_router = respx.get("https://ak-conf.hypergryph.com/config/prod/official/IOS/version")
preannouncement_router = respx.get(
"https://ak-conf.hypergryph.com/config/prod/announce_meta/IOS/preannouncement.meta.json"
)
monster_siren_router = respx.get("https://monster-siren.hypergryph.com/api/news")
terra_list = respx.get("https://terra-historicus.hypergryph.com/api/recentUpdate")
ak_list_router.mock(return_value=Response(200, json=arknights_list__1))
mock_detail = get_json("arknights-detail-807")
mock_detail["data"]["bannerImageUrl"] = "https://example.com/1.jpg"
detail_router.mock(return_value=Response(200, json=mock_detail))
version_router.mock(return_value=Response(200, json=get_json("arknights-version-0.json")))
preannouncement_router.mock(return_value=Response(200, json=get_json("arknights-pre-0.json")))
monster_siren_router.mock(return_value=Response(200, json=monster_siren_list_0))
terra_list.mock(return_value=Response(200, json=get_json("terra-hist-0.json")))
target = Target("")
res1 = await arknights.fetch_new_post(SubUnit(target, [dummy_user_subinfo]))
assert ak_list_router.called
assert len(res1) == 0
assert not detail_router.called
mock_data = arknights_list_0
mock_data["data"]["list"][0]["updatedAt"] = int(time())
ak_list_router.mock(return_value=Response(200, json=mock_data))
res2 = await arknights.fetch_new_post(SubUnit(target, [dummy_user_subinfo]))
assert len(res2[0][1]) == 1
assert detail_router.called
post2: ArknightsPost = res2[0][1][0]
assert post2.platform.platform_name == "arknights"
assert post2.content
assert post2.title == "2023「夏日嘉年华」限时活动即将开启"
assert not post2.url
assert post2.nickname == "明日方舟游戏内公告"
assert post2.images
assert post2.images == ["https://example.com/1.jpg"]
assert post2.timestamp
assert "arknights" == post2.get_priority_themes()[0]
# assert(post.pics == ['https://ak-fs.hypergryph.com/announce/images/20210623/e6f49aeb9547a2278678368a43b95b07.jpg'])
post2_plain_content = await post2.get_plain_content()
assert post2_plain_content.strip() == get_file("arknights-plaintext-807.txt").strip()
assert await post2.generate()
terra_list.mock(return_value=Response(200, json=get_json("terra-hist-1.json")))
res3 = await arknights.fetch_new_post(SubUnit(target, [dummy_user_subinfo]))
assert len(res3) == 1
post3: Post = res3[0][1][0]
assert post3.platform.platform_name == "arknights"
assert post3.nickname == "泰拉记事社漫画"
assert post3.title == "123罗德岛 - 「掠风」篇"
assert post3.content == "你可能不知道的罗德岛小剧场!"
assert post3.url == "https://terra-historicus.hypergryph.com/comic/6253/episode/4938"
assert post3.images == ["https://web.hycdn.cn/comic/pic/20220507/ab8a2ff408ec7d587775aed70b178ec0.png"]
assert "brief" == post3.get_priority_themes()[0]
@pytest.mark.render()
@respx.mock
async def test_send_with_render(
arknights,
dummy_user_subinfo,
arknights_list_0,
arknights_list_1,
monster_siren_list_0,
monster_siren_list_1,
):
from nonebot_bison.types import Target, SubUnit
from nonebot_bison.platform.arknights import ArknightsPost
ak_list_router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletinList?target=IOS")
detail_router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletin/8397")
version_router = respx.get("https://ak-conf.hypergryph.com/config/prod/official/IOS/version")
preannouncement_router = respx.get(
"https://ak-conf.hypergryph.com/config/prod/announce_meta/IOS/preannouncement.meta.json"
)
monster_siren_router = respx.get("https://monster-siren.hypergryph.com/api/news")
terra_list = respx.get("https://terra-historicus.hypergryph.com/api/recentUpdate")
ak_list_router.mock(return_value=Response(200, json=arknights_list_0))
detail_router.mock(return_value=Response(200, text=get_file("arknights-detail-805")))
version_router.mock(return_value=Response(200, json=get_json("arknights-version-0.json")))
preannouncement_router.mock(return_value=Response(200, json=get_json("arknights-pre-0.json")))
monster_siren_router.mock(return_value=Response(200, json=monster_siren_list_0))
terra_list.mock(return_value=Response(200, json=get_json("terra-hist-0.json")))
target = Target("")
res1 = await arknights.fetch_new_post(SubUnit(target, [dummy_user_subinfo]))
assert ak_list_router.called
assert len(res1) == 0
assert not detail_router.called
mock_data = arknights_list_1
mock_data["data"]["list"][0]["updatedAt"] = int(time())
ak_list_router.mock(return_value=Response(200, json=mock_data))
res2 = await arknights.fetch_new_post(SubUnit(target, [dummy_user_subinfo]))
assert len(res2[0][1]) == 1
assert detail_router.called
post2: ArknightsPost = res2[0][1][0]
assert post2.platform.platform_name == "arknights"
assert post2.content
post2_plain_content = await post2.get_plain_content()
assert post2_plain_content.strip() == get_file("arknights-plaintext-805.txt").strip()
assert await post2.generate()
assert post2.title == "【公开招募】标签强制刷新通知"
assert post2.nickname == "明日方舟游戏内公告"
assert not post2.images
# assert(post.pics == ['https://ak-fs.hypergryph.com/announce/images/20210623/e6f49aeb9547a2278678368a43b95b07.jpg'])
r = await post2.generate_messages()
assert r
@pytest.mark.render()
@respx.mock
async def test_parse_title(
app: App,
):
from nonebot_bison.utils import ProcessContext, DefaultClientManager
from nonebot_bison.platform.arknights import Arknights, BulletinListItem
detail_router = respx.get("https://ak-webview.hypergryph.com/api/game/bulletin/8397")
ark = Arknights(ProcessContext(DefaultClientManager()))
mock_detail = get_json("arknights-detail-805")
mock_detail["data"]["header"] = ""
detail_router.mock(return_value=Response(200, json=mock_detail))
mock_raw_post = BulletinListItem(
cid="8397",
title="【公开招募】\n标签刷新通知",
category=1,
displayTime="07-30 10:00:00",
updatedAt=1627582800,
sticky=False,
)
post = await ark.parse(mock_raw_post)
assert post.title == "【公开招募】 - 标签刷新通知"