HireTrace / tests /test_document_parser.py
mrinal22258's picture
chore(release): HireTrace v2 production release with pre-launch hardening
1bbf278
Raw History Blame Contribute Delete
5.36 kB
import os
import tempfile
import pytest
from pathlib import Path
from agents.document_parser import (
extract_text,
extract_text_from_bytes,
infer_document_type,
compute_file_hash,
)
def test_plain_text_and_markdown_extraction():
with tempfile.TemporaryDirectory() as tmpdir:
txt_path = os.path.join(tmpdir, "cv.txt")
with open(txt_path, "w", encoding="utf-8") as f:
f.write("# Jane Doe\nSenior Backend Engineer\nPython, Kafka, Distributed Systems.")
md_path = os.path.join(tmpdir, "notes.md")
with open(md_path, "w", encoding="utf-8") as f:
f.write("## Interview Debrief\nStrong grasp of event-driven architectures.")
txt_extracted = extract_text(txt_path)
assert "Jane Doe" in txt_extracted
assert "Distributed Systems" in txt_extracted
md_extracted = extract_text(md_path)
assert "Interview Debrief" in md_extracted
assert "event-driven" in md_extracted
def test_docx_extraction():
from docx import Document
with tempfile.TemporaryDirectory() as tmpdir:
doc_path = os.path.join(tmpdir, "resume.docx")
doc = Document()
doc.add_heading("John Smith", level=1)
doc.add_paragraph("Staff Distributed Systems Engineer with 10 years experience.")
# Add a table
table = doc.add_table(rows=2, cols=2)
table.cell(0, 0).text = "Skill"
table.cell(0, 1).text = "Level"
table.cell(1, 0).text = "Python"
table.cell(1, 1).text = "Expert"
doc.save(doc_path)
extracted = extract_text(doc_path)
assert "John Smith" in extracted
assert "Staff Distributed Systems Engineer" in extracted
assert "Python | Expert" in extracted or "Python" in extracted
def test_pdf_extraction():
import pypdf
with tempfile.TemporaryDirectory() as tmpdir:
pdf_path = os.path.join(tmpdir, "applicant_cv.pdf")
writer = pypdf.PdfWriter()
# Create a blank page with text annotation or draw text
page = writer.add_blank_page(width=300, height=300)
# We can write PDF content stream
with open(pdf_path, "wb") as f:
writer.write(f)
# Even with an empty/blank PDF, extract_text should not crash
extracted = extract_text(pdf_path)
assert isinstance(extracted, str)
def test_legacy_doc_rejection():
with tempfile.TemporaryDirectory() as tmpdir:
doc_path = os.path.join(tmpdir, "old_resume.doc")
with open(doc_path, "wb") as f:
f.write(b"\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1") # OLE header
with pytest.raises(ValueError) as exc:
extract_text(doc_path)
assert "Legacy .doc format is not supported" in str(exc.value)
def test_unsupported_format_rejection():
with tempfile.TemporaryDirectory() as tmpdir:
bad_path = os.path.join(tmpdir, "image.png")
with open(bad_path, "wb") as f:
f.write(b"fake image data")
with pytest.raises(ValueError) as exc:
extract_text(bad_path)
assert "Unsupported file format" in str(exc.value)
def test_file_not_found():
with pytest.raises(FileNotFoundError):
extract_text("non_existent_file_path_12345.pdf")
def test_infer_document_type():
assert infer_document_type("jane_doe_cv.pdf") == "cv"
assert infer_document_type("resume_v2.docx") == "cv"
assert infer_document_type("technical_interview_transcript.txt") == "interview"
assert infer_document_type("coding_assessment_results.md") == "assessment"
assert infer_document_type("system_architecture_rfc.pdf") == "project"
def test_compute_file_hash():
data = b"Hello HireTrace Pipeline"
h1 = compute_file_hash(data)
h2 = compute_file_hash(data)
assert h1 == h2
assert len(h1) == 64 # SHA-256 hex length
def test_extract_text_from_bytes():
txt_bytes = "Software Engineer\n5 years experience".encode("utf-8")
extracted = extract_text_from_bytes(txt_bytes, "profile.txt")
assert "Software Engineer" in extracted
def test_json_extraction():
with tempfile.TemporaryDirectory() as tmpdir:
# Case 1: Dict with text/content key
json_path = os.path.join(tmpdir, "candidate.json")
with open(json_path, "w", encoding="utf-8") as f:
f.write('{"name": "Alice Smith", "text": "Senior Distributed Systems Engineer with 8 years experience."}')
extracted = extract_text(json_path)
assert "Senior Distributed Systems Engineer" in extracted
# Case 2: Dict without explicit text key - pretty formatted JSON
json_path_raw = os.path.join(tmpdir, "skills.json")
with open(json_path_raw, "w", encoding="utf-8") as f:
f.write('{"skills": ["Go", "Kubernetes"], "experience_years": 7}')
extracted_raw = extract_text(json_path_raw)
assert "Kubernetes" in extracted_raw
assert "experience_years" in extracted_raw
# Case 3: extract_text_from_bytes with JSON
json_bytes = b'{"bio": "Staff DevOps Architect", "content": "Specializing in multi-cloud infrastructure."}'
extracted_bytes = extract_text_from_bytes(json_bytes, "bio.json")
assert "Specializing in multi-cloud infrastructure" in extracted_bytes