mirror of https://github.com/Mai-with-u/MaiBot.git
106 lines
3.4 KiB
Python
106 lines
3.4 KiB
Python
# 本文件为测试文件,请忽略Lint error,内含大量的ignore标识
|
||
|
||
from typing import Any, Optional, Union, List
|
||
from pathlib import Path
|
||
from importlib import util
|
||
import sys
|
||
import pytest
|
||
|
||
TEST_ROOT = Path(__file__).parent.parent.absolute().resolve()
|
||
logger_file = TEST_ROOT / "logger.py"
|
||
spec = util.spec_from_file_location("src.common.logger", logger_file)
|
||
module = util.module_from_spec(spec) # type: ignore
|
||
spec.loader.exec_module(module) # type: ignore
|
||
sys.modules["src.common.logger"] = module
|
||
|
||
# 测试对象导入
|
||
PROJECT_ROOT: Path = Path(__file__).parent.parent.parent.absolute().resolve()
|
||
sys.path.insert(0, str(PROJECT_ROOT))
|
||
sys.path.insert(0, str(PROJECT_ROOT / "src" / "config"))
|
||
|
||
from src.config.config_base import ConfigBase, Field # noqa: E402
|
||
|
||
|
||
class IllegalConfig_Dict(ConfigBase):
|
||
a: dict = Field(default_factory=dict)
|
||
|
||
|
||
class IllegalConfig_List(ConfigBase):
|
||
b: list = Field(default_factory=list)
|
||
|
||
|
||
class IllegalConfig_Set(ConfigBase):
|
||
c: set = Field(default_factory=set)
|
||
|
||
|
||
class IllegalConfig_Tuple(ConfigBase):
|
||
d: tuple = Field(default_factory=tuple)
|
||
|
||
|
||
class IllegalConfig_Union(ConfigBase):
|
||
e: Union[int, str] = Field(default_factory=str)
|
||
|
||
|
||
class IllegalConfig_Any(ConfigBase):
|
||
f: Any = Field(default_factory=dict)
|
||
|
||
|
||
class IllegalConfig_NestedGeneric(ConfigBase):
|
||
g: list[List[int]] = Field(default_factory=list)
|
||
|
||
|
||
class IllegalConfig_Any_suppress(ConfigBase):
|
||
f: Any = Field(default_factory=dict)
|
||
_validate_any: bool = False
|
||
|
||
|
||
class SubClass(ConfigBase):
|
||
x: Optional[int] = Field(default=None)
|
||
y: list[int] = [123]
|
||
|
||
|
||
class LegalConfig(ConfigBase):
|
||
a: dict[str, list[int]] = Field(default_factory=dict)
|
||
b: list[int] = Field(default_factory=list)
|
||
c: set[str] = Field(default_factory=set)
|
||
d: Optional[str] = Field(default=None)
|
||
e: SubClass = Field(default_factory=SubClass)
|
||
|
||
|
||
@pytest.mark.parametrize(
|
||
"config_class, expected_exception, expected_message",
|
||
[
|
||
(IllegalConfig_Dict, TypeError, "必须指定键和值的类型参数"),
|
||
(IllegalConfig_List, TypeError, "必须指定且仅指定一个类型参数"),
|
||
(IllegalConfig_Set, TypeError, "必须指定且仅指定一个类型参数"),
|
||
(IllegalConfig_Tuple, TypeError, "不允许使用 Tuple 类型注解"),
|
||
(IllegalConfig_Union, TypeError, "不允许使用 Union 类型注解"),
|
||
(IllegalConfig_Any, TypeError, "不允许使用 Any 类型注解"),
|
||
(IllegalConfig_NestedGeneric, TypeError, "不允许嵌套泛型类型"),
|
||
(IllegalConfig_Any_suppress, None, ""),
|
||
],
|
||
)
|
||
def test_illegal_config(config_class, expected_exception, expected_message):
|
||
# sourcery skip: no-conditionals-in-tests
|
||
if expected_exception:
|
||
with pytest.raises(expected_exception) as exc_info:
|
||
config_class()
|
||
assert expected_message in str(exc_info.value)
|
||
assert expected_exception == exc_info.type
|
||
else:
|
||
config_instance = config_class()
|
||
assert isinstance(config_instance, config_class)
|
||
|
||
|
||
def test_legal_config():
|
||
config_instance = LegalConfig()
|
||
assert isinstance(config_instance, LegalConfig)
|
||
assert isinstance(config_instance.a, dict)
|
||
assert isinstance(config_instance.b, list)
|
||
assert isinstance(config_instance.c, set)
|
||
assert config_instance.d is None
|
||
assert isinstance(config_instance.e, SubClass)
|
||
assert config_instance.e.x is None
|
||
assert isinstance(config_instance.e.y, list)
|
||
assert config_instance.e.y == [123]
|