from job_research.apec.normalize import normalize_apec_listing
def test_normalize_apec_listing_extracts_minimal_shape() -> None:
html = """
Data Engineer F/H
Ref. Apec : 178554452W
- CLOUD TEMPLE
- 1 CDI
- Puteaux - 92
Publiée le 20/04/2026 Actualisée le 02/06/2026
CLOUD TEMPLE
Salaire
A partir de 70 k€ brut annuel
Prise de poste
Dès que possible
Expérience
Minimum 7 ans
Descriptif du poste
Build pipelines
Profil recherché
Python / SQL
Compétences attendues
Ignored
Entreprise
Ignored
Ignored recruiter info
"""
listing = normalize_apec_listing(
url="https://example.test/job/123",
html=html,
fetched_at="2026-06-01T10:00:00Z",
source_job_id="job-123",
)
assert listing.source == "apec"
assert listing.source_job_id == "job-123"
assert listing.url == "https://example.test/job/123"
assert listing.title == "Data Engineer F/H"
assert listing.company == "CLOUD TEMPLE"
assert listing.location == "Puteaux - 92"
assert listing.contract_type == "CDI"
assert listing.description_text == "Build pipelines"
assert listing.published_at == "2026-04-20"
assert listing.refreshed_at == "2026-06-02"
assert listing.fetched_at == "2026-06-01T10:00:00Z"
def test_normalize_apec_listing_prefers_final_source_job_id_from_detail_page() -> None:
html = """
Data Engineer F/H
Ref. Apec : FINAL456
- CLOUD TEMPLE
- 1 CDI
- Puteaux - 92
Publiée le 20/04/2026 Actualisée le 02/06/2026
CLOUD TEMPLE
Descriptif du poste
Build pipelines
"""
listing = normalize_apec_listing(
url="https://www.apec.fr/candidat/recherche-emploi.html/emploi/detail-offre/REQUESTED123",
html=html,
fetched_at="2026-06-01T10:00:00Z",
source_job_id="REQUESTED123",
)
assert listing.source_job_id == "FINAL456"
def test_normalize_apec_listing_warns_and_returns_none_for_invalid_dates() -> None:
html = """
Data Engineer F/H
Ref. Apec : 178554452W
- CLOUD TEMPLE
- 1 CDI
- Puteaux - 92
Publiée le 32/13/2026 Actualisée le 31/02/2026
CLOUD TEMPLE
Descriptif du poste
Build pipelines
"""
listing = normalize_apec_listing(
url="https://example.test/job/123",
html=html,
fetched_at="2026-06-01T10:00:00Z",
source_job_id="job-123",
)
assert listing.published_at is None
assert listing.refreshed_at is None
assert [warning.field for warning in listing.warnings] == ["published_at", "refreshed_at"]
def test_normalize_apec_listing_uses_details_offer_list_company_fallback() -> None:
html = """
Data Engineer F/H
Ref. Apec : 178554452W
- Fallback Company
- 1 CDI
- Puteaux - 92
Publiée le 20/04/2026 Actualisée le 02/06/2026
Salaire
A partir de 70 k€ brut annuel
Prise de poste
Dès que possible
Expérience
Minimum 7 ans
Descriptif du poste
Build pipelines
Profil recherché
Python / SQL
Compétences attendues
Ignored
Entreprise
Ignored
Ignored recruiter info
"""
listing = normalize_apec_listing(
url="https://example.test/job/123",
html=html,
fetched_at="2026-06-01T10:00:00Z",
source_job_id=None,
)
assert listing.company == "Fallback Company"
assert listing.description_text == "Build pipelines"
assert listing.refreshed_at == "2026-06-02"
def test_normalize_apec_listing_records_warnings_for_fallback_and_missing_fields() -> None:
html = """
Fallback Company
Fallback Title
"""
listing = normalize_apec_listing(
url="https://example.test/job/123",
html=html,
fetched_at="2026-06-01T10:00:00Z",
source_job_id=None,
)
assert [warning.field for warning in listing.warnings] == [
"title",
"location",
"contract_type",
"description_text",
"source_job_id",
"company",
"published_at",
]
def test_normalize_apec_listing_records_warnings_for_placeholder_text_values() -> None:
html = """
N/A
Ref. Apec : 178554452W
Publiée le 20/04/2026 Actualisée le 02/06/2026
Example Corp
Descriptif du poste
Build pipelines
"""
listing = normalize_apec_listing(
url="https://example.test/job/123",
html=html,
fetched_at="2026-06-01T10:00:00Z",
source_job_id="178554452W",
)
assert listing.title is None
assert listing.location is None
assert listing.contract_type is None
assert [warning.field for warning in listing.warnings] == ["title", "location", "contract_type"]
def test_normalize_apec_listing_records_warning_for_placeholder_company() -> None:
html = """
Data Engineer F/H
Ref. Apec : 178554452W
- Example Corp
- 1 CDI
- Puteaux - 92
Publiée le 20/04/2026 Actualisée le 02/06/2026
N/A
Descriptif du poste
Build pipelines
"""
listing = normalize_apec_listing(
url="https://example.test/job/123",
html=html,
fetched_at="2026-06-01T10:00:00Z",
source_job_id="178554452W",
)
assert listing.company is None
assert listing.refreshed_at == "2026-06-02"
assert [warning.field for warning in listing.warnings] == ["company"]
def test_normalize_apec_listing_records_warning_for_placeholder_description_text() -> None:
html = """
Data Engineer F/H
Ref. Apec : 178554452W
- CLOUD TEMPLE
- 1 CDI
- Puteaux - 92
Publiée le 20/04/2026 Actualisée le 02/06/2026
CLOUD TEMPLE
"""
listing = normalize_apec_listing(
url="https://example.test/job/123",
html=html,
fetched_at="2026-06-01T10:00:00Z",
source_job_id="job-123",
)
assert listing.description_text is None
assert [warning.field for warning in listing.warnings] == ["description_text"]