Files
hkuds--lightrag/tests/parser/docx/test_validation_raises.py
2026-07-13 12:08:54 +08:00

46 lines
1.8 KiB
Python

"""Native DOCX content-limit validation must *raise*, never ``sys.exit``.
The DOCX parser runs in-process inside the gunicorn/uvicorn worker (via
``LightRAG.parse_native`` → ``extract_docx_blocks``). A ``sys.exit`` there
raises ``SystemExit`` (a ``BaseException``), which slips past the pipeline's
per-document ``except Exception`` handler and tears down the whole worker —
gunicorn then reports ``WORKER TIMEOUT`` and kills it with SIGABRT (code 134),
interrupting the entire processing pipeline.
These tests lock in that the content-limit checks raise ``DocxContentError``
(an ``Exception`` subclass) so just the offending document fails while the
worker keeps running.
"""
from __future__ import annotations
import pytest
from lightrag.parser.docx.parse_document import (
DocxContentError,
MAX_HEADING_LENGTH,
validate_heading_length,
)
def test_docx_content_error_is_an_exception_not_just_baseexception():
# The pipeline parse worker catches ``except Exception``; SystemExit
# (BaseException) would bypass it. Guard against a future regression that
# reintroduces a BaseException-only error type.
assert issubclass(DocxContentError, Exception)
def test_validate_heading_length_raises_instead_of_exiting():
long_heading = "x" * (MAX_HEADING_LENGTH + 213) # mirrors the 413-char report
with pytest.raises(DocxContentError) as exc_info:
validate_heading_length(long_heading, "p1")
message = str(exc_info.value)
assert f"Heading too long ({len(long_heading)} characters" in message
assert "SOLUTION:" in message
def test_validate_heading_length_does_not_raise_within_limit():
# Exactly at the limit and below must pass through silently.
validate_heading_length("x" * MAX_HEADING_LENGTH, "p2")
validate_heading_length("short heading", "p3")