U
    d6{                     @  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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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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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mZ ddl
m Z  ddl!m"Z" ddl#m$Z$ e	% G dd dZ&da'G dd  d Z(G d!d" d"e&Z)G d#d$ d$Z*G d%d& d&Z+G d'd( d(Z,e- Z.d)d* Z/d+d, Z0d-d. Z1d/d0 Z2G d1d2 d2e&Z3G d3d4 d4e)ej4Z5G d5d6 d6e5Z6G d7d8 d8e)Z7G d9d: d:Z8dS );    )annotationsN   )
assertions)configschema)eq_)ne_)BasicEntity)ComparableEntity)ComparableMixin)adict)drop_all_tables_from_metadata   Column)event)funcInteger)selectTable)util)DeclarativeBase)events)MappedAsDataclass)registry)sort_tables_and_constraints)visitors)ClauseElementc                   @  s  e Zd ZdZdZdZdZdZd&ddZe	
 dd Ze	
 dd	 Ze	
 d
d Ze	
 dd Ze	
 dd Ze	j
dd Ze	j
dd Ze	
 dd Ze	
 dd Ze	
 dd Ze	
 dd Ze	j
dd Ze	
 dd Ze	j
d d! d"D d#d$d% ZdS )'TestBase NFc                 C  s   |st |d S N)AssertionError)selfvalmsgr"   r"   ?/tmp/pip-unpacked-wheel-wbr0uges/sqlalchemy/testing/fixtures.pyassert_@   s    zTestBase.assert_c                 c  s"   t jj}d t j_d V  |t j_d S r#   r   dbZ_compiled_cacher%   _cacher"   r"   r(   nocacheC   s    zTestBase.nocachec              	   c  s0   t | dd ptj}| }|V  W 5 Q R X d S Nbind)getattrr   r+   connect)r%   engconnr"   r"   r(   connection_no_transJ   s    
zTestBase.connection_no_transc                 c  sJ   t | dd ptj}| }| }|a|V  d a|jr>|  |  d S r/   )	r1   r   r+   r2   begin_connection_fixture_connectionZ	is_activerollbackclose)r%   r3   r4   transr"   r"   r(   
connectionQ   s    zTestBase.connectionc                 #  sj   g  g d fdd	}|V  D ]}z|   W q"   Y q"X q" D ]}z|  W qF   Y qFX qFd S )NFc                   s     |  |r |  d S r#   )append)resultconsumeto_closeZ
to_consumer"   r(   gok   s    
z/TestBase.close_result_when_finished.<locals>.go)F)allr9   )r%   rA   rr"   r?   r(   close_result_when_finishedf   s    z#TestBase.close_result_when_finishedc              	   c  s8   t |tt tddddid}|V  |  d S )N2   mysqlmariadboracle)metadatatype_annotation_map)r   strsaStringwith_variantdispose)r%   rI   regr"   r"   r(   r   |   s        zTestBase.registryc                 #  s,   | G  fdddt }|V  |j  d S )Nc                      s.   e Zd Z Zee eddddiZdS )z TestBase.decl_base.<locals>.BaserE   rF   rG   rH   N	__name__
__module____qualname__rI   rK   rL   rM   rN   rJ   r"   Z_mdr"   r(   Base   s       rV   )r   r   rO   r%   rI   rV   r"   rU   r(   	decl_base   s    zTestBase.decl_basec                 #  s.   | G  fdddt t}|V  |j  d S )Nc                      s,   e Zd Z Zee edddiZdS )z#TestBase.dc_decl_base.<locals>.BaserE   rF   rG   NrQ   r"   rU   r"   r(   rV      s      rV   )r   r   r   rO   rW   r"   rU   r(   dc_decl_base   s    zTestBase.dc_decl_basec                 c  s
   |V  d S r#   r"   )r%   future_enginer;   r"   r"   r(   future_connection   s    zTestBase.future_connectionc                 c  s
   d V  d S r#   r"   r%   r"   r"   r(   rZ      s    zTestBase.future_enginec                 #  s0   ddl m  d fdd	}|V   jd d S )Nr   enginesFc                   s(   |d kri }d|d<  j | ||||dS )Nfixturescope)urloptionsasynciotransfer_staticpool
share_pooltesting_engine)ra   rb   futurerc   rd   re   r]   r"   r(   gen_testing_engine   s    z3TestBase.testing_engine.<locals>.gen_testing_enginer_   )NNNFFF) r^   Ztesting_reaperZ_drop_testing_engines)r%   ri   r"   r]   r(   rg      s          zTestBase.testing_enginec                   s    fdd}|S )Nc                    s   d| d<  f | S )NTrc   r"   )kwrf   r"   r(   rA      s    z)TestBase.async_testing_engine.<locals>.gor"   )r%   rg   rA   r"   rf   r(   async_testing_engine   s    zTestBase.async_testing_enginec                 C  s   t  S r#   )fixture_sessionr\   r"   r"   r(   rm      s    zTestBase.fixture_sessionc              	   c  st   ddl m} | }||j_|V  |j`trdt rdt }|  t	  t
|t W 5 Q R X nt
|tj dS )z>Provide bound MetaData for a single test, dropping afterwards.r   r   N)sqlr   MetaDatainstancerI   r7   Zin_transactionZget_transactionr8   r6   r   r   r+   )r%   requestr   rI   r:   r"   r"   r(   rI      s"    
 zTestBase.metadatac                 C  s*   g | ]"}d D ]}dD ]}|||fqqqS ))noneexecuter6   TFr"   ).0r8   second_operationbegin_nestedr"   r"   r(   
<listcomp>   s     zTestBase.<listcomp>rt   )paramsc                   sP   |j \ td|tdtt| dd p.tj}|  fdd}|S )Ntestdatar0   c                   s  |   P} r@tjjjs&td |r4|  }n| }| |r\|  ddi n| ddi r~|	  n|
  dkrttjjd\ dkr|r|  ddi q| ddi ndkr|r|   n|  W 5 Q R X W 5 Q R X |r(|  dd	i n| dd	i n|r\|  ddi n| ddi |rr| 	  n| 
  nr|	  n|
  dkrVttjjd dkr |r|  ddi n| ddi nLdkr*t|dr |   n|    n"d
krL|rD|   n|  W 5 Q R X W 5 Q R X d} rr|d7 }s|d7 }|rt| tt | n2|  $}t|tt | W 5 Q R X d S )Nzsavepoints not enabledr{   
   rr   zCan't operate on closed transaction inside context manager.  Please complete the context manager before emitting further commands.rs      r6      rw   r   r   )r6   r   requirements
savepointsenabledZ	skip_testrw   rs   insertr8   commitr   Zexpect_raises_messagerL   excZInvalidRequestErrorhasattrr   Zscalarr   r   countselect_fromr2   )subjectZtrans_on_subjectZexecute_on_subjectr:   Znested_transZexpected_committedr4   rw   r8   rv   tr"   r(   run_test  s    




 











