
    deU-                        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	m
Z
m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mZmZmZ 	 d dlZn# e$ r dZY nw xY weeeef         gee         f         Zeegee         f         Zeegee         f         Zd Z d Z!ej"        d	             Z#ej"        d
             Z$ej%        d             Z&ej%        dd            Z'd Z(d Z)d Z*ej"        d             Z+ej"        d             Z,ej"        deg e-f         deg e-f         fd            Zej"        deg e-f         fd            Z.ej"        de j/        dee         fd            Z0ej"        d             Z1ej"        de j/        dee         fd            Z2ej"        d             Z3ej"        de j/        dee         fd            Z4ej"        d             Z5dS )    N)Any	AwaitableCallableDictIteratorOptionalTypeUnion)isasyncgenfunction)Application   )BaseTestServerRawTestServer
TestClient
TestServerloop_contextsetup_test_loopteardown_test_loopunused_portc                     |                      dddd           |                      ddd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pyloopz3run tests with specific loop: pyloop, uvloop or all--aiohttp-enable-loop-debugzenable event loop debug mode)	addoption)parsers    5lib/python3.11/site-packages/aiohttp/pytest_plugin.pypytest_addoptionr"       s    
9	     B	     %+	          c                     | j         t                    rdnt          j                  rdndS dd| j        vr| xj        dz  c_        dfd}|| _         dS )zjSet up pytest fixture.

    Allow fixtures to be coroutines. Run coroutine fixtures in an event loop.
    TFNrequestr%   c                  J   |d         }r|d= d|j         vrt          d          |                    d          rJ | i |fd}|                    |                                                                         S                      | i |          S )Nr%   loopz^Asynchronous fixtures must depend on the 'loop' fixture or be used in tests depending from it.c                  v    	                                                                 S # t          $ r Y d S w xY wN)run_until_complete	__anext__StopAsyncIteration)_loopgens   r!   	finalizerz8pytest_fixture_setup.<locals>.wrapper.<locals>.finalizer`   sF     33CMMOODDD)   DDs   &* 
88)fixturenames	Exceptiongetfixturevalueaddfinalizerr+   r,   )	argskwargsr%   r0   r.   r/   funcis_async_genstrip_requests	       @@r!   wrapperz%pytest_fixture_setup.<locals>.wrapperK   s    # 	"y!
 ---6  
 ''// 	C $'''C        +++++CMMOO<<<++DD$,A&,A,ABBBr#   )r7   r   asyncioiscoroutinefunctionargnames)
fixturedefr:   r7   r8   r9   s     @@@r!   pytest_fixture_setupr?   5   s    
 ?D$ 		$T	*	*  	M
+++|+C C C C C C C@ JOOOr#   c                 6    | j                             d          S )z--fast config optionr   config	getoptionr&   s    r!   fastrD   n   s     >##$4555r#   c                 6    | j                             d          S )z!--enable-loop-debug config optionr   rA   r&   s    r!   
loop_debugrF   t   s     >##$ABBBr#   c            
   #   >  K   t          j        d          5 } dV  d | D             }|rYt          d                    t	          |          t	          |          dk    rdndd	                    |                              	 ddd           dS # 1 swxY w Y   dS )
zContext 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                 Z    g | ](}|j         t          k    d                     |          )S )z#{w.filename}:{w.lineno}:{w.message})w)categoryRuntimeWarningformat).0rJ   s     r!   
<listcomp>z,_runtime_warning_context.<locals>.<listcomp>   s@     
 
 
z^++ 28818==+++r#   z{} Runtime Warning{},
{}r    s
)warningscatch_warningsRuntimeErrorrM   lenjoin)	_warningsrws     r!   _runtime_warning_contextrZ   z   s      
	 	-	-	- 
 

 
 

  	+22GG3r77a<<RRS$))B--   	                 s   A,BBBFc              #   `   K   | r| V  dS t                      } | V  t          | |           dS )zPassthrough loop context.

    Sets up and tears down a loop unless one is passed in via the loop
    argument when it's passed straight through.
    rD   N)r   r   )r(   rD   s     r!   _passthrough_loop_contextr]      sL        ,




   


