"""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