arm-core/api/tests/test_enums.py
Andrey Epifancev 251c30d5ca feat(#190): DBML v5.25 — ORM и миграция фактов качества первички
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-11-05 15:49:15 +04:00

88 lines
3.1 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.

"""Enum'ы ORM против блоков `Enum {}` DBML v5.25: имена, значения и их порядок (без БД)."""
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 = 36
def test_dbml_version_format() -> None:
assert re.fullmatch(r"\d+\.\d+", DBML_VERSION)
assert DBML_VERSION == "5.25"
assert f"v{DBML_VERSION}" in dbml_path().name
def test_osv_data_type_has_nu_after_bu() -> None:
"""v5.15: налоговый учёт (`NU`) идёт сразу после `BU` — порядок DBML."""
assert [m.value for m in ENUMS["osv_data_type"]] == ["BU", "NU", "CURRENCY", "QUANTITY", "SUM"]
def test_counterparty_match_kind_values() -> None:
"""v5.16: способ сопоставления контрагента — пять значений в порядке DBML."""
assert [m.value for m in ENUMS["counterparty_match_kind"]] == ["INN", "NAME", "ALIAS", "MANUAL", "PROPAGATED"]
def test_quality_enums_values() -> None:
"""v5.25: три новых enum'а метрик качества — значения и порядок как в DBML."""
assert [m.value for m in ENUMS["quality_outcome"]] == [
"AUTO_CONFIRMED",
"CONFIRMED",
"DELETED",
"SUPERSEDED",
"DELETED_AFTER_CONFIRM",
"SUPERSEDED_AFTER_CONFIRM",
]
assert [m.value for m in ENUMS["quality_cause"]] == [
"SERVICE_ERROR",
"OUR_ERROR",
"CLIENT_DOCUMENT",
"WITHOUT_PARTICIPATION",
"AS_IS",
]
assert [m.value for m in ENUMS["quality_failure_kind"]] == ["SERVICE_ERROR", "TIMEOUT", "NO_ACK", "MAPPING"]
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")