Pure transform functions (no LLM, no DB) bridging the two resume representations: library struct_json ↔ ResumePayload content fields. Exports library_to_profile_content, profile_to_library, make_auto_backup_name, blank_fields_on_import. 22 tests, all passing.
181 lines
6.8 KiB
Python
181 lines
6.8 KiB
Python
"""Unit tests for scripts.resume_sync — format transform between library and profile."""
|
||
import json
|
||
import pytest
|
||
from scripts.resume_sync import (
|
||
library_to_profile_content,
|
||
profile_to_library,
|
||
make_auto_backup_name,
|
||
blank_fields_on_import,
|
||
)
|
||
|
||
# ── Fixtures ──────────────────────────────────────────────────────────────────
|
||
|
||
STRUCT_JSON = {
|
||
"name": "Alex Rivera",
|
||
"email": "alex@example.com",
|
||
"phone": "555-0100",
|
||
"career_summary": "Senior UX Designer with 6 years experience.",
|
||
"experience": [
|
||
{
|
||
"title": "Senior UX Designer",
|
||
"company": "StreamNote",
|
||
"start_date": "2023",
|
||
"end_date": "present",
|
||
"location": "Remote",
|
||
"bullets": ["Led queue redesign", "Built component library"],
|
||
}
|
||
],
|
||
"education": [
|
||
{
|
||
"institution": "State University",
|
||
"degree": "B.F.A.",
|
||
"field": "Graphic Design",
|
||
"start_date": "2015",
|
||
"end_date": "2019",
|
||
}
|
||
],
|
||
"skills": ["Figma", "User Research"],
|
||
"achievements": ["Design award 2024"],
|
||
}
|
||
|
||
PROFILE_PAYLOAD = {
|
||
"name": "Alex",
|
||
"surname": "Rivera",
|
||
"email": "alex@example.com",
|
||
"phone": "555-0100",
|
||
"career_summary": "Senior UX Designer with 6 years experience.",
|
||
"experience": [
|
||
{
|
||
"title": "Senior UX Designer",
|
||
"company": "StreamNote",
|
||
"period": "2023 – present",
|
||
"location": "Remote",
|
||
"industry": "",
|
||
"responsibilities": "Led queue redesign\nBuilt component library",
|
||
"skills": [],
|
||
}
|
||
],
|
||
"education": [
|
||
{
|
||
"institution": "State University",
|
||
"degree": "B.F.A.",
|
||
"field": "Graphic Design",
|
||
"start_date": "2015",
|
||
"end_date": "2019",
|
||
}
|
||
],
|
||
"skills": ["Figma", "User Research"],
|
||
"achievements": ["Design award 2024"],
|
||
}
|
||
|
||
|
||
# ── library_to_profile_content ────────────────────────────────────────────────
|
||
|
||
def test_library_to_profile_splits_name():
|
||
result = library_to_profile_content(STRUCT_JSON)
|
||
assert result["name"] == "Alex"
|
||
assert result["surname"] == "Rivera"
|
||
|
||
def test_library_to_profile_single_word_name():
|
||
result = library_to_profile_content({**STRUCT_JSON, "name": "Cher"})
|
||
assert result["name"] == "Cher"
|
||
assert result["surname"] == ""
|
||
|
||
def test_library_to_profile_email_phone():
|
||
result = library_to_profile_content(STRUCT_JSON)
|
||
assert result["email"] == "alex@example.com"
|
||
assert result["phone"] == "555-0100"
|
||
|
||
def test_library_to_profile_career_summary():
|
||
result = library_to_profile_content(STRUCT_JSON)
|
||
assert result["career_summary"] == "Senior UX Designer with 6 years experience."
|
||
|
||
def test_library_to_profile_experience_period():
|
||
result = library_to_profile_content(STRUCT_JSON)
|
||
assert result["experience"][0]["period"] == "2023 – present"
|
||
|
||
def test_library_to_profile_experience_bullets_joined():
|
||
result = library_to_profile_content(STRUCT_JSON)
|
||
assert result["experience"][0]["responsibilities"] == "Led queue redesign\nBuilt component library"
|
||
|
||
def test_library_to_profile_experience_industry_blank():
|
||
result = library_to_profile_content(STRUCT_JSON)
|
||
assert result["experience"][0]["industry"] == ""
|
||
|
||
def test_library_to_profile_education():
|
||
result = library_to_profile_content(STRUCT_JSON)
|
||
assert result["education"][0]["institution"] == "State University"
|
||
assert result["education"][0]["degree"] == "B.F.A."
|
||
|
||
def test_library_to_profile_skills():
|
||
result = library_to_profile_content(STRUCT_JSON)
|
||
assert result["skills"] == ["Figma", "User Research"]
|
||
|
||
def test_library_to_profile_achievements():
|
||
result = library_to_profile_content(STRUCT_JSON)
|
||
assert result["achievements"] == ["Design award 2024"]
|
||
|
||
def test_library_to_profile_missing_fields_no_keyerror():
|
||
result = library_to_profile_content({})
|
||
assert result["name"] == ""
|
||
assert result["experience"] == []
|
||
assert result["education"] == []
|
||
assert result["skills"] == []
|
||
assert result["achievements"] == []
|
||
|
||
|
||
# ── profile_to_library ────────────────────────────────────────────────────────
|
||
|
||
def test_profile_to_library_full_name():
|
||
text, struct = profile_to_library(PROFILE_PAYLOAD)
|
||
assert struct["name"] == "Alex Rivera"
|
||
|
||
def test_profile_to_library_experience_bullets_reconstructed():
|
||
_, struct = profile_to_library(PROFILE_PAYLOAD)
|
||
assert struct["experience"][0]["bullets"] == ["Led queue redesign", "Built component library"]
|
||
|
||
def test_profile_to_library_period_split():
|
||
_, struct = profile_to_library(PROFILE_PAYLOAD)
|
||
assert struct["experience"][0]["start_date"] == "2023"
|
||
assert struct["experience"][0]["end_date"] == "present"
|
||
|
||
def test_profile_to_library_education_round_trip():
|
||
_, struct = profile_to_library(PROFILE_PAYLOAD)
|
||
assert struct["education"][0]["institution"] == "State University"
|
||
|
||
def test_profile_to_library_plain_text_contains_name():
|
||
text, _ = profile_to_library(PROFILE_PAYLOAD)
|
||
assert "Alex Rivera" in text
|
||
|
||
def test_profile_to_library_plain_text_contains_summary():
|
||
text, _ = profile_to_library(PROFILE_PAYLOAD)
|
||
assert "Senior UX Designer" in text
|
||
|
||
def test_profile_to_library_empty_payload_no_crash():
|
||
text, struct = profile_to_library({})
|
||
assert isinstance(text, str)
|
||
assert isinstance(struct, dict)
|
||
|
||
|
||
# ── make_auto_backup_name ─────────────────────────────────────────────────────
|
||
|
||
def test_backup_name_format():
|
||
name = make_auto_backup_name("Senior Engineer Resume")
|
||
import re
|
||
assert re.match(r"Auto-backup before Senior Engineer Resume — \d{4}-\d{2}-\d{2}", name)
|
||
|
||
|
||
# ── blank_fields_on_import ────────────────────────────────────────────────────
|
||
|
||
def test_blank_fields_industry_always_listed():
|
||
result = blank_fields_on_import(STRUCT_JSON)
|
||
assert "experience[].industry" in result
|
||
|
||
def test_blank_fields_location_listed_when_missing():
|
||
no_loc = {**STRUCT_JSON, "experience": [{**STRUCT_JSON["experience"][0], "location": ""}]}
|
||
result = blank_fields_on_import(no_loc)
|
||
assert "experience[].location" in result
|
||
|
||
def test_blank_fields_location_not_listed_when_present():
|
||
result = blank_fields_on_import(STRUCT_JSON)
|
||
assert "experience[].location" not in result
|