z4TestBase.trans_ctx_manager_fixture.<locals>.run_test)paramr   r   r   r1   r   r+   create)r%   rq   rI   r3   r   r"   r   r(   trans_ctx_manager_fixture   s    
xz"TestBase.trans_ctx_manager_fixture)N)rR   rS   rT   __requires__Z__unsupported_on__Z__only_on__Z__skip_if__Z"__leave_connections_for_teardown__r)   r   r_   r.   r5   r;   rD   r   rX   rY   r[   rZ   rg   rl   rm   rI   r   r"   r"   r"   r(   r!   +   sL   













r!   c                   @  s   e Zd ZdZdS )FutureEngineMixinz alembic's suite still using thisN)rR   rS   rT   __doc__r"   r"   r"   r(   r     s   r   c                   @  s  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZejddddd Zejdd	dd
d Zedd Zedd Zedd Zedd Zdd Zdd Zdd Zedd Zedd Zedd Zed d! Zed"d# Zed$d% Z d&d' Z!d(d) Z"ed*d+ Z#dS ),
TablesTestonceeachNTclassautouser`   c                 c  s0   | j }|  |  |  d V  |  d S r#   )	__class___init_class_setup_once_tables_setup_once_inserts_teardown_once_metadata_bindr%   clsr"   r"   r(   _setup_tables_test_class  s    z#TablesTest._setup_tables_test_classfunctionc                 c  s"   |    |   d V  |   d S r#   )_setup_each_tables_setup_each_inserts_teardown_each_tablesr\   r"   r"   r(   _setup_tables_test_instance  s    z&TablesTest._setup_tables_test_instancec                 C  s   | j S r#   )_tables_metadatar\   r"   r"   r(   tables_test_metadata  s    zTablesTest.tables_test_metadatac                 C  sX   | j dkr(| jdkrd| _| jdks(tt | _t | _t | _|  | _	t
 | _d S )Nr   r   )r   N)run_define_tablesrun_create_tablesrun_insertsr$   r   othertables	sequences
setup_bindr0   rL   ro   r   r   r"   r"   r(   r     s    


zTablesTest._init_classc              	   C  s6   | j dkr2|   | j }| | W 5 Q R X d S Nr   r   _load_fixturesr0   r6   insert_data)r   r4   r"   r"   r(   r     s    
zTablesTest._setup_once_insertsc                 C  sR   | j dkrN| | j | jdkr.| j| j | j| jj | j| jj	 d S r   
r   define_tablesr   r   
create_allr0   r   updater   Z
_sequencesr   r"   r"   r(   r     s    

zTablesTest._setup_once_tablesc                 C  sl   | j dkrP| | j | jdkr.| j| j | j| jj | j| jj	 n| jdkrh| j| j d S Nr   r   r\   r"   r"   r(   r     s    


zTablesTest._setup_each_tablesc              	   C  s6   | j dkr2|   | j }| | W 5 Q R X d S r   r   )r%   r4   r"   r"   r(   r     s    
zTablesTest._setup_each_insertsc                 C  sD  | j dkr8| j  | jdkr,t| j| j | j  n| jdkrPt| j| j ttj	dd}|rh|j
}| j dkr@| jdkr@| jdkr@| j }tdd t| jj D D ]~}z:|r|  ||  W 5 Q R X n||  W q tjjk
r2 } ztd||f tjd W 5 d }~X Y qX qW 5 Q R X d S )Nr   r   Fc                 S  s   g | ]\}}|d k	r|qS r#   r"   )ru   r   fksr"   r"   r(   rx     s   z4TablesTest._teardown_each_tables.<locals>.<listcomp>zError emptying table %s: %r)file)r   r   clearr   r   r   r0   r1   r   r   r   run_deletesr6   reversedr   valuesrw   rs   deleterL   r   Z
DBAPIErrorprintsysstderr)r%   r   r4   tableexr"   r"   r(   r     sD    




	

z TablesTest._teardown_each_tablesc                 C  sF   | j rt| j| j | jdkr*| | j d | j_| jd k	rBd | _d S r   )r   r   r   r0   run_dispose_binddispose_bindrun_setup_bindr   r"   r"   r(   r     s    

z'TablesTest._teardown_once_metadata_bindc                 C  s   t jS r#   )r   r+   r   r"   r"   r(   r     s    zTablesTest.setup_bindc                 C  s*   t |dr|  nt |dr&|  d S )NrO   r9   )r   rO   r9   )r   r0   r"   r"   r(   r   "  s    


zTablesTest.dispose_bindc                 C  s   d S r#   r"   )r   rI   r"   r"   r(   r   )  s    zTablesTest.define_tablesc                 C  s   i S r#   r"   r   r"   r"   r(   fixtures-  s    zTablesTest.fixturesc                 C  s   d S r#   r"   )r   r;   r"   r"   r(   r   1  s    zTablesTest.insert_datac                 C  s   |  | j|| d S r#   )Zassert_sql_countr0   )r%   r   fnr"   r"   r(   
sql_count_5  s    zTablesTest.sql_count_c                 C  s   |  | j|| d S r#   )Z
assert_sqlr0   )r%   Z	callable_Z
statementsr"   r"   r(   sql_eq_8  s    zTablesTest.sql_eq_c              
     s   i i   }|    D ]F\}t|dk r,qttr@| j |d  < |dd |< qt| jj D ]V\}dkrqn krqn| j	
 *}|  fdd| D  W 5 Q R X qndS )z4Insert rows as represented by the fixtures() method.r   r   r   Nc                   s   g | ]}t t  |qS r"   )dictzip)ru   Zcolumn_valuesheadersr   r"   r(   rx   P  s   z-TablesTest._load_fixtures.<locals>.<listcomp>)r   itemslen
isinstancerK   r   r   r   r   r0   r6   rs   r   )r   Zrowsr{   r   r4   r"   r   r(   r   ;  s,    



zTablesTest._load_fixtures)$rR   rS   rT   r   r   r   r   r   r   r0   r   r   r   r   r   r_   r   r   propertyr   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r(   r     sT   






)





r   c                   @  s"   e Zd Zejddddd ZdS )NoCacheTr   r   c                 c  s"   t jj}d t j_d V  |t j_d S r#   r*   r,   r"   r"   r(   _disable_cacheX  s    zNoCache._disable_cacheN)rR   rS   rT   r   r_   r   r"   r"   r"   r(   r   W  s   r   c                   @  s8   e Zd Zejdd Zdd Zejddddd	 Z	d
S )RemovesEventsc                 C  s   t  S r#   )setr\   r"   r"   r(   
_event_fnsa  s    zRemovesEvents._event_fnsc                 K  s(   | j |||f tj|||f| d S r#   )r   addr   listen)r%   targetnamer   rk   r"   r"   r(   event_listene  s    zRemovesEvents.event_listenTr   r   c                 c  s    d V  | j D ]}tj|  qd S r#   )r   r   remove)r%   keyr"   r"   r(   _remove_eventsi  s    
zRemovesEvents._remove_eventsN)
rR   rS   rT   r   Zmemoized_propertyr   r   r   r_   r   r"   r"   r"   r(   r   `  s
   
