from pathlib import Path import pytest from apps.sources.adapters.kempen import KempenEmployerAdapter from apps.sources.adapters.mol_region import MolRegionEmployerAdapter from apps.sources.adapters.regional import CordaCampusAdapter, LocalEmployerListingAdapter def test_corda_adapter_extracts_local_employer_cards_and_rejects_off_domain_links(): content = Path("fixtures/pages/corda-campus-jobs.html").read_text(encoding="utf-8") result = CordaCampusAdapter().extract( content, url="https://www.cordacampus.com/jobs/", ) assert result.parser_key == "regional-corda-campus" assert len(result.jobs) == 2 assert {job.title for job in result.jobs} == {"System Engineer", "Data Engineer"} assert {job.employer_name for job in result.jobs} == { "Voorbeeld IT", "Voorbeeld Data", } assert all(job.region == "Limburg" for job in result.jobs) assert all("evil.example" not in job.url for job in result.jobs) def test_corda_adapter_does_not_capture_individual_detail_pages(): result = CordaCampusAdapter().extract( "

System Engineer

", url="https://www.cordacampus.com/job/system-engineer/", ) assert result.jobs == [] assert result.confidence == 0.0 @pytest.mark.parametrize( ("fixture_name", "url", "expected_title", "expected_employer"), [ ( "aca-group-jobs.html", "https://acagroup.be/en/jobs", "AWS Cloud & DevOps Engineer", "ACA Group", ), ( "xplore-group-jobs.html", "https://www.xploregroup.be/en/jobs", "Platform Engineer", "Xplore Group", ), ( "uhasselt-jobs.html", "https://www.uhasselt.be/vacatures", "Expert systeembeheerder (100%)", "Universiteit Hasselt", ), ( "pxl-jobs.html", "https://ses.pxl.be/", "Lector netwerkbeheer", "Hogeschool PXL", ), ( "zol-jobs.html", "https://ziekenhuis-oost-limburg.cvw.io/?lang=nl-BE", "(Senior) IT Engineer Infrastructuur", "Ziekenhuis Oost-Limburg", ), ], ) def test_local_employer_adapter_extracts_reviewed_routes_only( fixture_name, url, expected_title, expected_employer ): content = Path(f"fixtures/pages/{fixture_name}").read_text(encoding="utf-8") result = LocalEmployerListingAdapter().extract(content, url=url) assert result.parser_key == "regional-local-employers" assert len(result.jobs) == 1 assert result.jobs[0].title == expected_title assert result.jobs[0].employer_name == expected_employer assert result.jobs[0].region == "Limburg" assert "evil.example" not in result.jobs[0].url def test_local_employer_adapter_fails_closed_for_unreviewed_host_or_path(): adapter = LocalEmployerListingAdapter() assert adapter.extract("

Fake

", url="https://evil.example/jobs").jobs == [] assert ( adapter.extract( "

Detail

", url="https://www.uhasselt.be/vacatures/detail/3999", ).jobs == [] ) @pytest.mark.parametrize( ("fixture_name", "url", "expected_title", "expected_employer"), [ ( "sck-cen-jobs.html", "https://www.sckcen.be/nl/carriere/vacatures", "Automatisatie Ingenieur PLC & OT-netwerken", "SCK CEN", ), ( "cipal-schaubroeck-jobs.html", "https://cipalschaubroeck.teamtailor.com/jobs", "Network & Security Engineer", "Cipal Schaubroeck", ), ( "vanroey-jobs.html", "https://www.vanroey.be/en/job-overview/", "Network Engineer", "VanRoey", ), ( "netropolix-jobs.html", "https://netropolix.recruitee.com/", "System Engineer - Geel", "NTX (Netropolix)", ), ( "thomas-more-jobs.html", "https://jobpage.cvwarehouse.com/?companyGuid=eab9ca13-ee10-4504-8a87-a785d0b037ef&lang=nl-BE", "Een medewerker lokale IT - Campus Geel", "Thomas More", ), ], ) def test_mol_region_adapter_extracts_only_reviewed_local_cards( fixture_name, url, expected_title, expected_employer ): content = Path(f"fixtures/pages/{fixture_name}").read_text(encoding="utf-8") result = MolRegionEmployerAdapter().extract(content, url=url) assert result.parser_key == "regional-mol-employers" assert result.warnings == [] assert len(result.jobs) == 1 assert result.jobs[0].title == expected_title assert result.jobs[0].employer_name == expected_employer assert result.jobs[0].region == "Antwerpen" assert "evil.example" not in result.jobs[0].url def test_mol_region_adapter_fails_closed_for_unreviewed_route_and_company(): adapter = MolRegionEmployerAdapter() assert adapter.extract("

Fake

", url="https://evil.example/jobs").jobs == [] assert ( adapter.extract( "

Detail

", url="https://www.sckcen.be/nl/carriere/vacatures/detail", ).jobs == [] ) @pytest.mark.parametrize( ("fixture_name", "url", "expected_title", "expected_employer", "expected_postal"), [ ( "ziekenhuis-geel-jobs.html", "https://ziekenhuisgeel.careersite.be/nl/vacatures", "ICT Support Engineer", "Ziekenhuis Geel", "2440", ), ( "stad-geel-jobs.html", "https://geel.hro.be/", "Administratief medewerker digitale dienstverlening", "Lokaal bestuur Geel", "2440", ), ( "stad-turnhout-jobs.html", "https://jobs.turnhout.be/", "Coördinator digitale projecten", "Stad Turnhout", "2300", ), ( "renotec-geel-jobs.html", "https://jobs.renotec.be/nl/alle-jobs/", "Technisch commercieel verantwoordelijke", "Group Renotec", "2440", ), ( "ravago-kempen-jobs.html", "https://ravago.softgarden.io/en/vacancies", "SAP Operations Analyst", "Ravago", "2370", ), ( "sanofi-geel-jobs.html", "https://jobs.sanofi.com/en/belgium", "Maintenance Engineer", "Sanofi", "2440", ), ( "daf-westerlo-jobs.html", "https://www.daf.com/nl-nl/werken-bij-daf/vacatures", "Technieker Facilitaire Diensten", "DAF Trucks", "2260", ), ], ) def test_kempen_adapter_extracts_only_reviewed_local_cards( fixture_name, url, expected_title, expected_employer, expected_postal ): content = Path(f"fixtures/pages/{fixture_name}").read_text(encoding="utf-8") result = KempenEmployerAdapter().extract(content, url=url) assert result.parser_key == "regional-kempen-employers" assert result.warnings == [] assert len(result.jobs) == 1 assert result.jobs[0].title == expected_title assert result.jobs[0].employer_name == expected_employer assert result.jobs[0].postal_code == expected_postal assert "evil.example" not in result.jobs[0].url def test_kempen_adapter_fails_closed_for_unreviewed_route(): adapter = KempenEmployerAdapter() assert adapter.extract("

Fake

", url="https://evil.example/jobs").jobs == [] assert ( adapter.extract( "

Detail

", url="https://jobs.sanofi.com/en/search-jobs", ).jobs == [] ) assert ( adapter.extract( "

Andere werkgever

", url="https://jobpage.cvwarehouse.com/?companyGuid=other&lang=nl-BE", ).jobs == [] )