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}"
        )