Заглушка Среза 0 не читает входные байты; отметки Task 7 / 4.1. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
"""Парсер-заглушка Среза 0 (design D-3): `NOT_IMPLEMENTED` для любого типа файла, входные байты не читаются."""
|
|
|
|
from typing import Any, get_args
|
|
|
|
import pytest
|
|
|
|
from src.contract import ErrorCode, FileType, MessageError, ResultStatus
|
|
from src.parser import NullParser, ParseOutcome, Parser, get_parser
|
|
|
|
|
|
class UntouchableBytes(bytes):
|
|
"""Байты, любое обращение к содержимому которых — ошибка теста."""
|
|
|
|
def _fail(self, *_args: Any, **_kwargs: Any) -> Any:
|
|
raise AssertionError("NullParser прикоснулся к входным байтам")
|
|
|
|
__iter__ = __len__ = __getitem__ = __bytes__ = __contains__ = __eq__ = __hash__ = _fail # type: ignore[assignment]
|
|
|
|
|
|
@pytest.mark.parametrize("file_type", get_args(FileType))
|
|
def test_null_parser_returns_not_implemented_without_touching_input(file_type: FileType) -> None:
|
|
data = UntouchableBytes(b"content")
|
|
|
|
outcome = NullParser().parse(data, file_type)
|
|
|
|
assert outcome.status is ResultStatus.ERROR
|
|
assert outcome.error == MessageError(
|
|
code=ErrorCode.NOT_IMPLEMENTED,
|
|
message="разбор XLS/XLSX/XLSB реализуется в Срезе 2",
|
|
)
|
|
assert outcome.documents == ()
|
|
assert outcome.metrics is None
|
|
|
|
|
|
def test_get_parser_returns_null_parser() -> None:
|
|
parser = get_parser()
|
|
|
|
assert isinstance(parser, NullParser)
|
|
assert isinstance(parser, Parser)
|
|
|
|
|
|
def test_outcome_error_requires_error_payload() -> None:
|
|
with pytest.raises(ValueError, match="error"):
|
|
ParseOutcome(status=ResultStatus.ERROR)
|
|
|
|
|
|
def test_outcome_success_requires_documents() -> None:
|
|
with pytest.raises(ValueError, match="documents"):
|
|
ParseOutcome(status=ResultStatus.DONE)
|