o
    i                      @   s   d Z ddlZddlZddlZddlZddlZddlmZ eddZeddZ	edd	Z
d
d Zdd Zdd Zdd Zdd Zdd ZedkrZee ZeerUdnd dS dS )z]
Test script for ElevenLabs ConvAI Server
Tests WebSocket connection, latency, STT, LLM, TTS
    N)datetime
SERVER_URLzhttp://localhost:8080WS_URLzws://localhost:8080ELEVENLABS_API_KEY c               
      sh  t d t d t d zt 4 I dH v} | t d4 I dH R}| I dH }t d|j  t d|  |dd	kr[t d
 	 W d  I dH  W d  I dH  W dS t d 	 W d  I dH  W d  I dH  W dS 1 I dH s{w   Y  W d  I dH  W dS 1 I dH sw   Y  W dS  ty } zt d|  W Y d}~dS d}~ww )zTest health check endpoint=
============================================================zTEST 1: Health Check<============================================================Nz/healthStatus: 
Response: statusoku   ✓ Health check PASSEDTu   ✗ Health check FAILEDFu   ✗ Health check FAILED: printaiohttpClientSessiongetr   jsonr   	Exceptionsessionresponsedatae r   M/var/www/html/vikas/2025-Nov-21-Voicebot/BackEnd/agent-starter-python/test.pytest_health_check   s4   
2r   c               
      sh  t d t d t d z
t 4 I dH } | t d4 I dH }| I dH }t d|j  t d|d  t d	|d
  t d|d  t d|d d |di }|rt d |di }t d|ddd t d|ddd t d|ddd t d|ddd |di }t d t d|ddd t d|ddd t d|ddd t d|ddd t d 	 W d  I dH  W d  I dH  W dS 1 I dH sw   Y  W d  I dH  W dS 1 I dH sw   Y  W dS  ty3 } zt d |  W Y d}~d!S d}~ww )"zTest metrics endpointr   zTEST 2: Metrics Endpointr   Nz/metricsr	   zActive Sessions: active_sessionszTotal Sessions: total_sessionszTotal Turns: total_turnszAvg Latency: average_end_to_end_latency_msmscost_breakdownz
Cost Breakdown:totalz  STT: $sttr   z.6fz  TTS: $ttsz  LLM: $llmz
  Total: $per_turn_averagez
Per Turn Average:u   
✓ Metrics check PASSEDTu   ✗ Metrics check FAILED: Fr   )r   r   r   r!   r"   per_turnr   r   r   r   test_metrics+   sL   4r(   c               
      s0  t d t d t d zpt 4 I dH Z} | t d4 I dH 6}| I dH }t d|j  t dtj|dd	  t d
 	 W d  I dH  W d  I dH  W dS 1 I dH s_w   Y  W d  I dH  W dS 1 I dH svw   Y  W dS  ty } zt d|  W Y d}~dS d}~ww )zTest LLM list endpointr   zTEST 3: LLM Listr   Nz	/llm/listr	   r
      indentu   
✓ LLM list check PASSEDTu   ✗ LLM list check FAILED: F)	r   r   r   r   r   r   r   dumpsr   r   r   r   r   test_llm_listR   s*   2r-   c               
      sh  t d t d t d g g g g d} zt 4 I dH }|t dI dH }d}t d|  t }|td	|d
I dH  d}d}|2 zp3 dH W }|j	tj
jkrt|j}|dd}	t | d }
t d|	 d|
dd d|	v sd|	v r| d |
 nd|	v sd|	v r| d |
 nd|	v sd|	v r| d |
 |d7 }||kr nqK|j	tj
jkr nqK6 | I dH  t d |  D ],\}}|rt|t| }t d|  d|ddt| d qt d|  d  qt d! 	 W d  I dH  W d"S 1 I dH sw   Y  W dS  ty3 } zt d#|  W Y d}~d$S d}~ww )%z4Test WebSocket conversation with latency measurementr   zTEST 4: WebSocket Conversationr   )r#   r%   r$   r"   Nz/ws/zHello, how are you?z	Sending: conversation_message)typemessager   
   r/   unknown  z
Received: z (z.0fzms)
transcriptr#   r%   modelaudior$      z
Latency Results:z  : zms (avg of z responses)z	: No datau"   
✓ WebSocket conversation PASSEDTu#   ✗ WebSocket conversation FAILED: F)r   r   r   
ws_connectr   timesend_strr   r,   r/   	WSMsgTypeTEXTloadsr   r   appendERRORcloseitemssumlenupperr   )	latenciesr   wstest_message
start_timeresponse_countmax_responsesmsgr   response_typeelapsedkeyvaluesavgr   r   r   r   test_websocket_conversatione   sp   (69rR   c               
      s@  t d t d t d zxt 4 I dH b} dddd}| jt d	|d
4 I dH 6}| I dH }t d|j  t dtj|dd  t d 	 W d  I dH  W d  I dH  W dS 1 I dH sgw   Y  W d  I dH  W dS 1 I dH s~w   Y  W dS  ty } zt d|  W Y d}~dS d}~ww )z#Test LLM usage calculation endpointr   zTEST 5: LLM Usage Calculater   Nr3   i  d   )character_counttts_character_countllm_token_countz/llm-usage/calculate)r   r	   r
   r)   r*   u!   
✓ LLM usage calculation PASSEDTu"   ✗ LLM usage calculation FAILED: F)	r   r   r   postr   r   r   r,   r   )r   
usage_datar   r   r   r   r   r   test_llm_usage_calculate   s:   2rY   c                     s>  t d t d t d t dt  t dt  t dt    g } | dt I dH f | d	t I dH f | d
t	 I dH f | dt
 I dH f | dt I dH f t d t d t d d}d}| D ]\}}|rydnd}t | d|  |r|d7 }qq|d7 }qqt d| d| d |dkS )zRun all testsr   z#ELEVENLABS CONVAI SERVER TEST SUITEr   zServer URL: zWebSocket URL: zTime: zHealth CheckNMetricszLLM ListzWebSocket ConversationzLLM Usage CalculatezTEST SUMMARYr   u
   ✓ PASSEDu
   ✗ FAILEDr8   r7   z
Total: z	 passed, z failed)r   r   r   r   now	isoformatr?   r   r(   r-   rR   rY   )resultspassedfailednameresultr   r   r   r   run_all_tests   s4   

rb   __main__r7   )__doc__asyncior   r:   r   osr   getenvr   r   r   r   r(   r-   rR   rY   rb   __name__runsuccessexitr   r   r   r   <module>   s(    'L'