
    p[i1                        d 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Zd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 g dZ G d dej,                        Z G d dej0                        Ze
j4                  dej6                  fd       Ze
j:                  j=                  ed      Z e
j4                  d	      d        Z dej6                  fdZ!e
j:                  j                  dej6                  fd       Z"e
j:                  j                  dej6                  fd       Z#e
j:                  j                  dej6                  fd       Z$e
j:                  j                  dej6                  fd       Z%e
j:                  j                  dej6                  fd        Z&ee
j:                  j                  dej6                  fd!              Z'ee
j:                  j                  dej6                  fd"              Z(ee
j:                  j                  dej6                  fd#              Z)ee
j:                  j                  dej6                  fd$              Z*d% Z+ e	d&      d'        Z, e	d&      d(        Z- e	d&      d)        Z.d* Z/ e	d+      e
j:                  j                  d,               Z0 e	d+      e
j:                  j                  d-               Z1y# e$ r d	Z ej                         ZY w xY w).zTests for async stream.    N)List)mock)	AsyncMock)	MagicMock)patchFT   )_api_client)Client)errors)types)G   {"candidates":[{"content":{"parts":[{"text":"test"}],"role":"model"}}]}   
s<   {"error":{"code":500,"message":"Error","status":"INTERNAL"}}c                   4    e Zd ZdZdee   fdZdee   fdZy)MockHTTPXResponsez&Mock httpx.Response class for testing.linesc                     t               | _        t        | j                  |            | j                  j                  _        t               | _        y )N)return_value)r   aiter_lines_async_line_iteratorr   	__aiter__r   acloseselfr   s     d/mnt/data/GridWatch/venv/lib/python3.12/site-packages/google/genai/tests/client/test_async_stream.py__init__zMockHTTPXResponse.__init__5   s>     {D.7..u5/D!!+ +DK    c                $   K   |D ]  }| 	 y wN )r   r   lines      r   r   z&MockHTTPXResponse._async_line_iterator<   s      js   N)__name__
__module____qualname____doc__r   strr   r   r   r   r   r   r   2   s%    .DI d3i r   r   c                   *    e Zd Zdee   fdZdefdZy)MockAIOHTTPResponser   c                 
   t               | _        t               | j                  _        dj	                  d |D              dz   | _        d| _        | j                  | j                  j                  _        t               | _	        y )Nr   c              3   >   K   | ]  }|j                  d         yw)zutf-8N)encode).0r    s     r   	<genexpr>z/MockAIOHTTPResponse.__init__.<locals>.<genexpr>G   s      H$W!5 Hs   r   )
r   contentr   readlinejoin
_read_data	_read_pos_async_read_lineside_effectreleaser   s     r   r   zMockAIOHTTPResponse.__init__C   s\    ;DL%KDLLjj H% HH5PDODN(,(=(=DLL%;DLr   returnc                 `  K   | j                   t        | j                        k\  ry| j                  j                  d| j                         }|dk(  r5| j                  | j                   d  }t        | j                        | _         |S | j                  | j                   |dz    }|dz   | _         |S w)Nr   r      )r1   lenr0   find)r   newline_posr    s      r   r2   z$MockAIOHTTPResponse._async_read_lineL   s     ~~T__--//&&udnn=Kb__T^^-.d4??+dnk__T^^kAo>d"Qdnks   B,B.N)r!   r"   r#   r   r%   r   bytesr2   r   r   r   r'   r'   A   s    DI e r   r'   r5   c                  .    t        j                  i       S )Nheaders)
api_clientHttpResponser   r   r   	responsesrB   [   s    		 	 	,,r   z(aiohttp is not installed, skipping test.)reason)autousec               #   *   K   d  dt         _        y w)NF)r@   has_aiohttpr   r   r   reset_has_aiohttprG   e   s      *s   rB   c                      dt         _        t        j                  t        d      5   fd}t        j                   |              ddd       y# 1 sw Y   yxY w)z;Tests that an invalid response stream type raises an error.FzVExpected self.response_stream to be an httpx.Response or aiohttp.ClientResponse object)matchc                  H   K   j                         2 3 d {   } 
7 6 y wr   )_aiter_response_stream)_rB   s    r   runz.test_invalid_response_stream_type.<locals>.runv   s+     557  7s   "  " "N)r@   rF   pytestraises	TypeErrorasynciorM   )rB   rM   s   ` r   !test_invalid_response_stream_typerR   k   sI     *}}+  KK  s    AAc                   K   g d}t        |      }|| _        | j                         2 cg c3 d {   }|7 6 nc c}w }}||k(  sJ |j                  j	                          |j
                  j	                          y w)Nhelloworldtestingr   response_streamrK   r   assert_called_oncer   rB   r   mock_responser    resultss        r   test_httpx_simple_linesr^   }   su     
