46 lines
1.8 KiB
Python
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")
|