| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- import json
- from typing import Iterator
- import httpx
- import pytest
- from opencode_ai import OpenCodeClient
- from opencode_ai.api.default import config_get
- from opencode_ai.client import Client
- class _State:
- def __init__(self):
- self.calls = 0
- def test_imports_and_methods_available() -> None:
- w = OpenCodeClient()
- assert hasattr(w, "list_sessions")
- assert hasattr(w, "get_config")
- assert hasattr(w, "list_agents")
- assert hasattr(w, "list_projects")
- assert hasattr(w, "current_project")
- assert hasattr(w, "file_status")
- assert hasattr(w, "get_path")
- assert hasattr(w, "subscribe_events")
- def test_get_path_with_mock_transport() -> None:
- # Arrange a mock transport for GET /path
- def handler(request: httpx.Request) -> httpx.Response:
- assert request.url.path == "/path"
- return httpx.Response(
- 200,
- json={
- "state": "ok",
- "config": "/tmp/config",
- "worktree": "/repo",
- "directory": "/repo/project",
- },
- )
- transport = httpx.MockTransport(handler)
- w = OpenCodeClient(base_url="http://test")
- client = httpx.Client(base_url="http://test", transport=transport)
- w.client.set_httpx_client(client)
- # Act
- result = w.get_path()
- # Assert
- assert result is not None
- assert result.directory == "/repo/project"
- def test_retry_on_request_error_then_success() -> None:
- state = _State()
- def handler(request: httpx.Request) -> httpx.Response:
- if state.calls == 0:
- state.calls += 1
- raise httpx.ConnectError("boom", request=request)
- return httpx.Response(
- 200,
- json={
- "state": "ok",
- "config": "/tmp/config",
- "worktree": "/repo",
- "directory": "/repo/project",
- },
- )
- transport = httpx.MockTransport(handler)
- w = OpenCodeClient(base_url="http://test", retries=1, backoff_factor=0)
- client = httpx.Client(base_url="http://test", transport=transport)
- w.client.set_httpx_client(client)
- result = w.get_path()
- assert result is not None
- assert result.directory == "/repo/project"
- def test_generated_config_get_via_mock() -> None:
- def handler(request: httpx.Request) -> httpx.Response:
- assert request.url.path == "/config"
- return httpx.Response(200, json={})
- transport = httpx.MockTransport(handler)
- c = Client(base_url="http://test")
- c.set_httpx_client(httpx.Client(base_url="http://test", transport=transport))
- assert config_get.sync(client=c) is not None
- def test_sse_streaming_parses_events() -> None:
- # Prepare a simple SSE payload with one event
- payload = b'data: {"type":"server.connected"}\n\n'
- def handler(request: httpx.Request) -> httpx.Response:
- assert request.url.path == "/event"
- return httpx.Response(
- 200,
- headers={"Content-Type": "text/event-stream"},
- content=payload,
- )
- transport = httpx.MockTransport(handler)
- w = OpenCodeClient(base_url="http://test")
- client = httpx.Client(base_url="http://test", transport=transport)
- w.client.set_httpx_client(client)
- it = w.subscribe_events()
- first = next(it)
- assert isinstance(first, dict)
- assert first.get("type") == "server.connected"
|