"""Regression guard for issue #1414 — a broken upstream `searxng:latest` tag (2026.6.2 crashed on boot with KeyError: 'default_doi_resolver') failed the searxng healthcheck, and because `odysseus` waits on it via `depends_on: condition: service_healthy`, the whole app never started on fresh Docker installs. Pin the SearXNG image to a known-good tag so a bad upstream `latest` can't block startup. This guards that the pin stays in place. """ import re from pathlib import Path COMPOSE = Path(__file__).resolve().parent.parent / "docker-compose.yml" def test_searxng_image_is_pinned_not_latest(): text = COMPOSE.read_text(encoding="utf-8") m = re.search(r"image:\s*\S*searxng/searxng:(\S+)", text) assert m, "searxng image line not found in docker-compose.yml" tag = m.group(1) assert tag != "latest", ( "SearXNG must be pinned, not ':latest' — odysseus startup depends on its " "healthcheck, so a broken upstream latest tag blocks the app (issue #1414)" ) # A real version tag (date-based, e.g. 2026.5.31-7159b8aed), not a moving ref. assert re.match(r"\d{4}\.\d", tag), f"expected a versioned tag, got {tag!r}"