101 lines
3.4 KiB
Python
101 lines
3.4 KiB
Python
"""Regression tests for the canonical services.search provider implementation.
|
|
|
|
The old src.search provider path aliases this module; these tests pin the
|
|
behavior at the single implementation point.
|
|
"""
|
|
|
|
import sys
|
|
|
|
from services.search import providers
|
|
|
|
|
|
def test_service_safesearch_values_match_provider_contract(monkeypatch):
|
|
monkeypatch.setattr(providers, "_get_search_settings", lambda: {"search_safesearch": "strict"})
|
|
assert providers._safesearch_for("searxng") == "2"
|
|
assert providers._safesearch_for("brave") == "strict"
|
|
assert providers._safesearch_for("duckduckgo_lib") == "on"
|
|
assert providers._safesearch_for("duckduckgo_html") == "1"
|
|
assert providers._safesearch_for("google_pse") == "active"
|
|
assert providers._safesearch_for("serper") == "active"
|
|
|
|
monkeypatch.setattr(providers, "_get_search_settings", lambda: {"search_safesearch": "off"})
|
|
assert providers._safesearch_for("searxng") == "0"
|
|
assert providers._safesearch_for("brave") == "off"
|
|
assert providers._safesearch_for("duckduckgo_lib") == "off"
|
|
assert providers._safesearch_for("duckduckgo_html") == "-2"
|
|
assert providers._safesearch_for("google_pse") is None
|
|
assert providers._safesearch_for("serper") is None
|
|
|
|
|
|
def test_service_searxng_json_sends_safesearch(monkeypatch):
|
|
seen = {}
|
|
|
|
class _Response:
|
|
def raise_for_status(self):
|
|
return None
|
|
|
|
def json(self):
|
|
return {
|
|
"results": [
|
|
{"title": "Result", "url": "https://example.com", "content": "Snippet"}
|
|
]
|
|
}
|
|
|
|
def fake_get(url, **kwargs):
|
|
seen["url"] = url
|
|
seen["params"] = kwargs["params"]
|
|
return _Response()
|
|
|
|
monkeypatch.setattr(providers, "_get_search_instance", lambda: "http://searx.test")
|
|
monkeypatch.setattr(providers, "_get_search_settings", lambda: {"search_safesearch": "moderate"})
|
|
monkeypatch.setattr(providers.httpx, "get", fake_get)
|
|
|
|
results = providers.searxng_search_api("odysseus", count=1)
|
|
|
|
assert results
|
|
assert seen["url"] == "http://searx.test/search"
|
|
assert seen["params"]["safesearch"] == "1"
|
|
|
|
|
|
def test_service_ddg_redirect_ignores_lookalike_hosts():
|
|
for host in ("duckduckgo.com.evil.com", "notduckduckgo.com"):
|
|
url = f"https://{host}/l/?uddg=https%3A%2F%2Fexample.com"
|
|
assert providers._resolve_ddg_redirect(url) == url
|
|
|
|
assert providers._resolve_ddg_redirect(
|
|
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com"
|
|
) == "https://example.com"
|
|
|
|
|
|
def test_service_ddg_html_fallback_sends_safesearch(monkeypatch):
|
|
seen = {}
|
|
html = """
|
|
<html><body>
|
|
<div class="result">
|
|
<a class="result__a" href="https://notduckduckgo.com/l/?uddg=https%3A%2F%2Fevil.example">
|
|
Lookalike
|
|
</a>
|
|
<a class="result__snippet">Snippet</a>
|
|
</div>
|
|
</body></html>
|
|
"""
|
|
|
|
class _Response:
|
|
text = html
|
|
|
|
def raise_for_status(self):
|
|
return None
|
|
|
|
def fake_get(url, **kwargs):
|
|
seen["params"] = kwargs["params"]
|
|
return _Response()
|
|
|
|
monkeypatch.setitem(sys.modules, "duckduckgo_search", None)
|
|
monkeypatch.setattr(providers, "_get_search_settings", lambda: {"search_safesearch": "off"})
|
|
monkeypatch.setattr(providers.httpx, "get", fake_get)
|
|
|
|
results = providers.duckduckgo_search("odysseus", count=1)
|
|
|
|
assert seen["params"]["kp"] == "-2"
|
|
assert results[0]["url"].startswith("https://notduckduckgo.com/")
|