Files
VacatureRadar/tests/unit/test_regional_adapters.py
2026-07-22 05:12:07 +02:00

254 lines
7.9 KiB
Python

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(
"<h1>System Engineer</h1>",
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("<h3>Fake</h3>", url="https://evil.example/jobs").jobs == []
assert (
adapter.extract(
"<h3>Detail</h3>",
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("<h1>Fake</h1>", url="https://evil.example/jobs").jobs == []
assert (
adapter.extract(
"<h1>Detail</h1>",
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("<h1>Fake</h1>", url="https://evil.example/jobs").jobs == []
assert (
adapter.extract(
"<h1>Detail</h1>",
url="https://jobs.sanofi.com/en/search-jobs",
).jobs
== []
)
assert (
adapter.extract(
"<h1>Andere werkgever</h1>",
url="https://jobpage.cvwarehouse.com/?companyGuid=other&lang=nl-BE",
).jobs
== []
)