From d1d047dd11de899b4d2119d8db9cb412b30e9efa Mon Sep 17 00:00:00 2001 From: Alexandre Teixeira <111787685+alteixeira20@users.noreply.github.com> Date: Tue, 2 Jun 2026 04:24:18 +0100 Subject: [PATCH] Add Ollama port path detection regressions (#883) --- tests/test_ollama_port_detection.py | 104 ++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 tests/test_ollama_port_detection.py diff --git a/tests/test_ollama_port_detection.py b/tests/test_ollama_port_detection.py new file mode 100644 index 0000000..4950df5 --- /dev/null +++ b/tests/test_ollama_port_detection.py @@ -0,0 +1,104 @@ +"""Pin path-aware Ollama detection for URLs on port 11434. + +Port 11434 is Ollama's default, but it is not Ollama-exclusive. +LM Studio, vLLM, and other OpenAI-compatible servers commonly run on the same +port. A URL on port 11434 with a /v1 path must remain OpenAI-compatible; +only explicit /api or /api/... paths (and ollama.com) are native Ollama. +""" +import pytest + +from src import llm_core, endpoint_resolver +from src.endpoint_resolver import build_chat_url + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +@pytest.fixture(autouse=True) +def _stub_dns(monkeypatch): + """Stub out resolve_url so tests are offline and deterministic.""" + monkeypatch.setattr(endpoint_resolver, "resolve_url", lambda u: u) + + +# --------------------------------------------------------------------------- +# _is_ollama_native_url: /v1 on port 11434 is NOT native Ollama +# --------------------------------------------------------------------------- + +class TestIsOllamaNativeUrlRejectsV1Paths: + """Port alone is not enough — /v1 paths are OpenAI-compatible.""" + + def test_localhost_v1(self): + assert not llm_core._is_ollama_native_url("http://localhost:11434/v1") + + def test_localhost_v1_trailing_slash(self): + assert not llm_core._is_ollama_native_url("http://localhost:11434/v1/") + + def test_localhost_v1_chat_completions(self): + assert not llm_core._is_ollama_native_url("http://localhost:11434/v1/chat/completions") + + def test_loopback_ip_v1(self): + assert not llm_core._is_ollama_native_url("http://127.0.0.1:11434/v1") + + def test_named_host_v1(self): + assert not llm_core._is_ollama_native_url("http://ollama:11434/v1") + + def test_lan_ip_v1(self): + assert not llm_core._is_ollama_native_url("http://192.168.1.100:11434/v1") + + def test_lan_ip_v1_chat_completions(self): + assert not llm_core._is_ollama_native_url("http://192.168.1.100:11434/v1/chat/completions") + + +# --------------------------------------------------------------------------- +# _is_ollama_native_url: /api paths and ollama.com ARE native Ollama +# --------------------------------------------------------------------------- + +class TestIsOllamaNativeUrlAcceptsNativePaths: + def test_localhost_api(self): + assert llm_core._is_ollama_native_url("http://localhost:11434/api") + + def test_localhost_api_trailing_slash(self): + assert llm_core._is_ollama_native_url("http://localhost:11434/api/") + + def test_localhost_api_chat(self): + assert llm_core._is_ollama_native_url("http://localhost:11434/api/chat") + + def test_localhost_api_generate(self): + assert llm_core._is_ollama_native_url("http://localhost:11434/api/generate") + + def test_ollama_com(self): + assert llm_core._is_ollama_native_url("https://ollama.com") + + def test_ollama_com_api(self): + assert llm_core._is_ollama_native_url("https://ollama.com/api") + + +# --------------------------------------------------------------------------- +# build_chat_url: port 11434 + /v1 → OpenAI-compatible /chat/completions +# --------------------------------------------------------------------------- + +class TestBuildChatUrlPort11434V1IsOpenAICompat: + def test_localhost_v1(self): + assert build_chat_url("http://localhost:11434/v1") == "http://localhost:11434/v1/chat/completions" + + def test_loopback_ip_v1(self): + assert build_chat_url("http://127.0.0.1:11434/v1") == "http://127.0.0.1:11434/v1/chat/completions" + + def test_lan_ip_v1(self): + assert build_chat_url("http://192.168.1.100:11434/v1") == "http://192.168.1.100:11434/v1/chat/completions" + + +# --------------------------------------------------------------------------- +# build_chat_url: native Ollama /api → /api/chat +# --------------------------------------------------------------------------- + +class TestBuildChatUrlNativeOllamaRoutesToApiChat: + def test_localhost_api(self): + assert build_chat_url("http://localhost:11434/api") == "http://localhost:11434/api/chat" + + def test_ollama_com(self): + assert build_chat_url("https://ollama.com") == "https://ollama.com/api/chat" + + def test_ollama_com_api(self): + assert build_chat_url("https://ollama.com/api") == "https://ollama.com/api/chat"