- Убраны отладочные print() в режиме MANUAL. - mypy: computed_field у is_debit/is_credit — с type: ignore[prop-decorator], как у остальных схем; флаг is_more_5_percent без сравнения Decimal с None (поведение прежнее). - ruff format по трём файлам. - test_openapi_routes: новые маршруты шахматки и правил элиминации в EXPECTED_ROUTES. make check: ruff, ruff format, mypy — чисто; pytest 1303 passed, 44 skipped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
"""Плоский справочник счетов: все уровни и порядок кодов."""
|
|
|
|
import uuid
|
|
from types import SimpleNamespace
|
|
from unittest.mock import AsyncMock
|
|
|
|
from src.api.endpoints.directories.accounts import list_accounts
|
|
from src.models.enums import AccountKind, AccountRowType
|
|
from src.repositories.directories import list_accounts as query_accounts
|
|
|
|
|
|
async def test_accounts_are_flat_and_naturally_sorted() -> None:
|
|
root_id, sub_id = uuid.uuid4(), uuid.uuid4()
|
|
rows = [
|
|
SimpleNamespace(
|
|
id=sub_id,
|
|
code="60.10",
|
|
parent_id=root_id,
|
|
name="Авансы",
|
|
kind=AccountKind.A,
|
|
row_type=AccountRowType.subaccount,
|
|
is_off_balance=False,
|
|
),
|
|
SimpleNamespace(
|
|
id=root_id,
|
|
code="60",
|
|
parent_id=None,
|
|
name="Расчёты",
|
|
kind=AccountKind.AP,
|
|
row_type=AccountRowType.account,
|
|
is_off_balance=False,
|
|
),
|
|
SimpleNamespace(
|
|
id=uuid.uuid4(),
|
|
code="60.2",
|
|
parent_id=root_id,
|
|
name="Поставщики",
|
|
kind=AccountKind.P,
|
|
row_type=AccountRowType.subaccount,
|
|
is_off_balance=False,
|
|
),
|
|
]
|
|
session = SimpleNamespace(scalars=AsyncMock(return_value=SimpleNamespace(all=lambda: rows)))
|
|
|
|
assert [item.code for item in await query_accounts(session)] == ["60", "60.2", "60.10"]
|
|
response = await list_accounts(session)
|
|
assert [item.code for item in response] == ["60", "60.2", "60.10"]
|
|
assert response[0].parent_id is None
|
|
assert response[2].parent_id == root_id
|
|
assert response[2].id == sub_id
|
|
assert [item.model_dump(mode="json")["is_debit"] for item in response] == [True, False, True]
|
|
assert [item.model_dump(mode="json")["is_credit"] for item in response] == [True, True, False]
|