You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
3.1 KiB
Python
82 lines
3.1 KiB
Python
"""Smoke test for the Tribal Health job board adapter.
|
|
|
|
Verifies that:
|
|
1. The manifest parses and exposes required fields
|
|
2. The adapter is registered
|
|
3. (network) The board opens and either dental/ortho cards are detected OR a
|
|
zero-result state is handled cleanly; any returned card matches the keyword filter
|
|
|
|
NOTE: The network test requires a connection and the Chrome browser.
|
|
Mark with @pytest.mark.network to allow skipping in CI.
|
|
"""
|
|
import pytest
|
|
|
|
|
|
@pytest.fixture
|
|
def tribalhealth_manifest():
|
|
from gimme_job.config import load_site_manifest
|
|
try:
|
|
return load_site_manifest("tribalhealth")
|
|
except FileNotFoundError:
|
|
pytest.skip("tribalhealth.yaml not found")
|
|
|
|
|
|
def test_tribalhealth_manifest_valid(tribalhealth_manifest):
|
|
"""Manifest parses and has required fields."""
|
|
assert tribalhealth_manifest.site_id == "tribalhealth"
|
|
assert tribalhealth_manifest.identity.base_url
|
|
assert tribalhealth_manifest.identity.start_url_template
|
|
assert tribalhealth_manifest.extract.container_selectors
|
|
# Keyword filter must be present — the board is not keyword-searchable.
|
|
assert tribalhealth_manifest.post_filters.include_title_keywords
|
|
|
|
|
|
def test_tribalhealth_adapter_registered():
|
|
"""TribalHealthAdapter is registered in the registry."""
|
|
from gimme_job.adapters.registry import _load_all_adapters, _REGISTRY
|
|
_load_all_adapters()
|
|
assert "tribalhealth" in _REGISTRY
|
|
|
|
|
|
def test_tribalhealth_start_url(tribalhealth_manifest):
|
|
"""Start URL points at the job board."""
|
|
from gimme_job.models.dto import SearchQuery
|
|
url = tribalhealth_manifest.build_start_url(SearchQuery())
|
|
assert "tribalhealth.com/job-board" in url
|
|
|
|
|
|
@pytest.mark.network
|
|
def test_tribalhealth_smoke(tribalhealth_manifest):
|
|
"""Open the board and verify cards (keyword-matched) or a clean zero-result."""
|
|
from gimme_job.adapters.tribalhealth import TribalHealthAdapter
|
|
from gimme_job.runtime.browser import BrowserManager
|
|
|
|
adapter = TribalHealthAdapter(tribalhealth_manifest)
|
|
bm = BrowserManager(headless=True)
|
|
|
|
try:
|
|
bm.open_context(headless=True)
|
|
page = bm.new_page()
|
|
page.set_default_timeout(20000)
|
|
|
|
url = tribalhealth_manifest.build_start_url(
|
|
__import__("gimme_job.models.dto", fromlist=["SearchQuery"]).SearchQuery()
|
|
)
|
|
page.goto(url, timeout=45000, wait_until="domcontentloaded")
|
|
|
|
cards = adapter.collect_cards(page, tribalhealth_manifest)
|
|
assert isinstance(cards, list), "collect_cards must return a list"
|
|
|
|
keywords = [k.lower() for k in tribalhealth_manifest.post_filters.include_title_keywords]
|
|
for card in cards:
|
|
assert card.title and card.title.strip(), "Card must have a title"
|
|
# Every returned card must satisfy the keyword filter.
|
|
assert any(kw in card.title.lower() for kw in keywords), (
|
|
f"Card slipped the keyword filter: {card.title!r}"
|
|
)
|
|
# At least one field beyond title.
|
|
assert any([card.location, card.url, card.company]), "Card needs a second field"
|
|
|
|
finally:
|
|
bm.close()
|