o
    Yi+                     @   s  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 zddlZdZW n ey   dZe ZY nw ejj eddZ!d8ddZ"ej#dd Z$dd Z%dd Z&e!dd  Z'd!d" Z(ej)d#ddgejj*d$d% Z+ej)d#ddgejj*d&d' Z,ej)d#ddgejj*d(d) Z-ej)d#ddgejj*d*d+ Z.ej)d#ddgejj*d,d- Z/ej)d#ddgejj*d.d/ Z0ej)d#ddgejj*d0d1 Z1ej)d#ddgejj*d2d3 Z2ej)d#ddgejj*d4d5 Z3ej)d#ddgejj*d6d7 Z4dS )9z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                 C   sj   t jtjd}| sd|_d |_d |_n	d |_d|_d|_dd |_||_t	j
di i|_| |_||_|S )NspecZTEST_API_KEYzus-central1Ztest_projectc                   S   s   dS )NZ	test_host r   r   r   a/home/kim/smarthome/.venv/lib/python3.10/site-packages/google/genai/tests/live/test_live_music.py<lambda>?   s    z!mock_api_client.<locals>.<lambda>headers)r   	MagicMock	gl_clientBaseApiClientapi_keylocationprojectZ_hostZ_credentialsr   ZHttpOptionsZmodel_validateZ_http_optionsvertexair
   )r   credentials
api_clientr   r   r   mock_api_client4   s    
r"   c                  C   s,   t tjd} t  | _t d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   ZClientConnectionsendrecvclose)	websocketr   r   r   mock_websocketI   s   r)   c                    s   t  t  _t dd_tdd}tdd}|d f|_tjdfdd	}td|d	tjt	d
|d	 fdd}| I d H S )Ns   some responser#   )NNZ
test_token)tokenc                   s    V  d S Nr   )uriZadditional_headers)mock_wsr   r   mock_connectu   s   
z)get_connect_message.<locals>.mock_connectzgoogle.auth.default)newconnectc               	      sn   t  } | jjd4 I d H  W d   I d H  n1 I d H s"w   Y  j  tjjd d S )Nmodelr   )	r   Z	AsyncLivemusicr0   r%   assert_called_oncejsonloads	call_args)Zlive_moduler!   r-   r2   r   r   _test_connecty   s   
(
z*get_connect_message.<locals>._test_connectr+   )
r   r%   r&   r   r$   
contextlibasynccontextmanagerr   objectr   )r!   r2   Zmock_google_auth_defaultZ
mock_credsr.   r9   r   r8   r   get_connect_messagel   s   




r=   c                 C   sX   d}|  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 d S )Ngoogle_api_keyZGOOGLE_API_KEY)setenvr   aior   r3   r
   r   r   
isinstancer!   r   )monkeypatchr   r   r   r   r   test_mldev_from_env   s   rC   c                 C   st   d}d}|  dd |  d| |  d| t }|jjjjjs"J |jjjjj|ks-J t|jjjt	j
s8J d S )NZfake_project_idzfake-locationZGOOGLE_GENAI_USE_VERTEXAItrueZGOOGLE_CLOUD_PROJECTZGOOGLE_CLOUD_LOCATION)r?   r   r@   r   r3   r
   r   r   rA   r!   r   )rB   Z
project_idr   r   r   r   r   test_vertex_from_env   s   rE   c                  C   s*   d} t jdd| id}| dksJ d S )Nzhttps://test.comr>   base_url)r   Zhttp_optionszwss://test.com)r   r   Z_websocket_base_url)rF   r!   r   r   r   test_websocket_base_url   s   rG   r   c                    s   t jt|d| d}|r4tt |jtjdddgdI d H  W d    d S 1 s-w   Y  d S |jtjdddgdI d H  | j	
  t| j	jd d }d|v sYJ |d d	 d d
 dksgJ |d d	 d d dksuJ d S )Nr   r!   r(   Jazz   )textweight)Zpromptsr   ZclientContentZweightedPromptsrL   rM   )r   AsyncMusicSessionr"   pytestraisesNotImplementedErrorZset_weighted_promptsr   ZWeightedPromptr%   r4   r5   r6   r7   r)   r   sessionZ	sent_datar   r   r   (test_async_session_send_weighted_prompts   s"   
 

 rT   c                    s   t jt|d| d}|r5tt |jtjdtj	j
