a
     ÑOcü-  ã                   @   sü  d dl Z d dlZd dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZ d dlZd dlmZmZ d dlmZ ddlmZmZmZmZmZmZmZmZ zd dlZW n ey¶   dZY n0 zd dlZW n eyÚ   dZY n0 eeeef gee f Zdd	„ Z d
d„ Z!ej"dd„ ƒZ#ej"dd„ ƒZ$ej%dd„ ƒZ&ej%d0dd„ƒZ'dd„ Z(dd„ Z)dd„ Z*ej"dd„ ƒZ+ej"dd„ ƒZ,ej"dd „ ƒZej"d!d"„ ƒZ-ej"d#d$„ ƒZ.ej"d%d&„ ƒZ/ej"d'd(„ ƒZ0ej"d)d*„ ƒZ1ej"e j2e	eddf d+œd,d-„ƒZ3ej"d.d/„ ƒZ4dS )1é    N)ÚCallable)ÚAnyÚ	Awaitabler   ÚDictÚ	GeneratorÚOptionalÚUnion)ÚPY_37Úisasyncgenfunction)ÚApplicationé   )ÚBaseTestServerÚRawTestServerÚ
TestClientÚ
TestServerÚloop_contextÚsetup_test_loopÚteardown_test_loopÚunused_portc                 C   s:   | j ddddd� | j dddd	d� | j d
dddd� d S )Nú--aiohttp-fastÚ
store_trueFz*run tests faster by disabling extra checks)ÚactionÚdefaultÚhelpz--aiohttp-loopÚstoreÚpyloopz:run tests with specific loop: pyloop, uvloop, tokio or allú--aiohttp-enable-loop-debugzenable event loop debug mode)Z	addoption)Úparser© r   úL/var/www/html/gsl.tools/lib/python3.9/site-packages/aiohttp/pytest_plugin.pyÚpytest_addoption$   s$    üüür    c                    sb   | j ‰ tˆ ƒrd‰nt ˆ ¡r$d‰ndS d‰d| jvrH|  jd7  _d‰‡ ‡‡fdd„}|| _ dS )zjSet up pytest fixture.

    Allow fixtures to be coroutines. Run coroutine fixtures in an event loop.
    TFNÚrequest©r!   c                     s~   |d }ˆr|d= d|j vr$tdƒ‚| d¡‰ ˆrfˆ| i |¤Ž‰‡ ‡fdd„}| |¡ ˆ  ˆ ¡ ¡S ˆ  ˆ| i |¤Ž¡S d S )Nr!   Úloopz^Asynchronous fixtures must depend on the 'loop' fixture or be used in tests depending from it.c                      s(   zˆ   ˆ ¡ ¡W S  ty"   Y n0 d S ©N)Úrun_until_completeÚ	__anext__ÚStopAsyncIterationr   ©Ú_loopÚgenr   r   Ú	finalizerd   s    z8pytest_fixture_setup.<locals>.wrapper.<locals>.finalizer)ÚfixturenamesÚ	ExceptionZgetfixturevalueZaddfinalizerr%   r&   )ÚargsÚkwargsr!   r+   ©ÚfuncZis_async_genZstrip_requestr(   r   ÚwrapperO   s    
ÿ

z%pytest_fixture_setup.<locals>.wrapper)r1   r
   ÚasyncioÚiscoroutinefunctionÚargnames)Z
fixturedefr2   r   r0   r   Úpytest_fixture_setup9   s    

 r6   c                 C   s   | j  d¡S )z--fast config optionr   ©ÚconfigÚ	getoptionr"   r   r   r   Úfastr   s    r:   c                 C   s   | j  d¡S )z!--enable-loop-debug config optionr   r7   r"   r   r   r   Ú
loop_debugx   s    r;   c               	   c   st   t jdd��T} dV  dd„ | D ƒ}|rRtd t|ƒt|ƒdkrBdnd	d
 |¡¡ƒ‚W d  ƒ n1 sf0    Y  dS )záContext manager which checks for RuntimeWarnings.

    This exists specifically to
    avoid "coroutine 'X' was never awaited" warnings being missed.

    If RuntimeWarnings occur in the context a RuntimeError is raised.
    T)ÚrecordNc                 S   s"   g | ]}|j tkrd j|d�‘qS )z#{w.filename}:{w.lineno}:{w.message})Úw)ÚcategoryÚRuntimeWarningÚformat)Ú.0r=   r   r   r   Ú
