a
    hkm                     @  st  d dl mZ d dlZd dl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
mZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZ d dlmZmZ d dlZd dl Zd dl!Zd d	l"m#Z# d d
l$m%Z% d dl&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z- ej.dkr*d dlm/Z/ nd dl0m/Z/ ej.dkrPd dlm1Z1 nd dl0m1Z1 zd dl2Z2W n e3y   e4dY n0 eg eej5j6 f Z7ee)e+ge
d f Z8ee*ge8f Z9ee*e)e+ge
d f Z:ee;ee;ee; e<f f Z=dddddZ>G dd dZ?G dd deZ@G dd deAZBG dd de2jCe-ZDG dd  d ZEG d!d" d"e2jFZGG d#d$ d$e2jHZIdS )%    )annotationsN)	Awaitable	GeneratorIterableMappingMutableMappingSequence)Future)AbstractContextManager)GeneratorType)AnyCallableLiteral	TypedDictUnioncast)unquoteurljoin)StapledObjectStream)is_async_callable)ASGIAppMessageReceiveScopeSend)WebSocketDisconnect)   
   )	TypeGuard)r      )SelfzThe starlette.testclient module requires the httpx package to be installed.
You can install this with:
    $ pip install httpx
zASGI2App | ASGI3AppzTypeGuard[ASGI3App]appreturnc                 C  s   t | rt| dS t| S )N	__await__)inspectisclasshasattrr   r"    r)   P/var/www/html/assistant/venv/lib/python3.9/site-packages/starlette/testclient.py	_is_asgi3=   s    

r+   c                   @  s4   e Zd ZdZdddddZddd	dd
ddZdS )
_WrapASGI2z7
    Provide an ASGI3 interface onto an ASGI2 app.
    ASGI2AppNoner!   c                 C  s
   || _ d S Nr(   )selfr"   r)   r)   r*   __init__H   s    z_WrapASGI2.__init__r   r   r   )scopereceivesendr#   c                   s   |  |}|||I d H  d S r/   r(   )r0   r2   r3   r4   instancer)   r)   r*   __call__K   s    
z_WrapASGI2.__call__N)__name__
__module____qualname____doc__r1   r6   r)   r)   r)   r*   r,   C   s   r,   c                   @  s   e Zd ZU ded< ded< dS )_AsyncBackendstrbackenddict[str, Any]backend_optionsN)r7   r8   r9   __annotations__r)   r)   r)   r*   r;   P   s   
r;   c                   @  s   e Zd ZdddddZdS )_UpgradeWebSocketTestSessionr.   )sessionr#   c                 C  s
   || _ d S r/   )rC   )r0   rC   r)   r)   r*   r1   V   s    z_Upgrade.__init__N)r7   r8   r9   r1   r)   r)   r)   r*   rA   U   s   rA   c                   @  s   e Zd ZdZdS )WebSocketDenialResponsez
    A special case of `WebSocketDisconnect`, raised in the `TestClient` if the
    `WebSocket` is closed before being accepted with a `send_denial_response()`.
    N)r7   r8   r9   r:   r)   r)   r)   r*   rD   Z   s   rD   c                   @  s   e Zd ZdddddddZd dd	d
ZdddddZdddddZdddddZdddddZdddddZ	ddddd Z
d6dd"dd#d$d%Zd7d(d)dd*d+d,Zddd-d.Zddd/d0Zddd1d2Zd8d"dd3d4d5Zd'S )9rB   ASGI3Appr   _PortalFactoryTyper.   )r"   r2   portal_factoryr#   c                 C  s"   || _ || _d | _|| _d | _d S r/   )r"   r2   accepted_subprotocolrG   extra_headers)r0   r"   r2   rG   r)   r)   r*   r1   e   s
    zWebSocketTestSession.__init__r#   c                 C  s   t  }||   | _}|| j\}}||j ||j	|j
 | ddi |  }| | |dd | _|dd | _|| jd | | _| W  d    S 1 s0    Y  d S )Ntypezwebsocket.connectsubprotocolheaders  )