'%#E*-+)$-$D$D$FGGDTGGG'G	E		..0))+s'   )B =;9
;=;=AB c                   K   ddg}t        |      }|| _        | j                         2 cg c3 d {   }|7 6 nc c}w }}|ddgk(  sJ |j                  j	                          |j
                  j	                          y w)Ndata: { 'message': 'hello' }data: { 'status': 'ok' }{ 'message': 'hello' }{ 'status': 'ok' }rX   r[   s        r   test_httpx_data_prefixrd      s     )+E
F%#E*-+)$-$D$D$FGGDTGGG'G	-/CD	DD	D..0))+'   )B=;9
;=;=ABc                   K   g d}t        |      }|| _        | j                         2 cg c3 d {   }|7 6 nc c}w }}|g dk(  sJ |j                  j	                          |j
                  j	                          y w)N{ "id": 1 } zdata: { "id": 2 }zdata: { "id": 3 }rh   z{ "id": 2 }z{ "id": 3 }rX   r[   s        r   test_httpx_multiple_json_chunkrk      sz     % $E*-+)$-$D$D$FGGDTGGG'G	A	AA	A..0))+re   c                   K   dg}t        |      }|| _        | j                         2 cg c3 d {   }|7 6 nc c}w }}|dgk(  sJ |j                  j	                          |j
                  j	                          y w)N{ "partial": "data"rX   r[   s        r   !test_httpx_incomplete_json_at_endrn      s~      
!%#E*-+)$-$D$D$FGGDTGGG'G 
*+	++	+..0))+s'   (B <:8
:<:<AB c                    K   g }t        |      }|| _        | j                         2 cg c3 d {   }|7 6 nc c}w }}|g k(  sJ |j                  j	                          |j
                  j	                          y wr   rX   r[   s        r   test_httpx_empty_streamrp      ss     %#E*-+)$-$D$D$FGGDTGGG'G	B..0))+s'   'A>;97
9;9;AA>c                 .  K   dt         _        g d}t        |      }|| _        | j	                         2 cg c3 d {   }|7 6 nc c}w }}||k(  sJ |j
                  j                  j                          |j                  j                          y w)NTrT   
