Files
mai-bot/pytests/config_test/test_config_base.py
2026-01-12 18:20:03 +08:00

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