MaiBot/pytests/config_test/test_config_base.py

106 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 本文件为测试文件请忽略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]