r@   rF   r'   rY   rK   r-   r.   assert_any_callr4   rZ   r[   s        r   test_aiohttp_simple_linesrt      s       *
'%%e,-+)$-$D$D$FGGDTGGG'G	E		  002**,s2   4BAAA
A AAAABc                 2  K   dt         _        ddg}t        |      }|| _        | j	                         2 cg c3 d {   }|7 6 nc c}w }}|ddgk(  sJ |j
                  j                  j                          |j                  j                          y w)NTr`   ra   rb   rc   rr   r[   s        r   test_aiohttp_data_prefixrv      s       *)+E
F%%e,-+)$-$D$D$FGGDTGGG'G	-/CD	DD	D  002**,2   4BAAA
A AAAABc                 2  K   dt         _        g d}t        |      }|| _        | j	                         2 cg c3 d {   }|7 6 nc c}w }}|g dk(  sJ |j
                  j                  j                          |j                  j                          y w)NTrg   rj   rr   r[   s        r   !test_aiohttp_multiple_json_chunksry      s       *% &e,-+)$-$D$D$FGGDTGGG'G	A	AA	A  002**,rw   c                 .  K   dt         _        dg}t        |      }|| _        | j	                         2 cg c3 d {   }|7 6 nc c}w }}|dgk(  sJ |j
                  j                  j                          |j                  j                          y w)NTrm   rr   r[   s        r   #test_aiohttp_incomplete_json_at_endr{      s     
  * 
!%%e,-+)$-$D$D$FGGDTGGG'G	*+	++	+  002**,s1   3BAAA
AAAAABc                     t        t        j                        }| |j                  _        t        j
                  d|      S N)spec   )status_codestream)r   httpxSyncByteStream__iter__r   Response)chunksmock_streams     r   r\   r\     s7    u334+&,+#	
 r   zhttpx.Client.sendc                 R   g d}t        |      | _        t        j                  d      }|j	                  ddi       }t        |      }|t        j                  i d      k(  sJ t        j                  t        j                        5  t        |       d d d        y # 1 sw Y   y xY w)N)r   r   s   {"error": bad_json}test_api_keyapi_keyPOSTmodels/gemini-2.5-flashM{"candidates": [{"content": {"parts": [{"text": "test"}], "role": "model"}}]}r?   body)r\   r   r@   BaseApiClientrequest_streamednextr   rA   rN   rO   r   UnknownApiResponseError)mock_send_methodwith_bad_jsonclientr   chunks        r   /test_error_event_in_streamed_responses_bad_jsonr     s    -
 #0">##N;&""6+DbI&
v,%	%$$ 
  
 }}V334 L     BB&c                 R   t        t              | _        t        j                  d      }|j                  ddi       }t        |      }|t        j                  di       k(  sJ t        j                  t        j                        5  t        |       d d d        y # 1 sw Y   y xY w)Nr   r   r   r   r   )r   r?   )r\   EVENT_STREAM_DATA_WITH_ERRORr   r@   r   r   r   r   rA   rN   rO   r   ServerError)r   r   r   r   s       r   &test_error_event_in_streamed_responsesr   .  s    "/0L"M##N;&""6+DbI&
v,%	%$$  
  
 }}V''( L  r   c           
         t        t              | _        t        d      }|j                  j                  dd      }t        |      }|t        j                  t        j                  t        j                  t        j                  d      gd	      
      gt        j                  i             k(  sJ t        j                  t        j                         5  t        |       d d d        y # 1 sw Y   y xY w)Nr   r   gemini-2.5-flashTell me a story in 300 words.modelcontentstesttextr   partsroler-   r>   
candidatessdk_http_response)r\   r   r   r
   modelsgenerate_content_streamr   r   GenerateContentResponse	CandidateContentPartrA   rN   rO   r   r   )r   r   generated_responser   s       r   +test_error_event_in_generate_content_streamr   B  s    "/0L"M.)&}}<<. = 
 !
"%	%//
//mmjj%
 	 **26 
  
  }}V''( 	  s   C00C9c                    K   t        t        j                        }t        |j                  _        t               |_        t        j                  d|      S wr}   )	r   r   AsyncByteStreamr   r   r   r   r   r   )rL   r   s     r   _async_httpx_responser   a  sE     u445+'C+$ {+	
 s   AAzhttpx.AsyncBaseTransportc                   K   t        j                  dt        j                  d| i            }t        | _        t               | _        |j                  ddddi       d {   }t        |       d {   }|t        j                  i d	
      k(  sJ t        j                  t        j                        5  t        |       d {    d d d        y 7 s7 b7 # 1 sw Y   y xY ww)Nr   	transportasync_client_argsr   http_optionsr   r   keyvaluer   r   )r@   r   r   HttpOptionsr   handle_async_requestr   r   async_request_streamedanextrA   rN   rO   r   r   )mock_transportr   respr   s       r   ,test_error_event_in_streamed_responses_asyncr   k  s      ##$$(.9& )>.%#+.,,'%)9 
$ d
%	%$$ 
  
 }}V''( 
+ 
   sO   A C("C#C(5C6AC(9CC	C
C(C(CC%!C(c           
        K   t        dt        j                  d| i            }t        | _        t               | _        |j                  j                  j                  dd       d {   }t        |       d {   }|t        j                  t        j                  t        j                  t        j                  d	      gd
            gt        j                  i             k(  sJ t!        j"                  t$        j&                        5  t        |       d {    d d d        y 7 7 7 # 1 sw Y   y xY ww)Nr   r   r   r   r   r   r   r   r   r   r   r   r>   r   )r
   r   r   r   r   r   r   aior   r   r   r   r   r   r   rA   rN   rO   r   r   )r   r   r   r   s       r   1test_error_event_in_generate_content_stream_asyncr     s.     $$(.9& )>.%#+.#ZZ..FF. G  
 ()
)%	%//
//mmjj%
 	 **26 
  
  }}V''( $
"
###$ $-
 *$ $$ $sO   A(E*D1+E=D3>BED7#D5$D7(
E3E5D77E <E)2r$   rQ   typingr   unittestr   unittest.mockr   r   r   rN   aiohttpAIOHTTP_NOT_INSTALLEDImportErrorr   ri   r	   r@   r
   r   r   r   r   r   ClientResponser'   fixturerA   rB   markskipifrequires_aiohttprG   rR   r^   rd   rk   rn   rp   rt   rv   ry   r{   r\   r   r   r   r   r   r   r   r   r   <module>r      sZ        # #  
  )      '00 4 -:** - - ;;%%"L &  
 ! !
1H1H $ 	,Z-D-D 	, 	, 	,J,C,C 	, 	, ,J4K4K , ," 
,z7N7N 
, 
, 	,Z-D-D 	, 	, -z/F/F -  - -j.E.E -  - -z7N7N -  -& -&&-  -   0  &  < !"  #6 !"!$  #!$W  DNN's   K# #K?>K?