import pytest import subprocess import json import time import sys import os def test_server_starts_and_exits_cleanly(): proc = subprocess.Popen( [sys.executable, "-m", "src.ai_server"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) proc.stdin.close() proc.stdout.close() proc.stderr.close() proc.wait(timeout=5) assert proc.returncode in (0, 120) def test_server_outputs_ready_marker(): proc = subprocess.Popen( [sys.executable, "-m", "src.ai_server"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) line = proc.stdout.readline() proc.stdin.close() proc.stdout.close() proc.wait(timeout=5) data = json.loads(line) assert data.get("type") == "ready" def test_server_handles_unknown_method(): proc = subprocess.Popen( [sys.executable, "-m", "src.ai_server"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) proc.stdout.readline() cmd = json.dumps({"id": "1", "method": "unknown_method", "params": {}}) proc.stdin.write(cmd + "\n") proc.stdin.flush() resp = proc.stdout.readline() proc.stdin.close() proc.stdout.close() proc.wait(timeout=5) data = json.loads(resp) assert "error" in data assert "Unknown method" in data["error"] def test_server_handles_list_models(): proc = subprocess.Popen( [sys.executable, "-m", "src.ai_server"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) proc.stdout.readline() cmd = json.dumps({"id": "1", "method": "list_models", "params": {"provider": "gemini"}}) proc.stdin.write(cmd + "\n") proc.stdin.flush() resp = proc.stdout.readline() proc.stdin.close() proc.stdout.close() proc.wait(timeout=5) data = json.loads(resp) assert "result" in data assert "models" in data["result"] def test_server_loads_google_genai_quickly(): proc = subprocess.Popen( [sys.executable, "-m", "src.ai_server"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) start = time.time() ready_line = proc.stdout.readline() elapsed = time.time() - start proc.stdin.close() proc.stdout.close() proc.wait(timeout=10) assert elapsed < 5, f"Server took {elapsed}s to start" assert proc.returncode == 0