U
    nËj]p  ã                   @  s>  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	Z	d dl
mZ d dlmZ d dl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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! d dl"m#Z# ej$dk�rd dl	m%Z% nd dl&m%Z% zd dl'Z'W n e(k
�r8   e)dƒ‚Y nX e	j*g e	j+ej,j- f Z.e	j*ee!ge	j/d f Z0e	j*e ge0f Z1e	j*e ee!ge	j/d f Z2e	j3e4e	j5e4e	j6e4 e7f f Z8dddœdd„Z9G dd„ dƒZ:G dd„ de	j;ƒZ<G dd„ de=ƒZ>G dd„ de'j?e#ƒZ@G dd„ dƒZAG dd„ de'jBƒZCG d d!„ d!e'jDƒZEdS )"é    )ÚannotationsN)ÚFuture)Úcached_property)ÚGeneratorType)ÚunquoteÚurljoin)ÚObjectReceiveStreamÚObjectSendStream)ÚStapledObjectStream)Úis_async_callable)ÚASGIAppÚMessageÚReceiveÚScopeÚSend)ÚWebSocketDisconnect)é   é
   )Ú	TypeGuardz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   ú8/tmp/pip-unpacked-wheel-pzfrzqh9/starlette/testclient.pyÚ	_is_asgi31   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__<   s    z_WrapASGI2.__init__r   r   r   )ÚscopeÚreceiveÚsendr   c                 Ã  s   |   |¡}|||ƒI d H  d S r#   r   )r$   r&   r'   r(   Úinstancer   r   r   Ú__call__?   s    
z_WrapASGI2.__call__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r*   r   r   r   r   r    7   s   r    c                   @  s   e Zd ZU ded< ded< dS )Ú_AsyncBackendÚstrÚbackendúdict[str, typing.Any]Úbackend_optionsN)r+   r,   r-   Ú__annotations__r   r   r   r   r/   D   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#   )r7   )r$   r7   r   r   r   r%   J   s    z_Upgrade.__init__N)r+   r,   r-   r%   r   r   r   r   r5   I   s   r5   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)r+   r,   r-   r.   r   r   r   r   r8   N   s   r8   c                   @  s.  e Zd Zdddddœdd„Zd dœd	d
„Zeddœdd„ƒZddœdd„Zdddœdd„Z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)œd*d+„Zd=d.d/dd0œd1d2„Zddœd3d4„Zd dœd5d6„Zd$dœd7d8„Zd>d(dd9œd:d;„Zd-S )?r6   ÚASGI3Appr   Ú_PortalFactoryTyper"   )r   r&   Úportal_factoryr   c                 C  s6   || _ || _d | _|| _t ¡ | _t ¡ | _d | _d S r#   )	r   r&   Úaccepted_subprotocolr;   ÚqueueÚQueueÚ_receive_queueÚ_send_queueÚextra_headers)r$   r   r&   r;   r   r   r   r%   Y   s    

zWebSocketTestSession.__init__©r   c                 C  s�   t  ¡ | _| j |  ¡ ¡| _z2| j | j¡}|  ddi¡ |  	¡ }|  
|¡ W n  tk
rn   | j ¡  ‚ Y nX | dd ¡| _| dd ¡| _| S )NÚtypezwebsocket.connectÚsubprotocolÚheaders)Ú
contextlibÚ	ExitStackÚ
exit_stackÚenter_contextr;   ÚportalÚstart_task_soonÚ_runr(   r'   Ú_raise_on_closeÚ	ExceptionÚcloseÚgetr<   rA   )r$   Ú_Úmessager   r   r   Ú	__enter__g   s    

zWebSocketTestSession.__enter__zanyio.Eventc                 C  s   t  ¡ S r#   )ÚanyioÚEvent©r$   r   r   r   Úshould_closew   s    z!WebSocketTestSession.should_closec                 Ã  s   | j  ¡  d S r#   )rW   ÚsetrV   r   r   r   Ú_notify_close{   s    z"WebSocketTestSession._notify_closeú
typing.Any©Úargsr   c              	   G  sR   z|  d¡ W 5 | j  | j¡ | j ¡  X | j ¡ sN| j ¡ }t|t	ƒr*|‚q*d S )Néè  )
rJ   rK   rY   rH   rO   r@   ÚemptyrP   Ú
isinstanceÚBaseException)r$   r\   rR   r   r   r   Ú__exit__~   s    


