254 lines
7.9 KiB
Python
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
|
|
== []
|
|
)
|