ddI d H  W d    d S 1 s.w   Y  d S |jtjdtj	j
ddI d H  | j  t| jjd d }d|v s[J |d d dkseJ d S )	NrH   rI      )bpmZmusic_generation_mode)configr   ZmusicGenerationConfigrV   )r   rN   r"   rO   rP   rQ   Zset_music_generation_configr   ZLiveMusicGenerationConfigZMusicGenerationModeZVOCALIZATIONr%   r4   r5   r6   r7   rR   r   r   r   test_async_session_send_config   s4   


rX   c                       t jt|d| d}|r,tt | I d H  W d    d S 1 s%w   Y  d S | I d H  | j  t	
| jjd d }d|v sIJ d|d v sQJ d S )NrH   rI   r   playbackControlZPLAY)r   rN   r"   rO   rP   rQ   Zplayr%   r4   r5   r6   r7   rR   r   r   r   &test_async_session_control_signal_play       


r[   c                    rY   )NrH   rI   r   rZ   ZPAUSE)r   rN   r"   rO   rP   rQ   pauser%   r4   r5   r6   r7   rR   r   r   r   'test_async_session_control_signal_pause   r\   r^   c                    rY   )NrH   rI   r   rZ   STOP)r   rN   r"   rO   rP   rQ   stopr%   r4   r5   r6   r7   rR   r   r   r   &test_async_session_control_signal_stop  r\   ra   c                    rY   )NrH   rI   r   rZ   ZRESET_CONTEXT)r   rN   r"   rO   rP   rQ   Zreset_contextr%   r4   r5   r6   r7   rR   r   r   r   /test_async_session_control_signal_reset_context  r\   rb   c                    s   t jt|d| d}|r1tt | 2 z3 d H W }q6 W d    d S 1 s*w   Y  d S | 2 zE3 d H W }t|tj	sCJ |j
jd }|jdksPJ |jdksWJ |jjjd jdkscJ |jjjd jdksoJ |jjjdksxJ  d S 6 d S )	NrH   rI   r   s	   gelbananazaudio/l16;rate=48000;channels=2rJ   rK   rU   )r   rN   r"   rO   rP   rQ   receiverA   r   ZLiveMusicServerMessageZserver_contentZaudio_chunksdataZ	mime_typeZsource_metadataZclient_contentZweighted_promptsrL   rM   Zmusic_generation_configrV   )r)   r   rS   _responseZaudio_chunkr   r   r   test_async_session_receive(  s.   

rg   c                    sd   t dd| _tjt|d| d}tt | 	 I d H  W d    d S 1 s+w   Y  d S )Nzinvalid jsonr#   rH   rI   )
r   r&   r   rN   r"   rO   rP   
ValueErrorrc   	__anext__r)   r   rS   r   r   r    test_async_session_receive_error?  s   
"rk   c                    s0   t t|d| }| I d H  | j  d S )NrH   )r   rN   r"   r'   r4   rj   r   r   r   test_async_session_closeL  s   
rl   c                    s   | r't t tt| dddI d H  W d    d S 1 s w   Y  d S tt| dddI d H }di i}| r;J d|d d< ||ksGJ d S )NrH   Z
test_modelr1   setupFzmodels/test_modelr2   )rO   rP   rQ   r=   r"   )r   resultZexpected_resultr   r   r   test_setup_to_apiV  s(   
ro   )FN)5__doc__r:   r5   typingr   Zunittestr   Zunittest.mockr   r   r   warningsZgoogle.oauth2.credentialsr   rO   Z
websocketsr    r
   r!   r   r   r   r   r   r   r   ZaiohttpZAIOHTTP_NOT_INSTALLEDImportErrorr   markZskipifZrequires_aiohttpr"   Zfixturer)   r=   rC   rE   rG   ZparametrizeZasynciorT   rX   r[   r^   ra   rb   rg   rk   rl   ro   r   r   r   r   <module>   s   

"
	