feat: OpenClaw WebSocket integration with workspace file preview
- Migrate OpenClaw from HTTP (port 8004) to WebSocket (port 18789) - Add workspace file list and content preview handlers - Add OpenClawStatus component with agent/skills view - Add OpenClawView panel in trader interface - Add Zustand store for OpenClaw state management - Fix gateway logging noise (yfinance, websockets) - Fix RunWorkspaceManager.get_agent_asset_dir attribute error - Handle missing workspace files gracefully in preview Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
60
backend/tests/test_openclaw_cli_service.py
Normal file
60
backend/tests/test_openclaw_cli_service.py
Normal file
@@ -0,0 +1,60 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Tests for the OpenClaw CLI service wrapper."""
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from backend.services.openclaw_cli import OpenClawCliError, OpenClawCliService
|
||||
|
||||
|
||||
class _Completed:
|
||||
def __init__(self, *, returncode=0, stdout="", stderr=""):
|
||||
self.returncode = returncode
|
||||
self.stdout = stdout
|
||||
self.stderr = stderr
|
||||
|
||||
|
||||
def test_openclaw_cli_service_runs_json_command(monkeypatch, tmp_path):
|
||||
captured = {}
|
||||
|
||||
def _fake_run(command, **kwargs):
|
||||
captured["command"] = command
|
||||
captured["cwd"] = kwargs["cwd"]
|
||||
return _Completed(stdout='{"sessions":[{"key":"main/session-1"}]}')
|
||||
|
||||
monkeypatch.setattr("backend.services.openclaw_cli.subprocess.run", _fake_run)
|
||||
|
||||
service = OpenClawCliService(base_command=["openclaw"], cwd=tmp_path, timeout_seconds=3)
|
||||
payload = service.list_sessions()
|
||||
|
||||
assert payload["sessions"][0]["key"] == "main/session-1"
|
||||
assert captured["command"] == ["openclaw", "sessions", "--json"]
|
||||
assert captured["cwd"] == tmp_path
|
||||
|
||||
|
||||
def test_openclaw_cli_service_raises_on_failure(monkeypatch, tmp_path):
|
||||
def _fake_run(command, **kwargs):
|
||||
return _Completed(returncode=7, stdout="", stderr="boom")
|
||||
|
||||
monkeypatch.setattr("backend.services.openclaw_cli.subprocess.run", _fake_run)
|
||||
|
||||
service = OpenClawCliService(base_command=["openclaw"], cwd=tmp_path, timeout_seconds=3)
|
||||
|
||||
with pytest.raises(OpenClawCliError) as exc_info:
|
||||
service.list_cron_jobs()
|
||||
|
||||
assert exc_info.value.exit_code == 7
|
||||
assert exc_info.value.stderr == "boom"
|
||||
|
||||
|
||||
def test_openclaw_cli_service_can_extract_single_session(monkeypatch, tmp_path):
|
||||
def _fake_run(command, **kwargs):
|
||||
return _Completed(stdout='{"sessions":[{"key":"main/session-1","agentId":"main"}]}')
|
||||
|
||||
monkeypatch.setattr("backend.services.openclaw_cli.subprocess.run", _fake_run)
|
||||
|
||||
service = OpenClawCliService(base_command=["openclaw"], cwd=tmp_path, timeout_seconds=3)
|
||||
session = service.get_session("main/session-1")
|
||||
|
||||
assert session["agentId"] == "main"
|
||||
Reference in New Issue
Block a user