Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 1 addition & 33 deletions app/source_catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,6 @@
"mode": "experimental",
"description": "Experimental provider for public Kleinanzeigen job listings. Uses conservative limits, optional detail enrichment, no CAPTCHA/proxy bypass, and fails safely if blocking or layout changes are detected.",
},
{
"key": "linkedin",
"name": "LinkedIn Jobs",
"source_type": "search_link",
"mode": "search-only",
"description": "Open a targeted LinkedIn Jobs search. No scraping is performed by the stable JobTrack providers.",
"url_template": "https://www.linkedin.com/jobs/search/?keywords={query}&location={location}",
},
{
"key": "indeed",
"name": "Indeed Germany",
Expand All @@ -48,37 +40,13 @@
"description": "Open the equivalent StepStone search in a new tab. Recommended as a fallback when the experimental provider is blocked or StepStone changes its page layout.",
"url_template": "https://www.stepstone.de/jobs/{query_slug}/in-{location_slug}",
},
{
"key": "google",
"name": "Google Jobs Search",
"source_type": "search_link",
"mode": "search-only",
"description": "Open Google job-oriented search results. Google Cloud Talent Solution is not a public Google Jobs feed.",
"url_template": "https://www.google.com/search?q={query}+jobs+{location}",
},
{
"key": "glassdoor",
"name": "Glassdoor",
"source_type": "search_link",
"mode": "search-only",
"description": "Open a targeted Glassdoor search; no automated scraping in the stable provider layer.",
"url_template": "https://www.google.com/search?q=site%3Aglassdoor.de+{query}+{location}",
},
{
"key": "talent",
"name": "Talent.com",
"source_type": "search_link",
"mode": "search-only",
"description": "Open a targeted Talent.com search; no automated scraping.",
"url_template": "https://de.talent.com/jobs?k={query}&l={location}",
},
{
"key": "arbeitsagentur",
"name": "Bundesagentur für Arbeit",
"source_type": "search_link",
"mode": "search-only",
"description": "Open Bundesagentur Jobsuche in a new tab. Can later be replaced by an approved API integration.",
"url_template": "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was={query}&wo={location}",
"url_template": "https://www.arbeitsagentur.de/jobsuche/suche?suchbereich=jobs&was={query}&wo={location}",
},
{
"key": "jooble",
Expand Down
17 changes: 13 additions & 4 deletions tests/test_source_catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,8 @@
def test_catalog_contains_requested_platforms():
keys = {x["key"] for x in SOURCE_CATALOG}
expected = {
"linkedin",
"indeed",
"stepstone",
"google",
"glassdoor",
"talent",
"arbeitsagentur",
"jooble",
"greenhouse",
Expand All @@ -20,6 +16,19 @@ def test_catalog_contains_requested_platforms():
assert expected.issubset(keys)


def test_catalog_only_keeps_useful_manual_search_shortcuts():
manual_keys = {x["key"] for x in SOURCE_CATALOG if x["mode"] == "search-only"}
assert manual_keys == {"indeed", "stepstone-search", "arbeitsagentur"}


def test_arbeitsagentur_uses_current_jobs_search_parameters():
source = next(x for x in SOURCE_CATALOG if x["key"] == "arbeitsagentur")
url = render_search_url(source["url_template"], "quality engineer", "Berlin")
assert "suchbereich=jobs" in url
assert "was=quality+engineer" in url
assert "wo=Berlin" in url


def test_search_url_is_encoded():
url = render_search_url(
"https://example.com?q={query}&l={location}",
Expand Down
Loading