#!/usr/bin/env python3
"""Quick test of the API server endpoints."""
import json
import subprocess
import sys
import time
import urllib.request
import urllib.error
API = "http://127.0.0.1:14195/api"
def post(path, data):
req = urllib.request.Request(
f"{API}/{path}",
data=json.dumps(data).encode(),
headers={"Content-Type": "application/json"},
)
try:
with urllib.request.urlopen(req, timeout=5) as resp:
return json.loads(resp.read())
except urllib.error.HTTPError as e:
body = e.read().decode()
try:
return json.loads(body)
except Exception:
return {"error": f"HTTP {e.code}: {body[:200]}"}
except urllib.error.URLError as e:
return {"error": str(e)}
# Start server in background
print("Starting API server...")
srv = subprocess.Popen(
[sys.executable, "wallet-engine/api_server.py"],
cwd="/home/vincent/projects/btc-wallet",
env={**__import__("os").environ, "VIRTUAL_ENV": "/home/vincent/projects/btc-wallet/.venv"},
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
time.sleep(1.5)
try:
# Test 1: Generate seed
print("\n1. generate_seed:")
r = post("generate_seed", {"strength": 128})
print(f" seed: {r.get('seed', r.get('error', 'MISSING'))}")
# Test 2: Get block count
print("\n2. get_block_count:")
r = post("get_block_count", {})
print(f" block_count: {r.get('block_count', r.get('error', 'MISSING'))}")
# Test 3: Get network info
print("\n3. get_network_info:")
r = post("get_network_info", {})
if "error" in r:
print(f" error: {r['error']}")
else:
print(f" version: {r.get('version')}")
print(f" connections: {r.get('connections')}")
# Test 4: Create wallet
seed = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
print(f"\n4. create_wallet:")
r = post("create_wallet", {"seed": seed, "wallet_name": "Test", "password": ""})
if "error" in r:
print(f" error: {r['error']}")
else:
w = r.get("wallet", {})
print(f" name: {w.get('name')}")
print(f" fingerprint: {w.get('fingerprint')}")
print(f" addresses: {len(r.get('addresses', []))}")
if r.get("addresses"):
print(f" first addr: {r['addresses'][0].get('address')}")
# Test 5: Derive more addresses
print("\n5. derive_addresses:")
r = post("derive_addresses", {
"wallet": r.get("wallet", {}),
"count": 3,
"derivation_type": "bech32",
})
if "error" in r:
print(f" error: {r['error']}")
else:
print(f" addresses: {len(r.get('addresses', []))}")
finally:
srv.terminate()
srv.wait(timeout=3)
print("\nServer stopped.")