fix: support photo client tool in debug preview
This commit is contained in:
@@ -1,16 +1,87 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import base64
|
||||
import json
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
from fastapi import HTTPException
|
||||
from routes import voice_webrtc
|
||||
from starlette.requests import Request
|
||||
|
||||
|
||||
class FakeConnection:
|
||||
pc_id = "pc_test"
|
||||
|
||||
|
||||
def encoded_header_json(value: object) -> str:
|
||||
payload = json.dumps(value).encode("utf-8")
|
||||
return base64.urlsafe_b64encode(payload).decode("ascii").rstrip("=")
|
||||
|
||||
|
||||
def offer_request(*, client_tools: object | None = None) -> Request:
|
||||
headers = []
|
||||
if client_tools is not None:
|
||||
headers.append(
|
||||
(
|
||||
b"x-pipecat-client-tools",
|
||||
encoded_header_json(client_tools).encode("ascii"),
|
||||
)
|
||||
)
|
||||
return Request({"type": "http", "method": "POST", "headers": headers})
|
||||
|
||||
|
||||
class WebRTCOfferMetadataTest(unittest.IsolatedAsyncioTestCase):
|
||||
async def test_client_tool_header_survives_request_endpoint_body_replacement(self):
|
||||
request = offer_request(
|
||||
client_tools=["set_photo_button_visible", "show_message"]
|
||||
)
|
||||
payload = {"sdp": "offer", "type": "offer"}
|
||||
|
||||
with patch.object(
|
||||
voice_webrtc,
|
||||
"_handle_offer_payload",
|
||||
new=AsyncMock(return_value={"type": "answer"}),
|
||||
) as handle_offer:
|
||||
await voice_webrtc.http_offer(request, payload)
|
||||
|
||||
forwarded = handle_offer.await_args.args[0]
|
||||
self.assertEqual(
|
||||
forwarded["client_tool_names"],
|
||||
["set_photo_button_visible", "show_message"],
|
||||
)
|
||||
|
||||
async def test_client_tool_request_data_remains_a_compatibility_fallback(self):
|
||||
request = offer_request()
|
||||
payload = {
|
||||
"sdp": "offer",
|
||||
"type": "offer",
|
||||
"requestData": {"client_tool_names": ["show_message"]},
|
||||
}
|
||||
|
||||
with patch.object(
|
||||
voice_webrtc,
|
||||
"_handle_offer_payload",
|
||||
new=AsyncMock(return_value={"type": "answer"}),
|
||||
) as handle_offer:
|
||||
await voice_webrtc.http_offer(request, payload)
|
||||
|
||||
forwarded = handle_offer.await_args.args[0]
|
||||
self.assertEqual(forwarded["client_tool_names"], ["show_message"])
|
||||
|
||||
async def test_invalid_client_tool_header_is_rejected(self):
|
||||
request = offer_request(client_tools={"name": "show_message"})
|
||||
|
||||
with self.assertRaises(HTTPException) as raised:
|
||||
await voice_webrtc.http_offer(
|
||||
request,
|
||||
{"sdp": "offer", "type": "offer"},
|
||||
)
|
||||
|
||||
self.assertEqual(raised.exception.status_code, 400)
|
||||
|
||||
|
||||
class WebRTCPipelineLifecycleTest(unittest.IsolatedAsyncioTestCase):
|
||||
async def asyncTearDown(self):
|
||||
tasks = list(voice_webrtc._pipeline_tasks)
|
||||
|
||||
Reference in New Issue
Block a user