101 lines
3.5 KiB
Python
101 lines
3.5 KiB
Python
"""CV Bank list payload — ATS fields, suggested jobs, scored job."""
|
|
|
|
from types import SimpleNamespace
|
|
|
|
from job.candidate.serializers import serialize_bank_candidate, serialize_bank_silver_medalist
|
|
|
|
|
|
def _speculative(**overrides):
|
|
row = SimpleNamespace(
|
|
id="11111111-1111-1111-1111-111111111111",
|
|
candidate_name="Ada Lovelace",
|
|
candidate_email="ada@example.com",
|
|
candidate_phone="",
|
|
file_name="ada.pdf",
|
|
file_path="https://s3/ada.pdf",
|
|
linkedin_url=None,
|
|
current_company="Acme",
|
|
current_position="Backend Engineer",
|
|
education="",
|
|
skills=["Python"],
|
|
years_experience=6,
|
|
bank_reason="speculative",
|
|
bank_expires_at=None,
|
|
user_id=None,
|
|
job_post_id=None,
|
|
created_at=None,
|
|
updated_at=None,
|
|
)
|
|
for key, value in overrides.items():
|
|
setattr(row, key, value)
|
|
return row
|
|
|
|
|
|
def test_speculative_leaves_ats_empty_for_the_list_join():
|
|
payload = serialize_bank_candidate(_speculative())
|
|
assert payload["bank_source"] == "speculative"
|
|
assert payload["ai_score"] is None
|
|
assert payload["suggested_job_post_ids"] == []
|
|
assert payload["suggested_jobs"] == []
|
|
assert payload["scored_job_post_id"] is None
|
|
assert payload["message_id"] is None
|
|
assert payload["current_position"] == "Backend Engineer"
|
|
assert payload["years_experience"] == 6
|
|
assert payload["city"] is None
|
|
|
|
|
|
def test_speculative_keeps_assigned_job_id():
|
|
job_id = "22222222-2222-2222-2222-222222222222"
|
|
payload = serialize_bank_candidate(_speculative(job_post_id=job_id))
|
|
assert payload["assigned_job_post_id"] == job_id
|
|
|
|
|
|
def test_silver_exposes_suggested_jobs_and_inbox_score_path():
|
|
payload = serialize_bank_silver_medalist({
|
|
"inbox_id": 42,
|
|
"message_id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
|
|
"name": "Grace Hopper",
|
|
"email": "grace@example.com",
|
|
"current_company": "Navy",
|
|
"current_title": "Rear Admiral",
|
|
"matched_keywords": ["COBOL"],
|
|
"years_experience": 20,
|
|
"ai_score": 88,
|
|
"recommendation": "Strong Match",
|
|
"assigned_job_post_id": "job-1",
|
|
"last_job_post_id": "job-1",
|
|
"last_job_title": "Principal Engineer",
|
|
"suggested_job_post_ids": ["job-1", "job-2"],
|
|
"user_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
|
"created_at": "2026-08-01T10:00:00Z",
|
|
})
|
|
assert payload["bank_source"] == "silver_medalist"
|
|
assert payload["ai_score"] == 88
|
|
assert payload["message_id"] == "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
|
|
assert payload["assigned_job_post_id"] == "job-1"
|
|
assert payload["scored_job_post_id"] == "job-1"
|
|
assert payload["scored_job_title"] == "Principal Engineer"
|
|
assert payload["suggested_job_post_ids"] == ["job-1", "job-2"]
|
|
assert payload["suggested_jobs"] == []
|
|
|
|
|
|
def test_silver_without_suggestions_stays_empty():
|
|
payload = serialize_bank_silver_medalist({
|
|
"inbox_id": 7,
|
|
"name": "Sparse",
|
|
"email": "s@example.com",
|
|
"ai_score": 70,
|
|
})
|
|
assert payload["suggested_job_post_ids"] == []
|
|
assert payload["message_id"] is None
|
|
assert payload["assigned_job_post_id"] is None
|
|
|
|
|
|
def test_years_from_inbox_free_text():
|
|
from inbox.models import _years_from_text
|
|
assert _years_from_text("5+ years") == 5
|
|
assert _years_from_text("6") == 6
|
|
assert _years_from_text(8) == 8
|
|
assert _years_from_text(None) is None
|
|
assert _years_from_text("") is None
|