# -*- coding: utf-8 -*- """Integration tests for console routes (no LLM / no external API keys).""" from __future__ import annotations import io import uuid import pytest from helpers import default_http_timeout _CONSOLE_HTTP_TIMEOUT = default_http_timeout(30.0) @pytest.mark.integration @pytest.mark.p0 def test_agent_scoped_console_chat_stop_no_running_task(app_server) -> None: """Test purpose: - Verify scoped console chat/stop returns a stable JSON contract when no stream is attached for the given chat id (no model call). Test flow: 1. Create a dedicated test agent. 2. POST /console/chat/stop with a random UUID chat_id. 3. Assert 200 and ``stopped`` is a boolean (typically False). 4. Delete test agent. API endpoints: - POST /api/agents - POST /api/agents/{agentId}/console/chat/stop - DELETE /api/agents/{agentId} """ agent_id = "integ_console_stop_01" fake_chat_id = str(uuid.uuid4()) create_agent = app_server.api_request( "POST", "/api/agents", json={"id": agent_id, "name": "Console stop agent", "description": ""}, ) assert create_agent.status_code == 201, app_server.logs_tail() try: stop_url = ( f"{app_server.base_url}/api/agents/{agent_id}/console/chat/stop" f"?chat_id={fake_chat_id}" ) resp = app_server.client.post(stop_url, timeout=_CONSOLE_HTTP_TIMEOUT) print( ( f"[integration]" f"[{'PASS' if resp.status_code == 200 else 'FAIL'}] " f"POST /api/agents/{agent_id}/console/chat/stop | " f"params=chat_id={fake_chat_id} | request=- | " f"status={resp.status_code} | response={resp.text[:500]}" ), flush=True, ) assert resp.status_code == 200, app_server.logs_tail() body = resp.json() assert isinstance(body.get("stopped"), bool) finally: app_server.api_request("DELETE", f"/api/agents/{agent_id}") @pytest.mark.integration @pytest.mark.p0 def test_agent_scoped_console_upload_small_file(app_server) -> None: """Test purpose: - Verify scoped console upload accepts a small file and returns metadata without calling external services. Test flow: 1. Create a dedicated test agent. 2. POST multipart upload to scoped console upload with tiny text content. 3. Assert JSON includes file_name and expected byte size. 4. Delete test agent. API endpoints: - POST /api/agents - POST /api/agents/{agentId}/console/upload - DELETE /api/agents/{agentId} """ agent_id = "integ_console_upload_01" payload = b"integration-console-upload\n" create_agent = app_server.api_request( "POST", "/api/agents", json={ "id": agent_id, "name": "Console upload agent", "description": "", }, ) assert create_agent.status_code == 201, app_server.logs_tail() try: upload_url = ( f"{app_server.base_url}/api/agents/{agent_id}/console/upload" ) files = { "file": ("integ-upload.txt", io.BytesIO(payload), "text/plain"), } resp = app_server.client.post( upload_url, files=files, timeout=_CONSOLE_HTTP_TIMEOUT, ) print( ( f"[integration]" f"[{'PASS' if resp.status_code == 200 else 'FAIL'}] " f"POST /api/agents/{agent_id}/console/upload | " f"params=- | request=(multipart file) | " f"status={resp.status_code} | response={resp.text[:800]}" ), flush=True, ) assert resp.status_code == 200, app_server.logs_tail() body = resp.json() assert body.get("file_name") == "integ-upload.txt" assert body.get("size") == len(payload) assert "url" in body finally: app_server.api_request("DELETE", f"/api/agents/{agent_id}")