mirror of
https://github.com/hansjone/oclaw.git
synced 2026-10-09 03:13:19 +08:00
- Rename platform/ to svc/ to avoid shadowing stdlib platform. - Replace from oclaw.* with from svc/runtime/interfaces; update -m CLI paths. - tests/conftest: prepend repo root to sys.path (no parent-folder package name). - CI: paths and offline_eval script under repo root. - Ops scripts: PYTHONPATH must be repo root for python -m runtime.* (fixes gateway/WhatsApp sidecar startup). - Fix default oclaw.json path in tabular/file attachment limits; stabilize attachment test config. Co-authored-by: Cursor <cursoragent@cursor.com>
81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from runtime.tools.public.bailian_webparser_tool import bailian_webparser_tool
|
|
|
|
|
|
class _SseResp:
|
|
def __init__(self, lines: list[str]):
|
|
self._lines = [x.encode("utf-8") for x in lines]
|
|
|
|
def readline(self) -> bytes:
|
|
if not self._lines:
|
|
return b""
|
|
return self._lines.pop(0)
|
|
|
|
def __enter__(self):
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc, tb):
|
|
return False
|
|
|
|
|
|
class _PostResp:
|
|
def __enter__(self):
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc, tb):
|
|
return False
|
|
|
|
|
|
def test_bailian_webparser_sse_flow(monkeypatch) -> None:
|
|
sse_lines = [
|
|
"event:endpoint\n",
|
|
"data:/api/v1/mcps/WebParser/message?sessionId=abc\n",
|
|
"\n",
|
|
"event:message\n",
|
|
'data:{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{"listChanged":true}},"serverInfo":{"name":"x","version":"1"}}}\n',
|
|
"\n",
|
|
"event:message\n",
|
|
'data:{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"webparser","description":"d","inputSchema":{"type":"object"}}]}}\n',
|
|
"\n",
|
|
"event:message\n",
|
|
'data:{"jsonrpc":"2.0","id":3,"result":{"content":[{"type":"text","text":"parsed ok"}]}}\n',
|
|
"\n",
|
|
]
|
|
|
|
def _fake_open(req, timeout=0): # noqa: ARG001
|
|
method = str(getattr(req, "method", "") or "GET").upper()
|
|
url = str(getattr(req, "full_url", "") or "")
|
|
if method == "GET" and url.endswith("/WebParser/sse"):
|
|
return _SseResp(sse_lines)
|
|
if method == "POST" and "/message?sessionId=abc" in url:
|
|
# Ensure request is valid JSON-RPC object.
|
|
raw = getattr(req, "data", b"") or b""
|
|
_ = json.loads(raw.decode("utf-8"))
|
|
return _PostResp()
|
|
raise AssertionError(f"unexpected request method={method} url={url}")
|
|
|
|
monkeypatch.setenv("DASHSCOPE_API_KEY", "sk-test")
|
|
monkeypatch.setattr("urllib.request.urlopen", _fake_open)
|
|
|
|
out = bailian_webparser_tool().handler({"url": "https://example.com/x"})
|
|
assert out.get("ok") is True, out
|
|
assert out.get("tool_name") == "webparser"
|
|
assert "parsed ok" in str(out.get("text") or "")
|
|
|
|
|
|
def test_bailian_webparser_requires_key(monkeypatch) -> None:
|
|
monkeypatch.delenv("DASHSCOPE_API_KEY", raising=False)
|
|
out = bailian_webparser_tool().handler({"url": "https://example.com/x"})
|
|
assert out.get("ok") is False
|
|
assert out.get("error_code") == "api_key_missing"
|
|
|
|
|
|
def test_bailian_webparser_missing_url_hint() -> None:
|
|
out = bailian_webparser_tool().handler({})
|
|
assert out.get("ok") is False
|
|
assert out.get("error_code") == "url_required"
|
|
assert "https://example.com/article" in str(out.get("error") or "")
|
|
|