arm-core/api/tests/test_api_comments.py
Andrey Epifancev 234e830476 test(statements): закрыты отложенные minor-находки ревью задач 1-12 (T1.1, T2.1, T3.1, T3.3, T4.x, T5.5, T7.2, T7.3, T8.4, T10.1, T11.3, T12.4)
Проверки §7 по колонкам, допуск, abs_terms, M-9, граница округления; граничные случаи маппинга колонок и
уверенности; шапка, смешанные снимки, статус при задании needs_check, предупреждение о повторе формы и
идемпотентный повторный маппинг форм; редакция формы, пара ББ/ОФР, 403 без права, подтверждение формы без шапки
и без дат; комментарий без видимости ЮЛ; справочник пользователей; documents_count; CSV чек-листа.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 14:00:09 +04:00

82 lines
4.3 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.

"""Комментарии к документу (spec documents-api «Комментарии к документу», «Файлы организации…»; D-11)."""
import pytest
from sqlalchemy.ext.asyncio import AsyncSession
from src.models.enums import DocumentStatus, FileStatus, RecognitionStatus
from tests.conftest import AuthClientFactory
from tests.factories import make_document, make_stored_file
from tests.test_api_documents import KA_RF, RKA, _rostov_entity
pytestmark = pytest.mark.integration
HTTP_OK = 200
HTTP_CREATED = 201
HTTP_FORBIDDEN = 403
HTTP_NOT_FOUND = 404
HTTP_UNPROCESSABLE = 422
COMMENTS_TOTAL = 2
async def _doc(session: AsyncSession, status: DocumentStatus = DocumentStatus.CONFIRMED):
entity = await _rostov_entity(session, name="ООО Комментарии")
file, job = await make_stored_file(
session, entity=entity, status=FileStatus.PROCESSED, job_status=RecognitionStatus.done
)
return file, await make_document(session, file=file, job=job, status=status)
async def test_add_and_list(seeded: AsyncSession, auth_client: AuthClientFactory) -> None:
file, document = await _doc(seeded)
client = await auth_client(KA_RF)
created = await client.post(f"/documents/{document.id}/comments", json={"text": " нет подписи руководителя "})
assert created.status_code == HTTP_CREATED, created.text
assert created.json()["text"] == "нет подписи руководителя"
assert created.json()["author"]["full_name"]
await client.post(f"/documents/{document.id}/comments", json={"text": "второй"})
listed = (await client.get(f"/documents/{document.id}/comments")).json()
assert [item["text"] for item in listed] == ["нет подписи руководителя", "второй"]
card = (await client.get(f"/files/{file.id}")).json()
assert card["documents"][0]["comments_count"] == COMMENTS_TOTAL
assert (await client.get(f"/documents/{document.id}")).json()["comments_count"] == COMMENTS_TOTAL
async def test_validation_and_rights(seeded: AsyncSession, auth_client: AuthClientFactory) -> None:
_, document = await _doc(seeded)
url = f"/documents/{document.id}/comments"
client = await auth_client(KA_RF)
assert (await client.post(url, json={"text": " "})).status_code == HTTP_UNPROCESSABLE
assert (await client.post(url, json={"text": "x" * 4001})).status_code == HTTP_UNPROCESSABLE
reader = await auth_client(RKA)
assert (await reader.post(url, json={"text": "можно?"})).status_code == HTTP_FORBIDDEN
assert (await reader.get(url)).status_code == HTTP_OK
stranger = await auth_client("client_manager@armka.local")
assert (await stranger.get(url)).status_code == HTTP_NOT_FOUND
async def test_comment_on_superseded_file(seeded: AsyncSession, auth_client: AuthClientFactory) -> None:
entity = await _rostov_entity(seeded, name="ООО Заменённый")
file, job = await make_stored_file(
session=seeded, entity=entity, status=FileStatus.SUPERSEDED, job_status=RecognitionStatus.done
)
document = await make_document(seeded, file=file, job=job, status=DocumentStatus.RECOGNIZED)
client = await auth_client(KA_RF)
created = await client.post(f"/documents/{document.id}/comments", json={"text": "архивная версия"})
assert created.status_code == HTTP_CREATED, created.text
listing = (await client.get(f"/legal-entities/{entity.id}/files", params={"include_superseded": "true"})).json()
assert listing["items"][0]["documents"][0]["comments_count"] == 1
async def test_post_by_editor_without_entity_visibility_is_404(
seeded: AsyncSession, auth_client: AuthClientFactory
) -> None:
"""Право `DOCUMENT_EDIT` есть, но ЮЛ чужого филиала не видно: POST — 404 (как для чужого документа), комментарий не
создаётся."""
_, document = await _doc(seeded)
url = f"/documents/{document.id}/comments"
stranger = await auth_client("client_manager@armka.local") # DOCUMENT_EDIT, другой филиал
response = await stranger.post(url, json={"text": "чужой комментарий"})
assert response.status_code == HTTP_NOT_FOUND, response.text
owner = await auth_client(KA_RF)
assert (await owner.get(url)).json() == []