zWebSocketTestSession.__exit__c              
   ƒ  s`   dddœ‡ fdd„}t  ¡ 4 I dH š,}| ||¡ ˆ j ¡ I dH  |j ¡  W 5 Q I dH R X dS )zE
        The sub-thread in which the websocket session runs.
        zanyio.abc.TaskGroupr"   )Útgr   c              
   “  s|   zjzˆ  ˆ jˆ jˆ j¡I d H  W nF t ¡ k
r8   Y n0 tk
rf } zˆ j	 
|¡ ‚ W 5 d }~X Y nX W 5 | j  ¡  X d S r#   )Úcancel_scopeÚcancelr   r&   Ú_asgi_receiveÚ
_asgi_sendrT   Zget_cancelled_exc_classr`   r@   Úput)rb   ÚexcrV   r   r   Úrun_appŽ   s    z*WebSocketTestSession._run.<locals>.run_appN)rT   Zcreate_task_groupZ
start_soonrW   Úwaitrc   rd   )r$   ri   rb   r   rV   r   rL   ‰   s
    zWebSocketTestSession._runr   c                 Ã  s0   | j  ¡ r&t ¡ | _| j ¡ I d H  q | j  ¡ S r#   )r?   r^   rT   rU   Ú_queue_eventrj   rP   rV   r   r   r   re   ž   s    

z"WebSocketTestSession._asgi_receive©rR   r   c                 Ã  s   | j  |¡ d S r#   )r@   rg   ©r$   rR   r   r   r   rf   ¤   s    zWebSocketTestSession._asgi_sendc                 C  s˜   |d dkr*t | dd¡| dd¡d�‚nj|d dkr”|d	 }|d
 }g }|  ¡ }|d dksbt‚| |d ¡ | dd¡sJq€qJt||d |¡d�‚d S )NrC   zwebsocket.closeÚcoder]   ÚreasonÚ )rn   ro   zwebsocket.http.response.startÚstatusrE   zwebsocket.http.response.bodyÚbodyÚ	more_bodyFó    )Ústatus_coderE   Úcontent)r   rP   r'   ÚAssertionErrorÚappendr8   Újoin)r$   rR   ru   rE   rr   r   r   r   rM   §   s    z$WebSocketTestSession._raise_on_closec                 C  s*   | j  |¡ t| dƒr&| j | jj¡ d S )Nrk   )r?   rg   r   rJ   rK   rk   rX   rm   r   r   r   r(   ¶   s    
zWebSocketTestSession.sendr0   )Údatar   c                 C  s   |   d|dœ¡ d S )Núwebsocket.receive©rC   Útext©r(   ©r$   rz   r   r   r   Ú	send_text»   s    zWebSocketTestSession.send_textÚbytesc                 C  s   |   d|dœ¡ d S )Nr{   ©rC   r�   r~   r   r   r   r   Ú
send_bytes¾   s    zWebSocketTestSession.send_bytesr}   z"typing.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Údumpsr(   Úencode)r$   rz   r„   r}   r   r   r   Ú	send_jsonÁ   s    zWebSocketTestSession.send_jsonr]   NÚintz
str | None)rn   ro   r   c                 C  s   |   d||dœ¡ d S )Nzwebsocket.disconnect)rC   rn   ro   r~   )r$   rn   ro   r   r   r   rO   È   s    zWebSocketTestSession.closec                 C  s   | j  ¡ }t|tƒr|‚|S r#   )r@   rP   r_   r`   rm   r   r   r   r'   Ë   s    

zWebSocketTestSession.receivec                 C  s"   |   ¡ }|  |¡ t t|d ¡S )Nr}   )r'   rM   ÚtypingÚcastr0   rm   r   r   r   Úreceive_textÑ   s    
z!WebSocketTestSession.receive_textc                 C  s"   |   ¡ }|  |¡ t t|d ¡S )Nr�   )r'   rM   r�   r�   r�   rm   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‰   )r'   rM   ÚdecoderŠ   Úloads)r$   r„   rR   r}   r   r   r   Úreceive_jsonÛ   s    