contextlib	ExitStackenter_contextrG   portalZ
start_task_runcallbackresultcallcancelr4   r3   _raise_on_closegetrH   rI   closepop_all
exit_stack)r0   stackrR   Zfutcsmessager)   r)   r*   	__enter__q   s    


zWebSocketTestSession.__enter__r   zbool | Noneargsr#   c                 G  s   | j j| S r/   )r\   __exit__r0   rb   r)   r)   r*   rc      s    zWebSocketTestSession.__exit__z'anyio.abc.TaskStatus[anyio.CancelScope])task_statusr#   c          	        s$  t tj}|\}}t tj}|\}}| | | |v t  N}|| _|| _|| | | j	|j
|jI dH  t  I dH  W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  dS )zE
        The sub-thread in which the websocket session runs.
        N)anyiocreate_memory_object_streammathinfZCancelScope_receive_tx_send_rxstartedr"   r2   r3   r4   Zsleep_forever)	r0   re   r4   Zsend_txZsend_rxr3   Z
receive_txZ
receive_rxr^   r)   r)   r*   rS      s    "
zWebSocketTestSession._runr   r_   r#   c                 C  s   |d dkr*t |dd|dddnj|d dkr|d	 }|d
 }g }|  }|d dksbJ ||d  |ddsJqqJt||d|dd S )NrK   zwebsocket.closecoderN   reason )rn   ro   zwebsocket.http.response.startstatusrM   zwebsocket.http.response.bodybody	more_bodyF    )status_coderM   content)r   rY   r3   appendrD   join)r0   r_   ru   rM   rr   r)   r)   r*   rX      s    z$WebSocketTestSession._raise_on_closec                 C  s   | j | jj| d S r/   )rR   rV   rj   r4   r0   r_   r)   r)   r*   r4      s    zWebSocketTestSession.sendr<   )datar#   c                 C  s   |  d|d d S )Nwebsocket.receiverK   textr4   r0   rz   r)   r)   r*   	send_text   s    zWebSocketTestSession.send_textbytesc                 C  s   |  d|d d S )Nr{   rK   r   r~   r   r)   r)   r*   
send_bytes   s    zWebSocketTestSession.send_bytesr}   zLiteral['text', 'binary'])rz   moder#   c                 C  sD   t j|ddd}|dkr*| d|d n| d|dd d S )	N),:F)
separatorsensure_asciir}   r{   r|   utf-8r   )jsondumpsr4   encode)r0   rz   r   r}   r)   r)   r*   	send_json   s    zWebSocketTestSession.send_jsonrN   Nintz
str | None)rn   ro   r#   c                 C  s   |  d||d d S )Nzwebsocket.disconnect)rK   rn   ro   r~   )r0   rn   ro   r)   r)   r*   rZ      s    zWebSocketTestSession.closec                 C  s   | j | jjS r/   )rR   rV   rk   r3   r0   r)   r)   r*   r3      s    zWebSocketTestSession.receivec                 C  s    |   }| | tt|d S )Nr}   )r3   rX   r   r<   ry   r)   r)   r*   receive_text   s    
z!WebSocketTestSession.receive_textc                 C  s    |   }| | tt|d S )Nr   )r3   rX   r   r   ry   r)   r)   r*   receive_bytes   s    
z"WebSocketTestSession.receive_bytes)r   r#   c                 C  s<   |   }| | |dkr$|d }n|d d}t|S )Nr}   r   r   )r3   rX   decoder   loads)r0   r   r_   r}   r)   r)   r*   receive_json   s    

