"""Enum'ы ORM против блоков `Enum {}` DBML v5.14: имена, значения и их порядок (без БД).""" 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.14" 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")