z!WebSocketTestSession.receive_json)r}   )r]   N)r}   )r+   r,   r-   r%   rS   r   rW   rY   ra   rL   re   rf   rM   r(   r€   rƒ   r�   rO   r'   r‘   r’   r•   r   r   r   r   r6   X   s&   r6   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   r9   r:   Úboolr0   útuple[str, int]r2   r"   )r   r;   Úraise_server_exceptionsÚ	root_pathÚclientÚ	app_stater   c                C  s(   || _ || _|| _|| _|| _|| _d S r#   )r   r™   rš   r;   rœ   r›   )r$   r   r;   r™   rš   r›   rœ   r   r   r   r%   æ   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|krl| dd¡\}}	t|	ƒ}
n|}|}
dˆj	kr„g }n0|
|krœd	| 
¡ fg}nd	|› d|
› � 
¡ fg}|d
d„ ˆj	 ¡ D ƒ7 }|dk�rbˆj	 dd ¡}|d kròg }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"„}z6|  ¡ �$}| tj¡‰| | j|||¡ W 5 Q R X W n0 tk
�r` } z| j�rP|‚W 5 d }~X Y nX | j�rzˆ�s�td#ƒ‚nˆ�s�d$g t ¡ d%œ‰t  ˆd  !¡ ¡ˆd< tj"f ˆd&ˆi—Ž}ˆd k	�rÐˆ|_#ˆ |_$|S )'NÚascii)ÚencodingéP   i»  )ÚhttpÚwsÚhttpsÚwssr†   é   Úhosts   hostc                 S  s$   g | ]\}}|  ¡  ¡ | ¡ f‘qS r   )ÚlowerrŒ   ©Ú.0ÚkeyÚvaluer   r   r   Ú
<listcomp>  s     z7_TestClientTransport.handle_request.<locals>.<listcomp>>   r¥   r£   úsec-websocket-protocolc                 S  s   g | ]}|  ¡ ‘qS r   )Ústrip)rª   r¬   r   r   r   r­     s     r…   Z	websocketó   ?r   zwebsocket.http.response)rC   ÚpathÚraw_pathrš   ÚschemeÚquery_stringrE   r›   ÚserverÚsubprotocolsÚstateÚ
extensionsr¢   z1.1úhttp.response.debug)rC   Úhttp_versionÚmethodr±   r²   rš   r³   r´   rE   r›   rµ   r¸   r·   FÚstreamr   rB   c                  “  s¼   ˆr"ˆ  ¡ sˆ ¡ I d H  ddiS ˆ  ¡ } t| tƒr@|  d¡}nn| d krNd}n`t| tƒrªz,|  d ¡}t|tƒrx| d¡}d|ddœW S  tk
r¦   d‰dddœ Y S X n| }d‰d|dœS )	NrC   zhttp.disconnectr‰   rt   zhttp.requestT)rC   rr   rs   )rC   rr   )	Úis_setrj   Úreadr_   r0   rŒ   r   r(   ÚStopIteration)rr   Z
body_bytesÚchunk)rž   Úrequest_completeÚresponse_completer   r   r'   B  s*    




