
    q[i+                     t   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 ddlZddlmZ ddlZdd	lmZ d
dlmZ d
dlmZ d
dlmZ d
d	lmZ d
dlmZ d
dlmZ d
dlmZ ddlmZ 	 ddlZdZej>                  jA                  ed      Z!d(dZ"ejF                  d        Z$d Z%d Z&e!d        Z'd Z(ej>                  jS                  dddg      ej>                  jT                  d               Z+ej>                  jS                  dddg      ej>                  jT                  d               Z,ej>                  jS                  dddg      ej>                  jT                  d                Z-ej>                  jS                  dddg      ej>                  jT                  d!               Z.ej>                  jS                  dddg      ej>                  jT                  d"               Z/ej>                  jS                  dddg      ej>                  jT                  d#               Z0ej>                  jS                  dddg      ej>                  jT                  d$               Z1ej>                  jS                  dddg      ej>                  jT                  d%               Z2ej>                  jS                  dddg      ej>                  jT                  d&               Z3ej>                  jS                  dddg      ej>                  jT                  d'               Z4y# e$ r dZ ej<                         ZY w xY w))zTests for live_music.py.    N)AsyncIterator)mock)	AsyncMock)Mock)patch)Credentials)client   )_api_client)_common)Client)live)
live_music)types   )pytest_helperFTz(aiohttp is not installed, skipping test.)reasonc                 .   t        j                  t        j                        }| sd|_        d |_        d |_        nd |_        d|_        d|_        d |_        ||_        t        j                  j                  di i      |_        | |_        ||_        |S )NspecTEST_API_KEYzus-central1test_projectc                       y)N	test_host r       `/mnt/data/GridWatch/venv/lib/python3.12/site-packages/google/genai/tests/live/test_live_music.py<lambda>z!mock_api_client.<locals>.<lambda>?   s    r   headers)r   	MagicMock	gl_clientBaseApiClientapi_keylocationproject_host_credentialsr   HttpOptionsmodel_validate_http_optionsvertexair   )r+   credentials
api_clients      r   mock_api_clientr.   4   s    ~~9#:#:;*	'JJJJ'J'J(*'*"..=="o* !*%*	r   c                      t        t        j                        } t               | _        t        d      | _        t               | _        | S )Nr   s  {
  "serverContent": {
    "audioChunks": [
      {
        "data": "Z2VsYmFuYW5h",
        "mimeType": "audio/l16;rate=48000;channels=2",
        "sourceMetadata": {
          "clientContent": {
            "weightedPrompts": [
              {
                "text": "Jazz",
                "weight": 1
              }
            ]
          },
          "musicGenerationConfig": {
            "seed": -957124937,
            "bpm": 140,
            "scale": "A_FLAT_MAJOR_F_MINOR"
          }
        }
      }
    ]
  }
}return_value)r   r	   ClientConnectionsendrecvclose)	websockets    r   mock_websocketr7   I   s=    V445);).).6 K)/	r   c                 f   K   t               t               _        t        d      _        t        d      }t        d      }|d f|_        t
        j                  dfd	       }t        d|      t        j                  t        d	|       fd
              } |        d {   S 7 w)Ns   some responser0   )NN
test_token)tokenc                   K    y wNr   )uriadditional_headersmock_wss     r   mock_connectz)get_connect_message.<locals>.mock_connectu   s     
Ms   
zgoogle.auth.default)newconnectc                  f  K   t        j                        } | j                  j                        4 d {    	 d d d       d {    j                  j                          t        j                  j                  j                  d   d         S 7 ^7 O# 1 d {  7  sw Y   _xY ww)Nmodelr   )	r   	AsyncLivemusicrB   r3   assert_called_oncejsonloads	call_args)live_moduler-   r?   rE   s    r   _test_connectz*get_connect_message.<locals>._test_connecty   s      ..,K  (( )     
 LL##%::gll,,Q/233    sD   6B1BB1BB1
BAB1B1B."B%#B.*B1r<   )
r   r3   r4   r   r1   
contextlibasynccontextmanagerr   objectr   )r-   rE   mock_google_auth_default
mock_credsr@   rM   r?   s   ``    @r   get_connect_messagerS   l   s     K'',(89',!|<,'*+5t*<'!! " 		$<=<<
I<84 9 >4 		s   B%B1*B/+B1c                    d}| j                  d|       t               }|j                  j                  j                  j
                  j                  rJ |j                  j                  j                  j
                  j                  |k(  sJ t        |j                  j                  j
                  t        j                        sJ y )Ngoogle_api_keyGOOGLE_API_KEY)setenvr   aior   rG   r   r+   r#   
isinstancer-   r"   )monkeypatchr#   r	   s      r   test_mldev_from_envr[      s    '%w/8&ZZ__""..777	7				*	*	2	2g	==	=	FJJOO//1I1I	JJ	Jr   c                    d}d}| j                  dd       | j                  d|       | j                  d|       t               }|j                  j                  j                  j
                  j                  sJ |j                  j                  j                  j
                  j                  |k(  sJ t        |j                  j                  j
                  t        j                        sJ y )Nfake_project_idzfake-locationGOOGLE_GENAI_USE_VERTEXAItrueGOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATION)rW   r   rX   r   rG   r   r+   r%   rY   r-   r"   )rZ   
project_idr$   r	   s       r   test_vertex_from_envrc      s     *(0&9+Z8,h78&				*	*	3	33	3				*	*	2	2j	@@	@	FJJOO//1I1I	JJ	Jr   c                  f    d} t        j                  dd| i      } |j                         dk(  sJ y )Nzhttps://test.comrU   base_url)r#   http_optionszwss://test.com)r!   r"   _websocket_base_url)re   r-   s     r   test_websocket_base_urlrh      s>    (&&)* 
(	'	'	)-=	==	=r   r+   c                 b  K   t        j                  t        |      |       }|rSt        j                  t
              5  |j                  t        j                  dd      g       d {    d d d        y |j                  t        j                  dd      g       d {    | j                  j                          t        j                  | j                  j                  d   d         }d|v sJ |d   d	   d   d
   dk(  sJ |d   d	   d   d   dk(  sJ y 7 # 1 sw Y   y xY w7 w)Nr+   r-   r6   Jazz   )textweight)promptsr   clientContentweightedPromptsrn   ro   )r   AsyncMusicSessionr.   pytestraisesNotImplementedErrorset_weighted_promptsr   WeightedPromptr3   rH   rI   rJ   rK   r7   r+   session	sent_datas       r   (test_async_session_send_weighted_promptsr|      s1    
 (( (3~' 	*	+ `((%2F2FF[\2]1^(___`
$$e.B.BWX.Y-Z$[[[((*jj,,66q9!<=)	I	%%	%	?	#$5	6q	9&	AV	KK	K	?	#$5	6q	9(	Cq	HH	H ``
[s;   =D/,D!+D,D!04D/$D-%A:D/D!!D*&D/c                   K   t        j                  t        |      |       }|rjt        j                  t
              5  |j                  t        j                  dt        j                  j                               d {    d d d        y |j                  t        j                  dt        j                  j                               d {    | j                  j                          t        j                  | j                  j                  d   d         }d|v sJ |d   d   dk(  sJ y 7 # 1 sw Y   y xY w7 ow)	Nrj   rk      )bpmmusic_generation_mode)configr   musicGenerationConfigr   )r   rs   r.   rt   ru   rv   set_music_generation_configr   LiveMusicGenerationConfigMusicGenerationModeVOCALIZATIONr3   rH   rI   rJ   rK   ry   s       r   test_async_session_send_configr      s2    
 (( (3~' 	*	+ //00$)$=$=$J$J 0    ++,, % 9 9 F F 	, 	   ((*jj,,66q9!<=)	 I	--	-	*	+E	2c	99	9! s=   =EAD6D4D6AEEA!E4D66D?;Ec                   K   t        j                  t        |      |       }|r;t        j                  t
              5  |j                          d {    d d d        y |j                          d {    | j                  j                          t        j                  | j                  j                  d   d         }d|v sJ d|d   v sJ y 7 ~# 1 sw Y   y xY w7 kw)Nrj   rk   r   playbackControlPLAY)r   rs   r.   rt   ru   rv   playr3   rH   rI   rJ   rK   ry   s       r   &test_async_session_control_signal_playr           
 (( (3~' 	*	+ LLN
((*jj,,66q9!<=)	i	''	'	9./	//	/ 
;   =C"CCCC"4C 5AC"CCC"c                   K   t        j                  t        |      |       }|r;t        j                  t
              5  |j                          d {    d d d        y |j                          d {    | j                  j                          t        j                  | j                  j                  d   d         }d|v sJ d|d   v sJ y 7 ~# 1 sw Y   y xY w7 kw)Nrj   rk   r   r   PAUSE)r   rs   r.   rt   ru   rv   pauser3   rH   rI   rJ   rK   ry   s       r   'test_async_session_control_signal_pauser      s     
 (( (3~' 	*	+ MMO
((*jj,,66q9!<=)	i	''	'	I/0	00	0 
r   c                   K   t        j                  t        |      |       }|r;t        j                  t
              5  |j                          d {    d d d        y |j                          d {    | j                  j                          t        j                  | j                  j                  d   d         }d|v sJ d|d   v sJ y 7 ~# 1 sw Y   y xY w7 kw)Nrj   rk   r   r   STOP)r   rs   r.   rt   ru   rv   stopr3   rH   rI   rJ   rK   ry   s       r   &test_async_session_control_signal_stopr     r   r   c                   K   t        j                  t        |      |       }|r;t        j                  t
              5  |j                          d {    d d d        y |j                          d {    | j                  j                          t        j                  | j                  j                  d   d         }d|v sJ d|d   v sJ y 7 ~# 1 sw Y   y xY w7 kw)Nrj   rk   r   r   RESET_CONTEXT)r   rs   r.   rt   ru   rv   reset_contextr3   rH   rI   rJ   rK   ry   s       r   /test_async_session_control_signal_reset_contextr     s     
 (( (3~' 	*	+ $!!###$
((*jj,,66q9!<=)	i	''	'	I&78	88	8 $$
r   c                   K   t        j                  t        |      |       }|r4t        j                  t
              5  |j                         2 3 d {   }
|j                         2 3 d {   }t        |t        j                        sJ |j                  j                  d   }|j                  dk(  sJ |j                  dk(  sJ |j                  j                  j                   d   j"                  dk(  sJ |j                  j                  j                   d   j$                  dk(  sJ |j                  j&                  j(                  dk(  sJ  y 7 6 	 d d d        y # 1 sw Y   y xY w7 6 y w)	Nrj   rk   r   s	   gelbananazaudio/l16;rate=48000;channels=2rl   rm   r~   )r   rs   r.   rt   ru   rv   receiverY   r   LiveMusicServerMessageserver_contentaudio_chunksdata	mime_typesource_metadataclient_contentweighted_promptsrn   ro   music_generation_configr   )r7   r+   rz   _responseaudio_chunks         r   test_async_session_receiver   (  s_     (( (3~' 	*	+ __&  ) 	
 	
Hh < <===))66q9K|+++  $EEEE&&55FFqINNRXXXX&&55FFqIPPTUUUU&&>>BBcIII	&  	
)sk   =E4E#EEEE#E4*E2.E//E22C#E4EE#	E4#E,(E4/E22E4c                   K   t        d      | _        t        j                  t	        |      |       }t        j                  t              5  |j                         j                          d {    d d d        y 7 # 1 sw Y   y xY ww)Nzinvalid jsonr0   rj   rk   )
r   r4   r   rs   r.   rt   ru   
ValueErrorr   	__anext__r7   r+   rz   s      r    test_async_session_receive_errorr   ?  ss     
 "~>.(( (3~' }}Z  (
//

%
%
'''( ('( (s0   AB"B 0A>1B 5	B>B  B	Bc                    K   t        j                  t        |      |       }|j                          d {    | j                  j	                          y 7 w)Nrj   )r   rs   r.   r5   rH   r   s      r   test_async_session_closer   L  sJ      ((x(.' 	))+ s   4AA Ac                    K   | rBt        j                  t              5  t        t	        |       d       d {    d d d        y t        t	        |       d       d {   }di i}| rJ d|d   d<   ||k(  sJ y 7 D# 1 sw Y   y xY w7 *w)Nrj   
test_modelrD   setupzmodels/test_modelrE   )rt   ru   rv   rS   r.   )r+   resultexpected_results      r   test_setup_to_apir   V  s      	*	+ 
8
,  
 $x( & bM/5(;OGW%	?	""	"
 s7   BB A>B #B!B"B>B  B	B)FN)5__doc__rN   rI   typingr   unittestr   unittest.mockr   r   r   warningsgoogle.oauth2.credentialsr   rt   
websocketsr	    r   r-   r   r   r!   r   r   r   r   aiohttpAIOHTTP_NOT_INSTALLEDImportErrorr    markskipifrequires_aiohttpr.   fixturer7   rS   r[   rc   rh   parametrizeasyncior|   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s-  "       #    1   )   #    ! ;;%%"L &  
*  D8K K K> dE]3I  4I$ dE]3:  4:6 dE]30  40" dE]31  41" dE]30  40" dE]39  49" dE]3
  4
* dE]3(  4( dE]3,  4, dE]3#  4#]	   dnnGs   .L L76L7