z!WebSocketTestSession.receive_json)r}   )rN   N)r}   )r7   r8   r9   r1   r`   rc   rS   rX   r4   r   r   r   rZ   r3   r   r   r   r)   r)   r)   r*   rB   d   s   rB   c                	   @  s8   e Zd Zdddddddd	d
ddZdddddZdS )_TestClientTransportTrp   rE   rF   boolr<   tuple[str, int]r>   r.   )r"   rG   raise_server_exceptions	root_pathclient	app_stater#   c                C  s(   || _ || _|| _|| _|| _|| _d S r/   )r"   r   r   rG   r   r   )r0   r"   rG   r   r   r   r   r)   r)   r*   r1      s    
z_TestClientTransport.__init__zhttpx.Requesthttpx.Response)requestr#   c                   s  j j}j jjdd}j j}j j}j jjdd}ddddd| }d|v rl|dd\}}	t|	}
n|}|}
dj	v rg }n0|
|krd	|
 fg}nd	| d|
 
 fg}|d
d j	 D 7 }|dv rbj	dd }|d u rg }ndd |dD }dt||ddd | j||
 || j||
g|| j di id}t| j|| j}t|ddjt||ddd | j||
 || j||
gdi i| j d}dddt id d  ddfdd}ddd  fd!d"}zL|  .}|tj|| j||| W d    n1 s:0    Y  W n2 tyx } z| jrd|W Y d }~n
d }~0 0 | jrsJ d#nsd$g t d%td   d< tj!f i d&i}d ur|_" |_#|S )'Nascii)encodingP   i  )httpwshttpswssr      hosts   hostc                 S  s$   g | ]\}}|   | fqS r)   )lowerr   .0keyvaluer)   r)   r*   
<listcomp>   rt   z7_TestClientTransport.handle_request.<locals>.<listcomp>>   r   r   sec-websocket-protocolc                 S  s   g | ]}|  qS r)   )strip)r   r   r)   r)   r*   r     rt   r   Z	websocket   ?r   zwebsocket.http.response)rK   pathraw_pathr   schemequery_stringrM   r   serversubprotocolsstate
extensionsr   z1.1http.response.debug)rK   http_versionmethodr   r   r   r   r   rM   r   r   r   r   Fstreamr   rJ   c                    s   r"  s I d H  ddiS   } t| tr@| d}nl| d u rNd}n^t| trz,| d }t|trx|d}d|ddW S  ty   dddd Y S 0 n| }dd|dS )	NrK   zhttp.disconnectr   rt   zhttp.requestT)rK   rr   rs   )rK   rr   )	is_setwaitread
isinstancer<   r   r   r4   StopIteration)rr   Z
body_byteschunk)r   request_completeresponse_completer)   r*   r3   *  s*    




z4_TestClientTransport.handle_request.<locals>.receiver.   rm   c                   s   | d dkrDrJ d| d d< dd |  dg D d< d	n| d d
krs\J d rlJ d|  dd}|  dd}jdkrd | |s܈d d   n$| d dkr| d d | d d  d S )NrK   zhttp.response.startz1Received multiple "http.response.start" messages.rq   ru   c                 S  s    g | ]\}}|  |  fqS r)   )r   r   r)   r)   r*   r   L  rt   zE_TestClientTransport.handle_request.<locals>.send.<locals>.<listcomp>rM   Tzhttp.response.bodyz<Received "http.response.body" without "http.response.start".z7Received "http.response.body" after response completed.rr   rt   rs   FHEADr   r   r   infotemplatecontext)rY   r   r   writeseekset)r_   rr   rs   )r   
raw_kwargsr   r   response_startedr   r)   r*   r4   F  s$    

z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.i  )ru   rM   r   r   )$urlr   netlocr   r   r   querysplitr   rM   r   Zmulti_itemsrY   r   r   r   r   copyrB   r"   rG   rA   r   ioBytesIOrV   rf   EventBaseExceptionr   httpxZ
ByteStreamr   Responser   r   )r0   r   r   r   r   r   r   default_portr   Zport_stringportrM   rL   r   r2   rC   r3   r4   rR   excresponser)   )r   r   r   r   r   r   r   r*   handle_request   s    



6
z#_TestClientTransport.handle_requestN)Trp   )r7   r8   r9   r1   r   r)   r)   r)   r*   r      s     r   c                      s
  e Zd ZU dZded< dZded< dMdddddddddddd fddZejddddZ	ddddddde
jje
jje
jjddddddd d!d"d#dd$d%d&dd'd( fd)d*Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd-d.Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd/d0Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd1d2Zddddddde
jje
jje
jjdddddd d!d"d#dd$d%d&dd'd3 fd4d5Zddddddde
jje
jje
jjdddddd d!d"d#dd$d%d&dd'd3 fd6d7Zddddddde
jje
jje
jjdddddd d!d"d#dd$d%d&dd'd3 fd8d9Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd:d;ZdNdd<d!d=d> fd?d@ZdAddBdCZd!ddDdEdFZdddGdHZdddIdJZdddKdLZ  ZS )O
TestClientFzFuture[None]taskNzanyio.abc.BlockingPortal | NonerR   http://testserverTrp   asyncio
testclientiP  r   r<   r   zLiteral['asyncio', 'trio']zdict[str, Any] | Nonezhttpx._types.CookieTypes | Nonezdict[str, str] | Noner   r.   )r"   base_urlr   r   r=   r?   cookiesrM   follow_redirectsr   r#   c                   s   t ||p
i d| _t|r |}ntt|}t|}|| _i | _t| j| j	||| j|
d}|d u rdi }|
dd t j||||	|d d S )N)r=   r?   )rG   r   r   r   r   z
user-agentr   )r   rM   	transportr   r   )r;   async_backendr+   r   r-   r,   r"   r   r   _portal_factory
setdefaultsuperr1   )r0   r"   r   r   r   r=   r?   r   rM   r   r   Zasgi_appr   	__class__r)   r*   r1   {  s2    
zTestClient.__init__z/Generator[anyio.abc.BlockingPortal, None, None]rJ   c                 c  sR   | j d ur| j V  n:tjjf i | j}|V  W d    n1 sD0    Y  d S r/   )rR   rf   from_threadstart_blocking_portalr   )r0   rR   r)   r)   r*   r     s    

zTestClient._portal_factoryrv   rz   filesr   paramsrM   r   authr   timeoutr   zhttpx._types.URLTypesz"httpx._types.RequestContent | Nonez_RequestData | Nonez httpx._types.RequestFiles | Noner   z#httpx._types.QueryParamTypes | Nonezhttpx._types.HeaderTypes | Nonez7httpx._types.AuthTypes | httpx._client.UseClientDefaultz%bool | httpx._client.UseClientDefaultz:httpx._types.TimeoutTypes | httpx._client.UseClientDefaultr   )r   r   rv   rz   r   r   r   rM   r   r   r   r   r   r#   c                  sF   |t jurtdt | |}t j|||||||||	|
|||dS )NzYou should not use the 'timeout' argument with the TestClient. See https://github.com/encode/starlette/issues/1108 for more information.r   )r   USE_CLIENT_DEFAULTwarningswarnDeprecationWarningZ
_merge_urlr   r   )r0   r   r   rv   rz   r   r   r   rM   r   r   r   r   r   r   r)   r*   r     s*    

zTestClient.requestr   rM   r   r   r   r   r   )	r   r   rM   r   r   r   r   r   r#   c          	   
     s   t  j||||||||dS Nr   )r   rY   	r0   r   r   rM   r   r   r   r   r   r   r)   r*   rY     s    zTestClient.getc          	   
     s   t  j||||||||dS r   )r   optionsr   r   r)   r*   r     s    zTestClient.optionsc          	   
     s   t  j||||||||dS r   )r   headr   r   r)   r*   r     s    zTestClient.head)r   rv   rz   r   r   r   rM   r   r   r   r   r   r#   c                  s$   t  j|||||||||	|
||dS Nr   )r   postr0   r   rv   rz   r   r   r   rM   r   r   r   r   r   r   r)   r*   r     s    zTestClient.postc                  s$   t  j|||||||||	|
||dS r   )r   putr   r   r)   r*   r   7  s    zTestClient.putc                  s$   t  j|||||||||	|
||dS r   )r   patchr   r   r)   r*   r  V  s    zTestClient.patchc          	   
     s   t  j||||||||dS r   )r   deleter   r   r)   r*   r  u  s    zTestClient.deletezSequence[str] | NonerB   )r   r   kwargsr#   c              
     s   t d|}|di }|dd |dd |dd |d urT|d	d
| ||d< zt jd|fi | W n* ty } z|j}W Y d }~nd }~0 0 td|S )Nzws://testserverrM   
connectionupgradezsec-websocket-keyztestserver==zsec-websocket-versionZ13r   z, GETzExpected WebSocket upgrade)	r   rY   r   rx   r   r   rA   rC   RuntimeError)r0   r   r   r  rM   r   rC   r   r)   r*   websocket_connect  s    
zTestClient.websocket_connectr    c                   s   t  }|tjjf i j _ |jddfdd}t	t
j}t	t
j}g ||R D ]}||j qht| _t| _ j_ j |jdd fdd}| _W d    n1 s0    Y  S )Nr.   rJ   c                     s
   d  _ d S r/   )rR   r)   r   r)   r*   reset_portal  s    z*TestClient.__enter__.<locals>.reset_portalc                     s     j d S r/   )rV   wait_shutdownr)   rR   r0   r)   r*   r
    s    z+TestClient.__enter__.<locals>.wait_shutdown)rO   rP   rQ   rf   r   r   r   rR   rT   rg   rh   ri   rZ   r   stream_sendstream_receiveZstart_task_soonlifespanr   rV   wait_startupr[   r\   )r0   r]   r	  r4   r3   Zchannelr
  r)   r  r*   r`     s&    
 


