mirror of
https://github.com/PaiGramTeam/PaiGram.git
synced 2024-11-23 00:01:45 +00:00
165 lines
5.3 KiB
Python
165 lines
5.3 KiB
Python
import asyncio
|
|
import logging
|
|
from random import sample, randint
|
|
from typing import Type
|
|
|
|
import pytest
|
|
from flaky import flaky
|
|
|
|
from modules.wiki.base import WikiModel
|
|
from modules.wiki.character import Character
|
|
from modules.wiki.material import Material
|
|
from modules.wiki.weapon import Weapon
|
|
|
|
LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def event_loop():
|
|
loop = asyncio.get_event_loop()
|
|
asyncio.set_event_loop(loop)
|
|
yield loop
|
|
loop.close()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
class TestWeapon:
|
|
|
|
@staticmethod
|
|
@flaky(3, 1)
|
|
async def test_get_by_id():
|
|
weapon = await Weapon.get_by_id('i_n11417')
|
|
assert weapon.name == '原木刀'
|
|
assert weapon.rarity == 4
|
|
assert weapon.attack == 43.73
|
|
assert weapon.attribute.type.value == '元素充能效率'
|
|
assert weapon.affix.name == '森林的瑞佑'
|
|
|
|
@staticmethod
|
|
@flaky(3, 1)
|
|
async def test_get_by_name():
|
|
weapon = await Weapon.get_by_name('风鹰剑')
|
|
assert weapon.id == 'i_n11501'
|
|
assert weapon.rarity == 5
|
|
assert weapon.attack == 47.54
|
|
assert weapon.attribute.type.value == '物理伤害加成'
|
|
assert weapon.affix.name == '西风之鹰的抗争'
|
|
assert '听凭风引,便是正义与自由之风' in weapon.story
|
|
|
|
@staticmethod
|
|
@flaky(3, 1)
|
|
async def test_name_list():
|
|
from httpx import URL
|
|
async for name in Weapon._name_list_generator(with_url=True):
|
|
assert isinstance(name[0], str)
|
|
assert isinstance(name[1], URL)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
class TestCharacter:
|
|
|
|
@staticmethod
|
|
@flaky(3, 1)
|
|
async def test_get_by_id():
|
|
character = await Character.get_by_id('ayaka_002')
|
|
assert character.name == '神里绫华'
|
|
assert character.title == '白鹭霜华'
|
|
assert character.occupation == '社奉行'
|
|
assert character.association.value == '稻妻'
|
|
assert character.cn_cv == '小N'
|
|
|
|
@staticmethod
|
|
@flaky(3, 1)
|
|
async def test_get_by_name():
|
|
character = await Character.get_by_name('神里绫华')
|
|
assert character.name == '神里绫华'
|
|
assert character.title == '白鹭霜华'
|
|
assert character.occupation == '社奉行'
|
|
assert character.association.value == '稻妻'
|
|
assert character.cn_cv == '小N'
|
|
main_character = await Character.get_by_name('荧')
|
|
assert main_character.constellation == '旅人座'
|
|
assert main_character.cn_cv == '宴宁&多多poi'
|
|
|
|
@staticmethod
|
|
@flaky(3, 1)
|
|
async def test_name_list():
|
|
from httpx import URL
|
|
async for name in Character._name_list_generator(with_url=True):
|
|
assert isinstance(name[0], str)
|
|
assert isinstance(name[1], URL)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
class TestMaterial:
|
|
|
|
@staticmethod
|
|
@flaky(3, 1)
|
|
async def test_get_by_id():
|
|
material = await Material.get_by_id('i_504')
|
|
assert material.name == '高塔孤王的碎梦'
|
|
assert material.type == '武器突破素材'
|
|
assert '合成获得' in material.source
|
|
assert '巴巴托斯' in material.description
|
|
|
|
material = await Material.get_by_id('i_483')
|
|
assert material.name == '凶将之手眼'
|
|
assert material.type == '角色培养素材'
|
|
assert '70级以上永恒的守护者挑战奖励' in material.source
|
|
assert '所见即所为' in material.description
|
|
|
|
@staticmethod
|
|
@flaky(3, 1)
|
|
async def test_get_by_name():
|
|
material = await Material.get_by_name('地脉的新芽')
|
|
assert material.id == 'i_73'
|
|
assert material.type == '角色培养素材'
|
|
assert '60级以上深渊法师掉落' in material.source
|
|
assert '勃发' in material.description
|
|
|
|
material = await Material.get_by_name('「黄金」的教导')
|
|
assert material.id == 'i_431'
|
|
assert material.type == '天赋培养素材'
|
|
assert 2 in material.weekdays
|
|
assert '土的象' in material.description
|
|
|
|
@staticmethod
|
|
@flaky(3, 1)
|
|
async def test_name_list():
|
|
from httpx import URL
|
|
async for name in Material._name_list_generator(with_url=True):
|
|
assert isinstance(name[0], str)
|
|
assert isinstance(name[1], URL)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
class TestAll:
|
|
|
|
@staticmethod
|
|
@flaky(3, 1)
|
|
async def make_test(target: Type[WikiModel]):
|
|
from httpx import URL
|
|
name_list = await target.get_name_list(with_url=True)
|
|
name_len = len(name_list)
|
|
assert name_len != 0
|
|
test_len = randint(1, max(2, int(len(name_list) * 0.3))) # nosec
|
|
LOGGER.info("得到了 %d 条 %s 的数据, 将会测试其中的 %s 条数据", name_len, target.__name__, test_len)
|
|
for name, url in sample(name_list, test_len):
|
|
assert isinstance(name, str)
|
|
assert isinstance(url, URL)
|
|
instance = await target._scrape(url)
|
|
assert isinstance(instance, target)
|
|
LOGGER.info("%s is ok.", instance.name)
|
|
|
|
@flaky(3, 1)
|
|
async def test_random_material(self):
|
|
await self.make_test(Material)
|
|
|
|
@flaky(3, 1)
|
|
async def test_random_weapon(self):
|
|
await self.make_test(Weapon)
|
|
|
|
@flaky(3, 1)
|
|
async def test_random_character(self):
|
|
await self.make_test(Character)
|