r   c                   @  s    e Zd Zejdddd ZdS )RemoveORMEventsGloballyT)r   c                 c  s<   d V  t j  t j  t j  t j  t j  d S r#   )
orm_eventsZMapperEvents_clearZInstanceEventsZSessionEventsZInstrumentationEventsZQueryEventsr\   r"   r"   r(   _remove_listenersq  s    



z)RemoveORMEventsGlobally._remove_listenersN)rR   rS   rT   r   r_   r   r"   r"   r"   r(   r   p  s   
r   c                  K  sD   |  dd |  dd | dtj}tjj|f| }t| |S )NZ	autoflushTZexpire_on_commitr0   )	
setdefaultpopr   r+   rL   ormSession_fixture_sessionsr   )rk   r0   sessr"   r"   r(   rm   ~  s    
rm   c                   C  s   t jj  t  d S r#   )rL   r   sessionclose_all_sessionsr   r   r"   r"   r"   r(   _close_all_sessions  s    r   c                 C  s   t   tj  d S r#   )r   rL   r   clear_mappersr   r"   r"   r(   stop_test_class_inside_fixtures  s    r   c                   C  s   t r
t  d S r#   )r   r   r"   r"   r"   r(   
after_test  s    r   c                   @  s   e Zd ZdS )ORMTestNrR   rS   rT   r"   r"   r"   r(   r     s   r   c                   @  s   e Zd ZdZdZdZejddddd Zejdd	dd
d Z	e
dd Ze
dd Ze
dd Zdd Zdd Ze
dd Ze
dd Zdd Zdd Ze
dd Ze
d d! ZdS )"
MappedTestr   r   NTr   r   c                 c  sZ   | j }|  |jd kr t |_|  |  |  |  d V  |  |	  d S r#   )
r   r   classesr   r   _setup_once_classes_setup_once_mappersr   _teardown_once_classr   r   r"   r"   r(   r     s    
z#MappedTest._setup_tables_test_classr   c                 c  sN   |    |   |   |   d V  tjj  |   | 	  | 
  d S r#   )r   _setup_each_classes_setup_each_mappersr   rL   r   r   r   _teardown_each_mappers_teardown_each_classesr   r\   r"   r"   r(   r     s    z&MappedTest._setup_tables_test_instancec                 C  s   | j   d S r#   )r   r   r   r"   r"   r(   r     s    zMappedTest._teardown_once_classc                 C  s   | j dkr| | j d S r   run_setup_classes_with_register_classessetup_classesr   r"   r"   r(   r     s    
zMappedTest._setup_once_classesc                 C  s*   | j dkr&|  \| _| _| | j d S r   )run_setup_mappers_generate_registrymapper_registrymapperr   setup_mappersr   r"   r"   r(   r     s    
zMappedTest._setup_once_mappersc                 C  s8   | j dkr|  \| j_| j_| j dkr4| | j d S )Nr   r   )r   r  r   r  r  r   r  r\   r"   r"   r(   r     s    

zMappedTest._setup_each_mappersc                 C  s   | j dkr| | j d S r   r   r\   r"   r"   r(   r     s    
zMappedTest._setup_each_classesc                 C  s   t | jd}||jfS )N)rI   )r   r   Zmap_imperatively)r   declr"   r"   r(   r    s    zMappedTest._generate_registryc                   sR   | j  G  fddd}G dd dt|}G dd dt|}|| _|| _|  dS )zRun a setup method, framing the operation with a Base class
        that will catch new subclasses to be established within
        the "classes" registry.

        c                      s$   e Zd Zdd fddZ  ZS )z0MappedTest._with_register_classes.<locals>._BaseNonereturnc                   s$   d k	st | | j< t   d S r#   r$   rR   super__init_subclass__r   r   cls_registryr"   r(   r    s    