<listcomp>‰   s   
þz,_runtime_warning_context.<locals>.<listcomp>z{} Runtime Warning{},
{}r   Ú ÚsÚ
)ÚwarningsÚcatch_warningsÚRuntimeErrorr@   ÚlenÚjoin)Ú	_warningsÚrwr   r   r   Ú_runtime_warning_context~   s    	þ ÿÿrM   Fc                 c   s(   | r| V  nt ƒ } | V  t| |d� dS )z–Passthrough loop context.

    Sets up and tears down a loop unless one is passed in via the loop
    argument when it's passed straight through.
    ©r:   N)r   r   )r#   r:   r   r   r   Ú_passthrough_loop_context–   s
    rO   c                 C   s(   |   |¡r$t |¡r$t|  ||¡ƒS dS )z%Fix pytest collecting for coroutines.N)Zfuncnamefilterr3   r4   ÚlistZ_genfunctions)Ú	collectorÚnameÚobjr   r   r   Úpytest_pycollect_makeitem§   s    rT   c              	      s¸   ˆ j  d¡}t ˆ j¡r´ˆ j d¡p0ˆ j dd¡}tƒ �h t||d��<}‡ fdd„ˆ j	j
D ƒ}| ˆ jf i |¤Ž¡ W d  ƒ n1 sˆ0    Y  W d  ƒ n1 s¦0    Y  dS dS )	zBRun coroutines in an event loop instead of a normal function call.r   Úproactor_loopr#   NrN   c                    s   i | ]}|ˆ j | “qS r   )Úfuncargs)rA   Úarg©Ú
pyfuncitemr   r   Ú
<dictcomp>¶   s   ÿz&pytest_pyfunc_call.<locals>.<dictcomp>T)r8   r9   r3   r4   ÚfunctionrV   ÚgetrM   rO   Z_fixtureinfor5   r%   rS   )rY   r:   Zexisting_loopr)   Ztestargsr   rX   r   Úpytest_pyfunc_call­   s    ÿþ
þRr]   c                 C   sÔ   d| j vrd S | jjj}dtji}td ur4tj|d< td urFtj|d< |dkrRd}i }| 	d¡D ]N}| 
d¡ }| d	¡}||vr¢|r`td
|t| ¡ ƒf ƒ‚nq`|| ||< q`| jdt| ¡ ƒt| ¡ ƒd� d S )NÚloop_factoryr   ÚuvloopÚtokioÚallzpyloop,uvloop?,tokio?ú,ú?z ?z&Unknown loop '%s', available loops: %s)Úids)r,   r8   ÚoptionZaiohttp_loopr3   ZDefaultEventLoopPolicyr_   ZEventLoopPolicyr`   ÚsplitÚendswithÚstripÚ
ValueErrorrP   ÚkeysZparametrizeÚvalues)ZmetafuncZloopsZavail_factoriesZ	factoriesrR   Úrequiredr   r   r   Úpytest_generate_tests¿   s4    





ÿÿÿrm   c                 c   s\   | ƒ }t  |¡ t|d��.}|r*| d¡ t  |¡ |V  W d  ƒ n1 sN0    Y  dS )z%Return an instance of the event loop.rN   TN)r3   Úset_event_loop_policyr   Z	set_debugÚset_event_loop)r^   r:   r;   Úpolicyr)   r   r   r   r#   á   s    


r#   c                  c   sf   t st ¡ } tj| _nt ¡ } t | ¡ t| jƒ� }t 	|¡ |V  W d   ƒ n1 sX0    Y  d S r$   )
r	   r3   Zget_event_loop_policyZProactorEventLoopZ_loop_factoryZWindowsProactorEventLoopPolicyrn   r   Znew_event_loopro   )rp   r)   r   r   r   rU   í   s    


rU   c                 C   s   t jdtdd� | S )Nz3Deprecated, use aiohttp_unused_port fixture insteadé   ©Ú
stacklevel©rF   ÚwarnÚDeprecationWarning)Úaiohttp_unused_portr   r   r   r   û   s    ýr   c                   C   s   t S )z1Return a port that is unused on the current host.)Ú_unused_portr   r   r   r   rw     s    rw   c                 #   s@   g ‰ddœ‡ ‡fdd„
}|V  ddœ‡fdd„}ˆ   |ƒ ¡ dS )z^Factory to create a TestServer instance, given an app.

    aiohttp_server(app, **kwargs)
    N©Úportc                ›   s4   t | |d�}|jf dˆ i|¤ŽI d H  ˆ |¡ |S ©Nry   r#   )r   Ústart_serverÚappend)Zapprz   r/   Úserver©r#   Úserversr   r   Úgo  s    