(zTestClient.__enter__ra   c                 G  s   | j   d S r/   )r\   rZ   rd   r)   r)   r*   rc     s    zTestClient.__exit__c              	     sX   d| j d}z2| || jj| jjI d H  W | jd I d H  n| jd I d H  0 d S )Nr  )rK   r   )r   r"   r  r3   r  r4   )r0   r2   r)   r)   r*   r    s    zTestClient.lifespanc                   s`    j ddiI d H  dd fdd}| I d H }|d dv sDJ |d dkr\| I d H  d S )	NrK   zlifespan.startupr   rJ   c                    s&    j  I d H } | d u r" j  | S r/   r  r3   r   rU   r_   r   r)   r*   r3     s    
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completelifespan.startup.failedr  r  r4   r0   r3   r_   r)   r   r*   r    s    zTestClient.wait_startupc                   s`   dd fdd} j ddiI d H  | I d H }|d dv sDJ |d dkr\| I d H  d S )	Nr   rJ   c                    s&    j  I d H } | d u r" j  | S r/   r  r  r   r)   r*   r3     s    
z)TestClient.wait_shutdown.<locals>.receiverK   zlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedr  r  r  r)   r   r*   r
    s    zTestClient.wait_shutdown)	r   Trp   r   NNNTr   )N)r7   r8   r9   Z__test__r@   rR   r1   rO   contextmanagerr   r   Z_clientr   r   rY   r   r   r   r   r  r  r  r`   rc   r  r  r
  __classcell__r)   r)   r   r*   r   v  s   
         ((0,&&&.#.#.#& r   )J
__future__r   rO   r%   r   r   rh   sysr   collections.abcr   r   r   r   r   r   concurrent.futuresr	   r
   typesr   typingr   r   r   r   r   r   urllib.parser   r   rf   Z	anyio.abcZanyio.from_threadZanyio.streams.stapledr   Zstarlette._utilsr   Zstarlette.typesr   r   r   r   r   Zstarlette.websocketsr   version_infor   Ztyping_extensionsr    r   ModuleNotFoundErrorr  abcZBlockingPortalrF   ZASGIInstancer-   rE   r<   r   Z_RequestDatar+   r,   r;   	ExceptionrA   r   rD   rB   ZBaseTransportr   ZClientr   r)   r)   r)   r*   <module>   sb     


i *