Тест сверяет имена и упорядоченные значения с блоками Enum {} DBML через pydbml.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
"""Enum'ы ORM против блоков `Enum {}` DBML v5.13: имена, значения и их порядок (без БД)."""
|
|
|
|
import enum
|
|
import re
|
|
|
|
import pytest
|
|
from sqlalchemy import Enum as SAEnum
|
|
|
|
from src.models import DBML_VERSION
|
|
from src.models.enums import ENUMS, pg_enum
|
|
from tests.dbml_helpers import dbml_path, load_dbml
|
|
|
|
EXPECTED_ENUM_COUNT = 27
|
|
|
|
|
|
def test_dbml_version_format() -> None:
|
|
assert re.fullmatch(r"\d+\.\d+", DBML_VERSION)
|
|
assert DBML_VERSION == "5.13"
|
|
assert f"v{DBML_VERSION}" in dbml_path().name
|
|
|
|
|
|
def test_enums_count_and_names_match_dbml() -> None:
|
|
dbml_enums = {e.name for e in load_dbml().enums}
|
|
assert len(dbml_enums) == EXPECTED_ENUM_COUNT
|
|
assert set(ENUMS) == dbml_enums
|
|
|
|
|
|
def test_enum_values_match_dbml_in_order() -> None:
|
|
for dbml_enum in load_dbml().enums:
|
|
expected = [item.name for item in dbml_enum.items]
|
|
actual = [m.value for m in ENUMS[dbml_enum.name]]
|
|
assert actual == expected, f"enum {dbml_enum.name}: ожидалось {expected}, фактически {actual}"
|
|
|
|
|
|
def test_enum_classes_are_str_enums_with_member_name_equal_value() -> None:
|
|
for name, cls in ENUMS.items():
|
|
assert issubclass(cls, enum.Enum) and issubclass(cls, str), name
|
|
assert [m.name for m in cls] == [m.value for m in cls], name
|
|
|
|
|
|
def test_cyrillic_values_kept_verbatim() -> None:
|
|
assert [m.value for m in ENUMS["entity_type"]] == ["ЮЛ", "ИП"]
|
|
|
|
|
|
def test_pg_enum_factory_gives_dbml_named_type_in_dkb_schema() -> None:
|
|
for name, cls in ENUMS.items():
|
|
sa_enum = pg_enum(name)
|
|
assert isinstance(sa_enum, SAEnum)
|
|
assert sa_enum.name == name
|
|
assert sa_enum.schema == "dkb"
|
|
assert sa_enum.native_enum is True
|
|
assert sa_enum.enums == [m.value for m in cls], name
|
|
|
|
|
|
def test_pg_enum_unknown_name_fails() -> None:
|
|
with pytest.raises(KeyError):
|
|
pg_enum("no_such_enum")
|