o
    i+                     @   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specTEST_API_KEYzus-central1test_projectc                   S   s   dS )N	test_host r   r   r   [/home/ubuntu/.local/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project_host_credentialsr   HttpOptionsmodel_validate_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   ClientConnectionsendrecvclose)	websocketr   r   r   mock_websocketI   s   r2   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+   )NN
test_token)tokenc                   s    V  d S Nr   )uri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   	AsyncLivemusicr;   r.   assert_called_oncejsonloads	call_args)live_moduler)   r8   r=   r   r   _test_connecty   s   
(
z*get_connect_message.<locals>._test_connectr5   )
r   r.   r/   r   r,   
contextlibasynccontextmanagerr   objectr   )r)   r=   mock_google_auth_default
mock_credsr9   rF   r   rE   r   get_connect_messagel   s   




rL   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_keyGOOGLE_API_KEY)setenvr   aior   r?   r
   r'   r   
isinstancer)   r   )monkeypatchr   r   r   r   r   test_mldev_from_env   s   rS   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 )Nfake_project_idzfake-locationGOOGLE_GENAI_USE_VERTEXAItrueGOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATION)rO   r   rP   r   r?   r
   r'   r!   rQ   r)   r   )rR   
project_idr    r   r   r   r   test_vertex_from_env   s   rZ   c                  C   s*   d} t jdd| id}| dksJ d S )Nzhttps://test.comrM   base_url)r   http_optionszwss://test.com)r   r   _websocket_base_url)r[   r)   r   r   r   test_websocket_base_url   s   r^   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)   r1   Jazz   )textweight)promptsr   clientContentweightedPromptsrc   rd   )r   AsyncMusicSessionr*   pytestraisesNotImplementedErrorset_weighted_promptsr   WeightedPromptr.   r@   rA   rB   rC   r2   r'   session	sent_datar   r   r   (test_async_session_send_weighted_prompts   s"   
 

 rq   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 )	Nr_   r`      )bpmmusic_generation_mode)configr   musicGenerationConfigrs   )r   rh   r*   ri   rj   rk   set_music_generation_configr   LiveMusicGenerationConfigMusicGenerationModeVOCALIZATIONr.   r@   rA   rB   rC   rn   r   r   r   test_async_session_send_config   s4   


r{   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 )Nr_   r`   r   playbackControlPLAY)r   rh   r*   ri   rj   rk   playr.   r@   rA   rB   rC   rn   r   r   r   &test_async_session_control_signal_play       


r   c                    r|   )Nr_   r`   r   r}   PAUSE)r   rh   r*   ri   rj   rk   pauser.   r@   rA   rB   rC   rn   r   r   r   'test_async_session_control_signal_pause   r   r   c                    r|   )Nr_   r`   r   r}   STOP)r   rh   r*   ri   rj   rk   stopr.   r@   rA   rB   rC   rn   r   r   r   &test_async_session_control_signal_stop  r   r   c                    r|   )Nr_   r`   r   r}   RESET_CONTEXT)r   rh   r*   ri   rj   rk   reset_contextr.   r@   rA   rB   rC   rn   r   r   r   /test_async_session_control_signal_reset_context  r   r   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 )	Nr_   r`   r   s	   gelbananazaudio/l16;rate=48000;channels=2ra   rb   rr   )r   rh   r*   ri   rj   rk   receiverQ   r   LiveMusicServerMessageserver_contentaudio_chunksdata	mime_typesource_metadataclient_contentweighted_promptsrc   rd   music_generation_configrs   )r2   r'   ro   _responseaudio_chunkr   r   r   test_async_session_receive(  s.   

r   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+   r_   r`   )
r   r/   r   rh   r*   ri   rj   
ValueErrorr   	__anext__r2   r'   ro   r   r   r    test_async_session_receive_error?  s   
"r   c                    s0   t t|d| }| I d H  | j  d S )Nr_   )r   rh   r*   r0   r@   r   r   r   r   test_async_session_closeL  s   
r   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 )Nr_   
test_modelr<   setupFzmodels/test_modelr=   )ri   rj   rk   rL   r*   )r'   resultexpected_resultr   r   r   test_setup_to_apiV  s(   
r   )FN)5__doc__rG   rA   typingr   unittestr   unittest.mockr   r   r   warningsgoogle.oauth2.credentialsr   ri   
websocketsr    r
   r)   r   r   r   r   r   r   r   aiohttpAIOHTTP_NOT_INSTALLEDImportErrorr   markskipifrequires_aiohttpr*   fixturer2   rL   rS   rZ   r^   parametrizeasynciorq   r{   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   

"
	