zaiohttp_server.<locals>.go©Úreturnc                   “   s   ˆ rˆ   ¡  ¡ I d H  q d S r$   ©ÚpopÚcloser   ©r€   r   r   Úfinalize  s    z aiohttp_server.<locals>.finalize©r%   ©r#   r�   rˆ   r   r   r   Úaiohttp_server  s
    r‹   c                 C   s   t jdtdd� | S )Nz.Deprecated, use aiohttp_server fixture insteadrq   rr   rt   )r‹   r   r   r   Útest_server"  s    ýrŒ   c                 #   s@   g ‰ddœ‡ ‡fdd„
}|V  ddœ‡fdd„}ˆ   |ƒ ¡ dS )zpFactory to create a RawTestServer instance, given a web handler.

    aiohttp_raw_server(handler, **kwargs)
    Nry   c                ›   s4   t | |d�}|jf dˆ i|¤ŽI d H  ˆ |¡ |S r{   )r   r|   r}   )Úhandlerrz   r/   r~   r   r   r   r�   4  s    
zaiohttp_raw_server.<locals>.gor‚   c                   “   s   ˆ rˆ   ¡  ¡ I d H  q d S r$   r„   r   r‡   r   r   rˆ   <  s    z$aiohttp_raw_server.<locals>.finalizer‰   rŠ   r   r   r   Úaiohttp_raw_server,  s
    rŽ   c                 C   s   t jdtdd� | S )Nz2Deprecated, use aiohttp_raw_server fixture insteadrq   rr   rt   )rŽ   r   r   r   Úraw_test_serverC  s    ýr�   )r#   rƒ   c                 #   sb   g ‰ ddœt ttf tttttf  ttdœ‡ ‡fdd„}|V  ddœ‡ fdd„}ˆ |ƒ ¡ dS )	zžFactory to create a TestClient instance.

    aiohttp_client(app, **kwargs)
    aiohttp_client(server, **kwargs)
    aiohttp_client(raw_server, **kwargs)
    N)Úserver_kwargs)Ú__paramr.   r�   r/   rƒ   c                Ÿ   sÈ   t | tƒr4t | ttfƒs4| ˆg|¢R i |¤Ž} i }n|r@J dƒ‚t | tƒr||pPi }t| fdˆi|¤Ž}t|fdˆi|¤Ž}n0t | tƒrœt| fdˆi|¤Ž}ntdt| ƒ ƒ‚| ¡ I d H  ˆ  	|¡ |S )Nzargs should be emptyr#   zUnknown argument type: %r)
Ú
isinstancer   r   r   r   r   ri   Útyper|   r}   )r‘   r�   r.   r/   r~   Úclient©Úclientsr#   r   r   r�   [  s     ÿ


zaiohttp_client.<locals>.gor‚   c                   “   s   ˆ rˆ   ¡  ¡ I d H  q d S r$   r„   r   )r–   r   r   rˆ   y  s    z aiohttp_client.<locals>.finalize)	r   r   r   r   r   r   Ústrr   r%   rŠ   r   r•   r   Úaiohttp_clientO  s    
ý
ûr˜   c                 C   s   t jdtdd� | S )Nz.Deprecated, use aiohttp_client fixture insteadrq   rr   rt   )r˜   r   r   r   Útest_client€  s    ýr™   )F)5r3   Ú
contextlibrF   Úcollections.abcr   Útypingr   r   r   r   r   r   ZpytestZaiohttp.helpersr	   r
   Zaiohttp.webr   Z
test_utilsr   r   r   r   r   r   r   r   rx   r_   ÚImportErrorr`   ZAiohttpClientr    r6   Zfixturer:   r;   ÚcontextmanagerrM   rO   rT   r]   rm   r#   rU   rw   r‹   rŒ   rŽ   r�   ZAbstractEventLoopr˜   r™   r   r   r   r   Ú<module>   sh   $(

9


"


	


	

þ0