from io import BytesIO
import zipfile
from backend.main import app
from fastapi.testclient import TestClient
client = TestClient(app)
def build_docx(paragraphs: list[str]) -> BytesIO:
document_xml = """
{paras}
"""
paras = "\n".join(f"{paragraph}" for paragraph in paragraphs)
buffer = BytesIO()
with zipfile.ZipFile(buffer, 'w', compression=zipfile.ZIP_DEFLATED) as archive:
archive.writestr('[Content_Types].xml', """
""")
archive.writestr('_rels/.rels', """
""")
archive.writestr('word/document.xml', document_xml.format(paras=paras))
buffer.seek(0)
buffer.name = 'sample-report.docx'
return buffer
def test_admin_parse_doc_extracts_case_preview_from_docx() -> None:
file_obj = build_docx([
'Case ID: 124',
'Age: 16',
'Gender: female',
'Status: analyzed',
'Found alive: yes',
'Found distance km: 3.5',
'Who found: Search team 4',
'Notes: Found near the logging road',
])
response = client.post(
'/api/v1/admin/parse-doc',
files={'file': ('sample-report.docx', file_obj, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')},
)
assert response.status_code == 200
payload = response.json()
assert payload['parsed'] is True
assert payload['filename'] == 'sample-report.docx'
assert payload['preview']['case_id'] == '124'
assert payload['preview']['case']['age'] == 16
assert payload['preview']['case']['gender'] == 'female'
assert payload['preview']['case']['status'] == 'analyzed'
assert payload['preview']['case']['found_alive'] is True
assert payload['preview']['case']['found_distance_km'] == 3.5
assert payload['preview']['case']['who_found'] == 'Search team 4'
assert payload['preview']['case']['notes'] == 'Found near the logging road'
assert 'Case ID: 124' in payload['raw_text']