summaryrefslogtreecommitdiffhomepage
path: root/packages/sdk/python/tests/test_integration.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/sdk/python/tests/test_integration.py')
-rw-r--r--packages/sdk/python/tests/test_integration.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/packages/sdk/python/tests/test_integration.py b/packages/sdk/python/tests/test_integration.py
new file mode 100644
index 000000000..cbb6c3999
--- /dev/null
+++ b/packages/sdk/python/tests/test_integration.py
@@ -0,0 +1,93 @@
+import os
+import re
+import signal
+import subprocess
+import sys
+import time
+from pathlib import Path
+
+import httpx
+import pytest
+
+from opencode_ai import OpenCodeClient
+
+
+def test_integration_live_server_endpoints() -> None:
+ # Locate repo root by finding sst.config.ts upwards from this file
+ here = Path(__file__).resolve()
+ p = here
+ repo_root = None
+ for _ in range(8):
+ if (p / "sst.config.ts").exists():
+ repo_root = p
+ break
+ if p.parent == p:
+ break
+ p = p.parent
+ assert repo_root is not None, "Could not locate repo root (sst.config.ts)"
+
+ # Start opencode headless server on a random port
+ pkg_opencode = repo_root / "packages" / "opencode"
+ cmd = [
+ "bun",
+ "run",
+ "--conditions=development",
+ "./src/index.ts",
+ "serve",
+ "--port",
+ "0",
+ "--hostname",
+ "127.0.0.1",
+ ]
+
+ proc = subprocess.Popen(
+ cmd,
+ cwd=str(pkg_opencode),
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ text=True,
+ bufsize=1,
+ universal_newlines=True,
+ )
+
+ url = None
+ start = time.time()
+ assert proc.stdout is not None
+ while time.time() - start < 15:
+ line = proc.stdout.readline()
+ if not line:
+ time.sleep(0.05)
+ if proc.poll() is not None:
+ break
+ continue
+ m = re.search(r"opencode server listening on (http://[^\s]+)", line)
+ if m:
+ url = m.group(1)
+ break
+ assert url, "Server did not report listening URL"
+
+ try:
+ client = OpenCodeClient(base_url=url)
+ # Basic endpoints (avoid complex config model parsing issues)
+ pinfo = client.get_path()
+ assert pinfo is not None
+ projects = client.list_projects()
+ assert projects is not None
+
+ # SSE: should get the initial server.connected event
+ it = client.subscribe_events()
+ evt = next(it)
+ assert isinstance(evt, dict)
+ assert evt.get("type") == "server.connected"
+ finally:
+ # Cleanup server process
+ try:
+ if proc.poll() is None:
+ proc.terminate()
+ try:
+ proc.wait(timeout=5)
+ except subprocess.TimeoutExpired:
+ proc.kill()
+ except Exception:
+ pass