"""Smoke test for the Indeed adapter. This test opens the Indeed search page and verifies that: 1. The page loads without error 2. Job cards are detected OR zero-result state is handled 3. Card data can be extracted NOTE: This test requires a network connection and Chrome browser. Mark with @pytest.mark.network to allow skipping in CI. """ import pytest @pytest.fixture def indeed_manifest(): from gimme_job.config import load_site_manifest try: return load_site_manifest("indeed") except FileNotFoundError: pytest.skip("indeed.yaml not found") @pytest.fixture def search_query(): from gimme_job.models.dto import SearchQuery return SearchQuery(keywords=["orthodontist"], max_items=10) def test_indeed_manifest_valid(indeed_manifest): """Manifest parses and has required fields.""" assert indeed_manifest.site_id == "indeed" assert indeed_manifest.identity.base_url assert indeed_manifest.identity.start_url_template assert indeed_manifest.extract.container_selectors def test_indeed_adapter_registered(): """IndeedAdapter is registered in the registry.""" from gimme_job.adapters.registry import _load_all_adapters, _REGISTRY _load_all_adapters() assert "indeed" in _REGISTRY def test_indeed_url_construction(indeed_manifest, search_query): """Start URL is constructed correctly with keyword encoding.""" url = indeed_manifest.build_start_url(search_query) assert "orthodontist" in url.lower() assert "indeed.com" in url @pytest.mark.network def test_indeed_smoke(indeed_manifest, search_query): """Open Indeed search and verify cards or zero-result are detected.""" from gimme_job.adapters.indeed import IndeedAdapter from gimme_job.runtime.browser import BrowserManager adapter = IndeedAdapter(indeed_manifest) bm = BrowserManager(headless=True) try: context = bm.open_context(headless=True) page = context.new_page() page.set_default_timeout(15000) url = indeed_manifest.build_start_url(search_query) page.goto(url, timeout=30000) # Allow page to settle import time time.sleep(2) # Collect cards cards = adapter.collect_cards(page, indeed_manifest) # Either cards found OR page loaded cleanly (zero results is ok) assert isinstance(cards, list), "collect_cards must return a list" if cards: # Validate at least 2 fields on first card card = cards[0] assert card.title and card.title.strip(), "Card must have a title" has_second_field = any([card.company, card.location, card.posted_text, card.url]) assert has_second_field, "Card must have at least one additional field" finally: bm.close()