Some checks failed
Forge CI / smoke-and-build (pull_request) Failing after 1m22s
When a cron job runs on a cloud endpoint but its prompt references local services (Ollama, localhost, etc.), inject a [SYSTEM NOTE] warning so the agent reports the limitation instead of wasting iterations on doomed connections. Fixes #378, Closes #456. ## Changes - cron/scheduler.py: Added import re, _LOCAL_SERVICE_PATTERNS (12 patterns), _detect_local_service_refs(), _inject_cloud_context(). Injection in run_job() after cloud endpoint detection. - tests/cron/test_cron_cloud_context.py: 19 tests ## Detection patterns localhost:PORT, 127.x.x.x:PORT, 0.0.0.0:PORT, ollama, curl localhost, wget localhost, http://localhost, https://127.x, check ollama, connect local, hermes gateway local Closes #468.
121 lines
4.2 KiB
Python
121 lines
4.2 KiB
Python
"""Tests for cron cloud context warning injection (fix #378, #456).
|
|
|
|
When a cron job runs on a cloud endpoint but its prompt references local
|
|
services (Ollama, localhost, etc.), inject a warning so the agent reports
|
|
the limitation instead of wasting iterations on doomed connections.
|
|
"""
|
|
|
|
import pytest
|
|
|
|
from cron.scheduler import (
|
|
_detect_local_service_refs,
|
|
_inject_cloud_context,
|
|
_LOCAL_SERVICE_PATTERNS,
|
|
)
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Pattern detection
|
|
# ---------------------------------------------------------------------------
|
|
|
|
class TestDetectLocalServiceRefs:
|
|
def test_localhost_with_port(self):
|
|
refs = _detect_local_service_refs("Check http://localhost:8080/status")
|
|
assert len(refs) > 0
|
|
assert any("localhost" in r for r in refs)
|
|
|
|
def test_127_address(self):
|
|
refs = _detect_local_service_refs("Connect to 127.0.0.1:11434")
|
|
assert len(refs) > 0
|
|
|
|
def test_ollama_reference(self):
|
|
refs = _detect_local_service_refs("Run this on Ollama with gemma3")
|
|
assert len(refs) > 0
|
|
assert any("ollama" in r.lower() for r in refs)
|
|
|
|
def test_curl_localhost(self):
|
|
refs = _detect_local_service_refs("curl localhost:3000/api/data")
|
|
assert len(refs) > 0
|
|
|
|
def test_wget_localhost(self):
|
|
refs = _detect_local_service_refs("wget http://localhost/file.txt")
|
|
assert len(refs) > 0
|
|
|
|
def test_http_localhost(self):
|
|
refs = _detect_local_service_refs("http://localhost:8642/health")
|
|
assert len(refs) > 0
|
|
|
|
def test_https_127(self):
|
|
refs = _detect_local_service_refs("https://127.0.0.1:443/secure")
|
|
assert len(refs) > 0
|
|
|
|
def test_0000_address(self):
|
|
refs = _detect_local_service_refs("Bind to 0.0.0.0:9090")
|
|
assert len(refs) > 0
|
|
|
|
def test_no_match_for_remote(self):
|
|
refs = _detect_local_service_refs("Check https://api.openai.com/v1/models")
|
|
assert len(refs) == 0
|
|
|
|
def test_no_match_for_gitea(self):
|
|
refs = _detect_local_service_refs("Query forge.alexanderwhitestone.com for issues")
|
|
assert len(refs) == 0
|
|
|
|
def test_no_match_empty(self):
|
|
refs = _detect_local_service_refs("")
|
|
assert len(refs) == 0
|
|
|
|
def test_check_ollama_phrase(self):
|
|
refs = _detect_local_service_refs("First check Ollama is running")
|
|
assert len(refs) > 0
|
|
|
|
def test_connect_local_phrase(self):
|
|
refs = _detect_local_service_refs("Connect to local Ollama server")
|
|
assert len(refs) > 0
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Warning injection
|
|
# ---------------------------------------------------------------------------
|
|
|
|
class TestInjectCloudContext:
|
|
def test_prepends_warning(self):
|
|
original = "Run a health check on localhost:8080"
|
|
refs = _detect_local_service_refs(original)
|
|
result = _inject_cloud_context(original, refs)
|
|
assert "SYSTEM NOTE" in result
|
|
assert "cloud endpoint" in result
|
|
assert original in result
|
|
|
|
def test_warning_is_first(self):
|
|
original = "Check localhost:11434"
|
|
refs = _detect_local_service_refs(original)
|
|
result = _inject_cloud_context(original, refs)
|
|
assert result.startswith("[SYSTEM NOTE")
|
|
|
|
def test_preserves_original_prompt(self):
|
|
original = "Do something with Ollama and then report results"
|
|
refs = _detect_local_service_refs(original)
|
|
result = _inject_cloud_context(original, refs)
|
|
assert "Do something with Ollama" in result
|
|
|
|
def test_mentions_cannot_reach(self):
|
|
original = "curl localhost:8080"
|
|
refs = _detect_local_service_refs(original)
|
|
result = _inject_cloud_context(original, refs)
|
|
assert "cannot reach" in result.lower() or "cannot" in result.lower()
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Pattern coverage
|
|
# ---------------------------------------------------------------------------
|
|
|
|
class TestPatternCoverage:
|
|
def test_at_least_10_patterns(self):
|
|
assert len(_LOCAL_SERVICE_PATTERNS) >= 10
|
|
|
|
def test_patterns_are_strings(self):
|
|
for p in _LOCAL_SERVICE_PATTERNS:
|
|
assert isinstance(p, str)
|
|
assert len(p) > 0
|