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

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

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

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

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 = """
Ref. Apec : 178554452W
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

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

Publiée le 20/04/2026 Actualisée le 02/06/2026

CLOUD TEMPLE

Descriptif du poste

N/A

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