zBMappedTest._with_register_classes.<locals>._Base.__init_subclass__)rR   rS   rT   r  __classcell__r"   r  r   r(   _Base  s   r  c                   @  s   e Zd ZdS )z0MappedTest._with_register_classes.<locals>.BasicNr   r"   r"   r"   r(   Basic  s   r  c                   @  s   e Zd ZdS )z5MappedTest._with_register_classes.<locals>.ComparableNr   r"   r"   r"   r(   
Comparable  s   r  N)r   r
   r   r  r  )r   r   r  r  r  r"   r  r(   r     s    z!MappedTest._with_register_classesc                 C  s   | j dkrtj  d S r   )r   rL   r   r   r\   r"   r"   r(   r     s    
z!MappedTest._teardown_each_mappersc                 C  s   | j dkr| j  d S r   )r   r   r   r\   r"   r"   r(   r     s    
z!MappedTest._teardown_each_classesc                 C  s   d S r#   r"   r   r"   r"   r(   r     s    zMappedTest.setup_classesc                 C  s   d S r#   r"   r   r"   r"   r(   r    s    zMappedTest.setup_mappers)rR   rS   rT   r   r   r   r   r_   r   r   r   r   r   r   r   r   r  r   r   r   r   r  r"   r"   r"   r(   r     s2   








r   c                      s4   e Zd ZdZdZedd Ze fddZ  ZS )DeclarativeMappedTestr   c                 C  s   d S r#   r"   r   r"   r"   r(   r     s    z(DeclarativeMappedTest._setup_once_tablesc                   sN    j G  fdddt}| _t |  jjrJ jrJ jt	j
 d S )Nc                      sN   e Zd ZejZjZee	
 e	