z4_TestClientTransport.handle_request.<locals>.receiver"   rl   c                 “  sà   | d dkrDˆrt dƒ‚| d ˆd< dd„ |  dg ¡D ƒˆd< d	‰n˜| d d
kr¸ˆs\t dƒ‚ˆ ¡ rlt dƒ‚|  dd¡}|  dd¡}ˆjdkrœˆd  |¡ |sÜˆd  d¡ ˆ ¡  n$| d dkrÜ| d d ‰| d d ‰ d S )NrC   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­   d  s     zE_TestClientTransport.handle_request.<locals>.send.<locals>.<listcomp>rE   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)rw   rP   r½   r»   ÚwriteÚseekrX   )rR   rr   rs   )rÆ   Ú
raw_kwargsrž   rÂ   Úresponse_startedrÅ   r   r   r(   ^  s$    

z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.iô  )ru   rE   r¼   rž   )%Úurlr³   Únetlocr“   r±   r²   ÚqueryÚsplitrŽ   rE   rŒ   Zmulti_itemsrP   r   rš   r›   rœ   Úcopyr6   r   r;   r5   r»   ÚioÚBytesIOÚcallrT   rU   r`   r™   rw   ÚhttpxZ
ByteStreamr¾   ÚResponserÅ   rÆ   )r$   rž   r³   rÌ   r±   r²   rÍ   Údefault_portr§   Zport_stringÚportrE   rD   r¶   r&   r7   r'   r(   rJ   rh   Úresponser   )rÆ   rÉ   rž   rÁ   rÂ   rÊ   rÅ   r   Úhandle_request÷   sœ    


ôó
 ý
z#_TestClientTransport.handle_requestN)Trp   )r+   r,   r-   r%   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< dLd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dMdd<d!d=d>œ‡ fd?d@„Zd dœdAdB„Zd!ddCœdDdE„ZddœdFdG„ZddœdHdI„ZddœdJdK„Z‡  ZS )NÚ
TestClientFzFuture[None]ÚtaskNzanyio.abc.BlockingPortal | NonerJ   úhttp://testserverTrp   Úasyncio©Ú
testclientiPÃ  r   r0   r—   z#typing.Literal[('asyncio', 'trio')]zdict[str, typing.Any] | Nonezhttpx._types.CookieTypes | Nonezdict[str, str] | Noner˜   r"   )r   Úbase_urlr™   rš   r1   r3   ÚcookiesrE   Úfollow_redirectsr›   r   c                   sŒ   t ||p
i d�| _t|ƒr |}nt t|¡}t|ƒ}|| _i | _t	| j| j
||| j|
d�}|d krfi }| dd¡ tƒ j||||	|d� d S )N)r1   r3   )r;   r™   rš   rœ   r›   z
user-agentrÞ   )rß   rE   Ú	transportrá   rà   )r/   Úasync_backendr   r�   r�   r!   r    r   rœ   r–   Ú_portal_factoryÚ
setdefaultÚsuperr%   )r$   r   rß   r™   rš   r1   r3   rà   rE   rá   r›   Zasgi_apprâ   ©Ú	__class__r   r   r%   “  s2    úûzTestClient.__init__z6typing.Generator[anyio.abc.BlockingPortal, None, None]rB   c              	   c  s:   | j d k	r| j V  n"tjjf | jŽ�}|V  W 5 Q R X d S r#   )rJ   rT   Úfrom_threadÚstart_blocking_portalrã   )r$   rJ   r   r   r   rä   »  s    

zTestClient._portal_factory©rv   rz   ÚfilesrŠ   ÚparamsrE   rà   Úauthrá   Útimeoutr¸   zhttpx._types.URLTypesz"httpx._types.RequestContent | Nonez_RequestData | Nonez httpx._types.RequestFiles | NonerZ   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í   rE   rà   rî   rá   rï   r¸   r   c                  s0   |   |¡}tƒ j|||||||||	|
|||d�S ©Nrë   )Z
_merge_urlræ   rž   )r$   r»   rË   rv   rz   rì   rŠ   rí   rE   rà   rî   rá   rï   r¸   rç   r   r   rž   Ã  s     
ózTestClient.request©rí   rE   rà   rî   rá   rï   r¸   )	rË   rí   rE   rà   rî   rá   rï   r¸   r   c          	   
     s   t ƒ j||||||||d�S ©Nrñ   )ræ   rP   ©	r$   rË   rí   rE   rà   rî   rá   rï   r¸   rç   r   r   rP   å  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í   rE   rà   rî   rá   rï   r¸   r   c                  s$   t ƒ j|||||||||	|
||d�S rð   )ræ   Úpost©r$   rË   rv   rz   rì   rŠ   rí   rE   rà   rî   rá   rï   r¸   rç   r   r   rö   *  s    ôzTestClient.postc                  s$   t ƒ j|||||||||	|
||d�S rð   )ræ   rg   r÷   rç   r   r   rg   I  s    ôzTestClient.putc                  s$   t ƒ j|||||||||	|
||d�S rð   )ræ   Úpatchr÷   rç   r   r   rø   h  s    ôzTestClient.patchc          	   
     s   t ƒ j||||||||d�S rò   )ræ   Údeleteró   rç   r   r   rù   ‡  s    øzTestClient.deleteztyping.Sequence[str] | Noner6   )rË   r¶   Úkwargsr   c              
     s¨   t d|ƒ}| di ¡}| dd¡ | dd¡ | dd¡ |d k	rT| d	d
 |¡¡ ||d< ztƒ jd|f|Ž W n( tk
rš } z
|j}W 5 d }~X Y n
X tdƒ‚|S )Nzws://testserverrE   Ú
connectionÚupgradezsec-websocket-keyztestserver==zsec-websocket-versionZ13r®   z, ÚGETzExpected WebSocket upgrade)	r   rP   rå   ry   ræ   rž   r5   r7   ÚRuntimeError)r$   rË   r¶   rú   rE   rh   r7   rç   r   r   Úwebsocket_connectž  s    
zTestClient.websocket_connectc              	     sÂ   t  ¡ �°}| tjjf ˆjŽ¡ ˆ_‰ |jddœ‡fdd„ƒ}t 	t
j¡\}}t 	t
j¡\}}t||ƒˆ_t||ƒˆ_ˆ  ˆj¡ˆ_ˆ  ˆj¡ |jddœ‡ ‡fdd„ƒ}| ¡ ˆ_W 5 Q R X ˆS )Nr"   rB   c                     s
   d ˆ _ d S r#   )rJ   r   rV   r   r   Úreset_portal¹  s    z*TestClient.__enter__.<locals>.reset_portalc                     s   ˆ   ˆj¡ d S r#   )rÒ   Úwait_shutdownr   ©rJ   r$   r   r   r  È  s    z+TestClient.__enter__.<locals>.wait_shutdown)rF   rG   rI   rT   ré   rê   rã   rJ   ÚcallbackZcreate_memory_object_streamÚmathÚinfr
   Ústream_sendÚstream_receiverK   ÚlifespanrÚ   rÒ   Úwait_startupÚpop_allrH   )r$   Ústackr   Zsend1Zreceive1Zsend2Zreceive2r  r   r  r   rS   µ  s    
zTestClient.__enter__r[   c                 G  s   | j  ¡  d S r#   )rH   rO   )r$   r\   r   r   r   ra   Ð  s    zTestClient.__exit__c              	   Ã  sF   d| j dœ}z |  || jj| jj¡I d H  W 5 | j d ¡I d H  X d S )Nr  )rC   r·   )rœ   r  r(   r   r  r'   )r$   r&   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ksDt‚|d dkr\|ƒ I d H  d S )	NrC   zlifespan.startuprZ   rB   c                  “  s&   ˆ j  ¡ I d H } | d kr"ˆ j ¡  | S r#   ©r  r'   rÚ   Úresult©rR   rV   r   r   r'   Ý  s    
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completeúlifespan.startup.failedr  )r  r(   rw   ©r$   r'   rR   r   rV   r   r	  Ú  s    zTestClient.wait_startupc                 ƒ  s    ddœ‡ fdd„}ˆ j 4 I d H šp ˆ j4 I d H šP ˆ j ddi¡I d H  |ƒ I d H }|d dksdt‚|d dkr||ƒ I d H  W 5 Q I d H R X W 5 Q I d H R X d S )	NrZ   rB   c                  “  s&   ˆ j  ¡ I d H } | d kr"ˆ j ¡  | S r#   r  r  rV   r   r   r'   ì  s    
z)TestClient.wait_shutdown.<locals>.receiverC   zlifespan.shutdown)zlifespan.shutdown.completeúlifespan.shutdown.failedr  )r  r  r(   rw   r  r   rV   r   r  ë  s     zTestClient.wait_shutdown)	rÛ   Trp   rÜ   NNNTrÝ   )N)r+   r,   r-   Z__test__r4   rJ   r%   rF   Úcontextmanagerrä   rÓ   Z_clientZUSE_CLIENT_DEFAULTrž   rP   rô   rõ   rö   rg   rø   rù   rÿ   rS   ra   r  r	  r  Ú__classcell__r   r   rç   r   rÙ   Ž  sÌ   
         õ((ñ0&ö&ö&ö&ò.#ò.#ò.#ö& ýrÙ   )FÚ
__future__r   rF   r   rÐ   rŠ   r  r=   Úsysr�   Úconcurrent.futuresr   Ú	functoolsr   Útypesr   Úurllib.parser   r   rT   Z	anyio.abcZanyio.from_threadr   r	   Zanyio.streams.stapledr
   Zstarlette._utilsr   Zstarlette.typesr   r   r   r   r   Zstarlette.websocketsr   Úversion_infor   Ztyping_extensionsrÓ   ÚModuleNotFoundErrorrþ   ÚCallableÚContextManagerÚabcZBlockingPortalr:   Ú	AwaitableZASGIInstancer!   r9   ÚMappingr0   ÚUnionÚIterabler�   Z_RequestDatar   r    Ú	TypedDictr/   rN   r5   rÔ   r8   r6   ZBaseTransportr–   ZClientrÙ   r   r   r   r   Ú<module>   s^   ÿ
 
þ
  *