HR-ATS-Portal/backend/tests/test_professional_summary.py

153 lines
5.0 KiB
Python

"""Professional summary — persist fields and serializer shape. No DB."""
from types import SimpleNamespace
from uuid import uuid4
from g_sheet.scoring import serialize_form_ats
from inbox.serializers import serialize_ats_result, serialize_inbox_rescan_run
from job.candidate.plugins import candidate_completed_fields, candidate_failed_fields
from job.candidate.serializers import serialize_candidate
def test_failed_fields_omit_professional_summary():
source = {"safe_name": "a.pdf", "file_path": None, "sha256": "x"}
fields = candidate_failed_fields(source, "PDF_TEXT_UNAVAILABLE", "empty")
assert "professional_summary" not in fields
def test_completed_fields_include_professional_summary():
result = SimpleNamespace(
candidate_name="Ada",
job_title="Engineer",
current_company="Acme",
years_experience=6,
match_score=82,
matched_keywords=["Python"],
missing_keywords=["AWS"],
summary_critique="Strong Python, missing cloud.",
professional_summary="Python backend specialist in Engineering.",
)
source = {"safe_name": "a.pdf", "file_path": None, "sha256": "x"}
fields = candidate_completed_fields(source, result)
assert fields["professional_summary"] == "Python backend specialist in Engineering."
assert "resume_text" not in fields
assert "inbox_message_id" not in fields
assert "manual_upload_candidate_id" not in fields
def test_completed_fields_link_inbox_and_manual_ids():
result = SimpleNamespace(
candidate_name="Ada",
job_title="Engineer",
current_company="Acme",
years_experience=6,
match_score=82,
matched_keywords=["Python"],
missing_keywords=["AWS"],
summary_critique="Strong Python, missing cloud.",
professional_summary="Python backend specialist in Engineering.",
)
inbox_id = uuid4()
manual_id = uuid4()
inbox_fields = candidate_completed_fields(
{"safe_name": "a.pdf", "file_path": None, "sha256": "x", "inbox_message_id": inbox_id},
result,
)
assert inbox_fields["inbox_message_id"] == inbox_id
assert "manual_upload_candidate_id" not in inbox_fields
assert "resume_text" not in inbox_fields
manual_fields = candidate_completed_fields(
{"safe_name": "a.pdf", "file_path": None, "sha256": "x", "manual_upload_candidate_id": manual_id},
result,
)
assert manual_fields["manual_upload_candidate_id"] == manual_id
assert "inbox_message_id" not in manual_fields
def test_serialize_ats_result_includes_summary():
job_id = uuid4()
row = SimpleNamespace(
job_post_id=job_id,
overall_score=81.0,
band="Potential Match",
professional_summary="Python backend in Engineering.",
computed_at=None,
)
assert serialize_ats_result(row) == {
"job_post_id": str(job_id),
"overall_score": 81.0,
"band": "Potential Match",
"professional_summary": "Python backend in Engineering.",
"computed_at": None,
}
assert serialize_form_ats(row) == serialize_ats_result(row)
def test_serialize_inbox_rescan_run_includes_summaries():
run_id = uuid4()
entry = {
"kind": "email",
"record_id": str(uuid4()),
"job_post_id": str(uuid4()),
"professional_summary": "Python backend in Engineering.",
}
row = SimpleNamespace(
id=run_id,
status="completed",
channel="all",
sheet=None,
task_id=None,
created_by=None,
job_count=2,
candidate_count=1,
skipped_candidates=0,
skipped_pairs=0,
pair_count=1,
done_count=1,
summaries=[entry],
error=None,
created_at=None,
started_at=None,
finished_at=None,
)
payload = serialize_inbox_rescan_run(row)
assert payload["summaries"] == [entry]
assert payload["id"] == str(run_id)
assert payload["done_count"] == 1
def test_serialize_candidate_links_source_tables_not_resume_text():
inbox_id = uuid4()
row = SimpleNamespace(
id=uuid4(),
job_id=uuid4(),
source="inbox",
filename="a.pdf",
file_path=None,
content_sha256="x",
candidate_email="ada@example.com",
candidate_name="Ada",
job_title="Engineer",
current_company="Acme",
years_experience=6,
match_score=82,
matched_keywords=["Python"],
missing_keywords=["AWS"],
summary_critique="Strong Python.",
professional_summary="Python backend in Engineering.",
linkedin_url=None,
inbox_message_id=inbox_id,
manual_upload_candidate_id=None,
status="completed",
error_code=None,
error_message=None,
model="gpt-test",
created_by=uuid4(),
created_at=None,
updated_at=None,
)
payload = serialize_candidate(row)
assert payload["inbox_message_id"] == str(inbox_id)
assert payload["manual_upload_candidate_id"] is None
assert "resume_text" not in payload