ddddiZdd fddZ  ZS )	z?DeclarativeMappedTest._with_register_classes.<locals>._DeclBaserE   rF   rG   rH   r  r  c                   s(   d k	st | | j< t jf | d S r#   r	  )r   rk   r  r"   r(   r  *  s    
zQDeclarativeMappedTest._with_register_classes.<locals>._DeclBase.__init_subclass__)rR   rS   rT   r   r   Z__table_cls__r   rI   rK   rL   rM   rN   rJ   r  r  r"   r   r  r  r(   	_DeclBase!  s       r  )r   r   ZDeclarativeBasicr
  r   r   r   r   r   r   r+   )r   r   r  r  r  r(   r     s    z,DeclarativeMappedTest._with_register_classes)	rR   rS   rT   r   r   r   r   r   r  r"   r"   r  r(   r    s   
r  c                   @  s:   e Zd Zd ZZdZdZedZ	dd Z
edd ZdS )	ComputedReflectionFixtureTestNT)Zcomputed_columnsZtable_reflectionz[\[\]\(\)\s`'\"]*c                 C  s   | j d| S )Nrj   )regexpsublower)r%   textr"   r"   r(   	normalizeA  s    z'ComputedReflectionFixtureTest.normalizec           	      C  sx  ddl m} ddl m} ddlm} ddlm} ddlm} |d||d|d	d
|d||d||d|d|dd |d||d|d	d
|d||d||d}|jjj	r|d||d|d	d
|d||d||dt
jd}|jjj	r(||d||ddd |jjj	r(||d||ddd |jjj	rt||d||dd	d |jjj	rt||d||dd	d d S )Nr   r   )testingr   )Computedr   Zcomputed_default_tableidT)Zprimary_keynormalZcomputed_colznormal + 42Zwith_defaultZ42)Zserver_defaultZcomputed_column_tableZcomputed_no_flagznormal / 42r   Zcomputed_virtualz
normal + 2F)Z	persistedz
normal / 2Zcomputed_storedznormal - 42znormal * 42)rj   r   r  r   r   r  r   requiresZschemasr   r   Ztest_schemaZcomputed_columns_virtualZappend_columnZcomputed_columns_stored)	r   rI   r   r  r   r  r   r   t2r"   r"   r(   r   D  sz    	
	



z+ComputedReflectionFixtureTest.define_tables)rR   rS   rT   r   r   Z__backend__r   recompiler  r  r   r   r"   r"   r"   r(   r  9  s   
r  c                   @  s$   e Zd Zdd Zdd Zdd ZdS )CacheKeyFixturec                 C  s   |  }|  }|d kr6|jds(t|d kstnNt|j|j tt|jt|j t|j|jD ]\}}|j	||dshtqh||fS )Nr.   compare_values)
_generate_cache_key_annotationsgetr$   r   r   hashr   
bindparamscompare)r%   abr'  a_keyb_keya_paramb_paramr"   r"   r(   _compare_equal  s    zCacheKeyFixture._compare_equalc                 C  s  | }| }t tt|dD ]\}}||krX| || || |\}}|d krVq n||  }||  }|d ks|d kr|d kr|| jdst|d kr || jds tq |j	|j	krt
|j|jD ]\}	}
|	j|
|ds qqt|j	|j	 nt|j	|j	 t|| tr t|| tr g }g }t|| D ]}|jdkrD|| qDt|| D ]}|jdkrp|| qptt|jdd dtt|dd d tt|jd	d dtt|d
d d q d S )Nr   r.   r&  Z	bindparamc                 S  s   | j S r#   r   r/  r"   r"   r(   <lambda>      z8CacheKeyFixture._run_cache_key_fixture.<locals>.<lambda>r5  c                 S  s   | j S r#   r5  r6  r"   r"   r(   r7    r8  c                 S  s   | j S r#   r5  r6  r"   r"   r(   r7    r8  c                 S  s   | j S r#   r5  r6  r"   r"   r(   r7    r8  )	itertoolscombinations_with_replacementranger   r4  r(  r)  r*  r$   r   r   r,  r-  r	   r   r    r   ZiterateZ__visit_name__r<   r   sortedr   Zunique_list)r%   r_   r'  case_acase_br.  r/  r0  r1  r2  r3  Zassert_a_paramsZassert_b_paramselemr"   r"   r(   _run_cache_key_fixture  sx    
        z&CacheKeyFixture._run_cache_key_fixturec                 C  sD   | }| }t tt|dD ]\}}| || || | q d S )Nr   )r9  r:  r;  r   r4  )r%   r_   r'  r=  r>  r.  r/  r"   r"   r(   _run_cache_key_equal_fixture  s    
 z,CacheKeyFixture._run_cache_key_equal_fixtureN)rR   rS   rT   r4  r@  rA  r"   r"   r"   r(   r%    s   Kr%  )9
__future__r   r9  r#  r   Z
sqlalchemyrL   rj   r   r   r   r   r	   entitiesr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rn   r   Zsql.elementsr    Zmark_base_test_classr!   r7   r   r   r   r   r   r   r   rm   r   r   r   r   ZAssertsExecutionResultsr   r  r  r%  r"   r"   r"   r(   <module>
   sb     U R	x$P