from datetime import datetime import feedparser import pytest import respx from httpx import Response from nonebug.app import App from pytz import timezone from .utils import get_file, get_json @pytest.fixture def weibo(app: App): from nonebot_bison.platform import platform_manager return platform_manager["weibo"] @pytest.fixture(scope="module") def weibo_ak_list_1(): return get_json("weibo_ak_list_1.json") @pytest.mark.asyncio async def test_get_name(weibo): name = await weibo.get_target_name("6279793937") assert name == "明日方舟Arknights" @pytest.mark.asyncio @respx.mock async def test_fetch_new(weibo, dummy_user_subinfo): ak_list_router = respx.get( "https://m.weibo.cn/api/container/getIndex?containerid=1076036279793937" ) detail_router = respx.get("https://m.weibo.cn/detail/4649031014551911") ak_list_router.mock( return_value=Response(200, json=get_json("weibo_ak_list_0.json")) ) detail_router.mock( return_value=Response(200, text=get_file("weibo_detail_4649031014551911")) ) target = "6279793937" res = await weibo.fetch_new_post(target, [dummy_user_subinfo]) assert ak_list_router.called assert len(res) == 0 assert not detail_router.called mock_data = get_json("weibo_ak_list_1.json") ak_list_router.mock(return_value=Response(200, json=mock_data)) # import ipdb; ipdb.set_trace() res2 = await weibo.fetch_new_post(target, [dummy_user_subinfo]) assert len(res2) == 0 mock_data["data"]["cards"][1]["mblog"]["created_at"] = datetime.now( timezone("Asia/Shanghai") ).strftime("%a %b %d %H:%M:%S %z %Y") ak_list_router.mock(return_value=Response(200, json=mock_data)) res3 = await weibo.fetch_new_post(target, [dummy_user_subinfo]) assert len(res3[0][1]) == 1 assert not detail_router.called post = res3[0][1][0] assert post.target_type == "weibo" assert post.text == "#明日方舟#\nSideStory「沃伦姆德的薄暮」复刻现已开启! " assert post.url == "https://weibo.com/6279793937/KkBtUx2dv" assert post.target_name == "明日方舟Arknights" assert len(post.pics) == 1 @pytest.mark.asyncio async def test_classification(weibo): mock_data = get_json("weibo_ak_list_1.json") tuwen = mock_data["data"]["cards"][1] retweet = mock_data["data"]["cards"][3] video = mock_data["data"]["cards"][0] mock_data_ys = get_json("weibo_ys_list_0.json") text = mock_data_ys["data"]["cards"][2] assert weibo.get_category(retweet) == 1 assert weibo.get_category(video) == 2 assert weibo.get_category(tuwen) == 3 assert weibo.get_category(text) == 4 @pytest.mark.asyncio @respx.mock async def test_parse_long(weibo): detail_router = respx.get("https://m.weibo.cn/detail/4645748019299849") detail_router.mock( return_value=Response(200, text=get_file("weibo_detail_4645748019299849")) ) raw_post = get_json("weibo_ak_list_1.json")["data"]["cards"][0] post = await weibo.parse(raw_post) assert not "全文" in post.text assert detail_router.called def test_tag(weibo, weibo_ak_list_1): raw_post = weibo_ak_list_1["data"]["cards"][0] assert weibo.get_tags(raw_post) == ["明日方舟", "音律联觉"] @pytest.mark.asyncio @pytest.mark.compare async def test_rsshub_compare(weibo): target = "6279793937" raw_posts = filter(weibo.filter_platform_custom, await weibo.get_sub_list(target)) posts = [] for raw_post in raw_posts: posts.append(await weibo.parse(raw_post)) url_set = set(map(lambda x: x.url, posts)) feedres = feedparser.parse("https://rsshub.app/weibo/user/6279793937") for entry in feedres.entries[:5]: # print(entry) assert entry.link in url_set test_post = { "mblog": { "text": '#刚出生的小羊驼长啥样#
小羊驼三三来也[好喜欢]
小羊驼三三 ', "bid": "KnssqeqKK", } } def test_chaohua_tag(weibo): tags = weibo.get_tags(test_post) assert "刚出生的小羊驼长啥样" in tags assert "小羊驼三三超话" in tags