4d++++++r#   c                     |                      |          r7t          j        |          r%t          |                     ||                    S dS dS )z%Fix pytest collecting for coroutines.N)funcnamefilterr;   r<   list_genfunctions)	collectornameobjs      r!   pytest_pycollect_makeitemre      s\    %% 8'*Ec*J*J 8I++D#667778 8 8 8r#   c           	           j                             d          }t          j         j                  r j                            d          p j                            dd          }t                      5  t          ||          5 } fd j	        j
        D             }|                      j        di |           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   dS dS )	zBRun coroutines in an event loop instead of a normal function call.r   proactor_loopr(   Nr\   c                 ,    i | ]}|j         |         S  )funcargs)rN   arg
pyfuncitems     r!   
<dictcomp>z&pytest_pyfunc_call.<locals>.<dictcomp>   s3        ,S1  r#   Tri   )rB   rC   r;   r<   functionrj   getrZ   r]   _fixtureinfor=   r+   rd   )rl   rD   existing_loopr.   testargss   `    r!   pytest_pyfunc_callrs      s   &&'788D":#677 "+//
 
 3 $$VT22 	 &'' 	E 	E*=tDDD E   )6?   (()C)C()C)CDDDE E E E E E E E E E E E E E E	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E t s6   8C&
9CC&C	C&C	C&&C*-C*c           
      X   d| j         vrd S | j        j        j        }dt          j        i}t          t          j        |d<   |dk    rd}i }|                    d          D ]s}|	                    d           }|
                    d          }||vr7|r4t          d	|d
