Spaces:
Running
Running
File size: 3,915 Bytes
a8c9ee8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | import os
import uuid
import httpx
import pytest
BASE_URL = os.getenv("E2E_BASE_URL", "http://127.0.0.1:8000").rstrip("/")
AGENT_ID = os.getenv("E2E_AGENT_ID", "sirus-sql-agent")
JWT = os.getenv("E2E_SUPABASE_JWT")
TENANT_ID = os.getenv("E2E_TENANT_ID")
SOURCE_NAME = os.getenv("E2E_SOURCE_NAME")
def _required_env_missing() -> list[str]:
missing = []
if not JWT:
missing.append("E2E_SUPABASE_JWT")
if not TENANT_ID:
missing.append("E2E_TENANT_ID")
if not SOURCE_NAME:
missing.append("E2E_SOURCE_NAME")
return missing
@pytest.mark.e2e
def test_agent_endpoints_e2e_httpx_only():
missing = _required_env_missing()
if missing:
pytest.skip(f"Missing required env vars for e2e test: {', '.join(missing)}")
headers = {
"Authorization": f"Bearer {JWT}",
"Content-Type": "application/json",
}
session_id = None
with httpx.Client(base_url=BASE_URL, timeout=60.0) as client:
run_payload = {
"message": "Reply with a very short confirmation that you are connected.",
"supabase_jwt": JWT,
"tenant_id": TENANT_ID,
"source_name": SOURCE_NAME,
"available_sources": [SOURCE_NAME],
"stream": False,
"user_id": TENANT_ID,
}
run_resp = client.post(f"/tenant-run/{AGENT_ID}", headers=headers, json=run_payload)
assert run_resp.status_code == 200, f"tenant-run failed: {run_resp.status_code} {run_resp.text}"
run_body = run_resp.json()
session_id = run_body.get("session_id")
assert session_id, f"session_id missing in tenant-run response: {run_body}"
list_resp = client.get(f"/chats/{TENANT_ID}", headers={"Authorization": f"Bearer {JWT}"})
assert list_resp.status_code == 200, f"list chats failed: {list_resp.status_code} {list_resp.text}"
list_body = list_resp.json()
sessions = list_body.get("sessions", [])
assert isinstance(sessions, list), f"sessions should be list, got: {type(sessions)}"
assert any((s.get("session_id") or s.get("id")) == session_id for s in sessions), (
f"created session {session_id} not found in session list"
)
get_resp = client.get(f"/chats/{TENANT_ID}/{session_id}", headers={"Authorization": f"Bearer {JWT}"})
assert get_resp.status_code == 200, f"get chat failed: {get_resp.status_code} {get_resp.text}"
get_body = get_resp.json()
assert "messages" in get_body, f"messages missing in get chat response: {get_body}"
rename_resp = client.post(
f"/chats/{session_id}/rename",
headers=headers,
json={"name": f"e2e-{uuid.uuid4().hex[:8]}"},
)
assert rename_resp.status_code == 200, f"rename failed: {rename_resp.status_code} {rename_resp.text}"
assert rename_resp.json().get("status") == "renamed"
cancel_resp = client.post(
f"/chats/{session_id}/cancel/{uuid.uuid4().hex}",
headers={"Authorization": f"Bearer {JWT}"},
)
assert cancel_resp.status_code == 200, f"cancel failed: {cancel_resp.status_code} {cancel_resp.text}"
cancel_body = cancel_resp.json()
assert "cancelled" in cancel_body, f"cancelled field missing: {cancel_body}"
delete_resp = client.delete(f"/chats/{session_id}", headers={"Authorization": f"Bearer {JWT}"})
assert delete_resp.status_code == 200, f"delete failed: {delete_resp.status_code} {delete_resp.text}"
assert delete_resp.json().get("status") == "deleted"
get_after_delete = client.get(
f"/chats/{TENANT_ID}/{session_id}",
headers={"Authorization": f"Bearer {JWT}"},
)
assert get_after_delete.status_code == 404, (
f"expected 404 after delete, got {get_after_delete.status_code} {get_after_delete.text}"
)
|