t          |                                                    h||         ||<   t|                     dt          |                                          t          |                                                     d S )Nloop_factoryr   uvloopallzpyloop,uvloop?,?z ?zUnknown loop 'z', available loops: )ids)r1   rB   optionaiohttp_loopr;   DefaultEventLoopPolicyrv   EventLoopPolicysplitendswithstrip
ValueErrorr`   keysparametrizevalues)metafuncloopsavail_factories	factoriesrc   requireds         r!   pytest_generate_testsr      sH   X222O"/E!?@O$*$:!~~ IC   0 0}}S)))zz$&&  jttT).."2"23335  
 )$/	$Y--//00d9>>;K;K6L6L      r#   c              #      K    |             }t          j        |           t          |          5 }|r|                    d           t          j        |           |V  ddd           dS # 1 swxY w Y   dS )z%Return an instance of the event loop.r\   TN)r;   set_event_loop_policyr   	set_debugset_event_loop)ru   rD   rF   policyr.   s        r!   r(   r(      s       \^^F!&)))	4	 	 	  E 	"OOD!!!u%%%	                 s   0A..A25A2c               #      K   t          j                    } t          j        |            t          | j                  5 }t          j        |           |V  d d d            d S # 1 swxY w Y   d S r*   )r;   WindowsProactorEventLoopPolicyr   r   new_event_loopr   )r   r.   s     r!   rg   rg      s      355F!&)))	f+	,	, u%%%                 s   A$$A(+A(aiohttp_unused_portreturnc                 >    t          j        dt          d           | S )Nz3Deprecated, use aiohttp_unused_port fixture instead   
stacklevelrS   warnDeprecationWarning)r   s    r!   r   r      s,    M=   
 r#   c                      t           S )z1Return a port that is unused on the current host.)_unused_portri   r#   r!   r   r      s
     r#   r(   c              #   r    K   g dd fd
}|V  dfd}                       |                       dS )z^Factory to create a TestServer instance, given an app.

    aiohttp_server(app, **kwargs)
    Nportc                   K   t          | |          } |j        ddi| d {V                      |           |S Nr   r(   ri   )r   start_serverappend)appr   r6   serverr(   serverss       r!   gozaiohttp_server.<locals>.go	  s`      Cd+++!f!66t6v666666666vr#   r   c                  p   K    r0                                                                   d {V   .d S d S r*   popcloser   s   r!   finalizez aiohttp_server.<locals>.finalize  Y       	(++--%%'''''''''  	( 	( 	( 	( 	(r#   r   Nr+   r(   r   r   r   s   `  @r!   aiohttp_serverr     s       G"         HHH( ( ( ( ( ( 	HHJJ'''''r#   c                 >    t          j        dt          d           | S )Nz.Deprecated, use aiohttp_server fixture insteadr   r   r   )r   s    r!   test_serverr     ,    M8   
 r#   c              #   r    K   g dd fd
}|V  dfd}                       |                       dS )zpFactory to create a RawTestServer instance, given a web handler.

    aiohttp_raw_server(handler, **kwargs)
    Nr   c                   K   t          | |          } |j        ddi| d {V                      |           |S r   )r   r   r   )handlerr   r6   r   r(   r   s       r!   r   zaiohttp_raw_server.<locals>.go*  s`      wT222!f!66t6v666666666vr#   r   c                  p   K    r0                                                                   d {V   .d S d S r*   r   r   s   r!   r   z$aiohttp_raw_server.<locals>.finalize2  r   r#   r   r   r   s   `  @r!   aiohttp_raw_serverr   "  s       G"&         HHH( ( ( ( ( ( 	HHJJ'''''r#   c                 >    t          j        dt          d           | S )Nz2Deprecated, use aiohttp_raw_server fixture insteadr   r   r   )r   s    r!   raw_test_serverr   9  s.     M<   
 r#   c              #      K   g dddt           t          t          f         dt          dt          t
          t          t          f                  dt          dt          f
 fd}|V  d
fd	}                      |                       dS )zFactory to create a TestClient instance.

    aiohttp_client(app, **kwargs)
    aiohttp_client(server, **kwargs)
    aiohttp_client(raw_server, **kwargs)
    N)server_kwargs__paramr5   r   r6   r   c                  K   t          | t                    r+t          | t          t          f          s | g|R i |} i }n|r
J d            t          | t                    r#|pi }t	          | fdi|}t          |fdi|}nDt          | t                    rt          | fdi|}nt          dt          |           z            |                                 d {V  	                    |           |S )Nzargs should be emptyr(   zUnknown argument type: %r)

isinstancer   r   r   r   r   r   typer   r   )r   r   r5   r6   r   clientclientsr(   s         r!   r   zaiohttp_client.<locals>.goQ  sJ      gx(( 	4k>22
 2
 	4 gd4T444V44GFF333333g{++ 	J)/RMDDdDmDDF<<T<V<<FF00 	J==d=f==FF84==HIII!!#########vr#   c                  p   K    r0                                                                   d {V   .d S d S r*   r   )r   s   r!   r   z aiohttp_client.<locals>.finalizeo  r   r#   r   )	r
   r   r   r   r   r   strr   r+   )r(   r   r   r   s   `  @r!   aiohttp_clientr   E  s       G
 37  {N23  S#X/ 	
 
      8 HHH( ( ( ( ( ( 	HHJJ'''''r#   c                 >    t          j        dt          d           | S )Nz.Deprecated, use aiohttp_client fixture insteadr   r   r   )r   s    r!   test_clientr   v  r   r#   )F)6r;   
contextlibrS   typingr   r   r   r   r   r   r	   r
   pytestaiohttp.helpersr   aiohttp.webr   
test_utilsr   r   r   r   r   r   r   r   r   rv   ImportErrorAiohttpClientAiohttpRawServerAiohttpServerr"   r?   fixturerD   rF   contextmanagerrZ   r]   re   rs   r   r(   rg   intr   AbstractEventLoopr   r   r   r   r   r   ri   r#   r!   <module>r      s         R R R R R R R R R R R R R R R R R R R R  . . . . . . # # # # # #	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	MMMM   FFF %^ ;<=y?TTU[M9]+CCD +	*(==>  *6 6 6r 6 6 6
 C C C
   . , , , , 8 8 8  $  @       Xb#g%6 8BG;L     Xb#g.    
 (2 (x7N ( ( ( (,    (W6 (8DT;U ( ( ( (,    -(

#-(m-( -( -( -(`     s   A AA