B
    KLcx                 @   s  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
 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eZ da!e j"dd Z#G dd deZ$G dd de Z%G dd deZ&G d d! d!eZ'e( Z)d"d# Z*d$d% Z+d&d' Z,d(d) Z-G d*d+ d+e Z.G d,d- d-e%ej/Z0G d.d/ d/e0Z1G d0d1 d1e%Z2G d2d3 d3eZ3dS )4    N   )
assertions)config)schema)eq_)ne_)BasicEntity)ComparableEntity)ComparableMixin)adict)drop_all_tables_from_metadata   )event)util)declarative_base)registry)DeclarativeMeta)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	
 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   :lib/python3.7/site-packages/sqlalchemy/testing/fixtures.pyassert_7   s    zTestBase.assert_c             c   s"   t jj}d t j_d V  |t j_d S )N)r   db_compiled_cache)r   _cacher   r   r   nocache:   s    zTestBase.nocachec          	   c   s0   t | dd ptj}| }|V  W d Q R X d S )Nbind)getattrr   r   connect)r   engconnr   r   r   connection_no_transA   s    
zTestBase.connection_no_transc             c   sJ   t | dd ptj}| }| }|a|V  d a|jr>|  |  d S )Nr"   )	r#   r   r   r$   begin_connection_fixture_connectionZ	is_activerollbackclose)r   r%   r&   transr   r   r   
connectionH   s    zTestBase.connectionc             #   sr   g  g d fdd	}|V  x&D ]}y|   W q$   Y q$X q$W x& D ]}y|  W qL   Y qLX qLW d S )NFc                s     |  |r |  d S )N)append)resultZconsume)to_close
to_consumer   r   gob   s    
z/TestBase.close_result_when_finished.<locals>.go)F)allr+   )r   r2   rr   )r0   r1   r   close_result_when_finished]   s    


z#TestBase.close_result_when_finishedc             c   s   t |d}|V  |  d S )N)metadata)r   dispose)r   r6   Zregr   r   r   r   s   s    
zTestBase.registryc             C   s   |  S )N)Zgenerate_base)r   r   r   r   r   	decl_basey   s    zTestBase.decl_basec             c   s
   |V  d S )Nr   )r   future_enginer-   r   r   r   future_connection}   s    zTestBase.future_connectionc          	   c   s0   t | dd ptj}t| d V  W d Q R X d S )Nr"   )r#   r   r   _push_future_engine)r   r%   r   r   r   r9      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futureasynciotransfer_staticpool)testing_engine)r?   r@   rA   rB   rC   )r<   r   r   gen_testing_engine   s    z3TestBase.testing_engine.<locals>.gen_testing_enginer=   )NNNFF) r<   Ztesting_reaperZ_drop_testing_engines)r   rE   r   )r<   r   rD      s        zTestBase.testing_enginec                s    fdd}|S )Nc                 s   d| d<  f | S )NTrB   r   )kw)rD   r   r   r2      s    z)TestBase.async_testing_engine.<locals>.gor   )r   rD   r2   r   )rD   r   async_testing_engine   s    zTestBase.async_testing_enginec             C   s   t  S )N)fixture_session)r   r   r   r   rI      s    zTestBase.fixture_sessionc          	   c   st   ddl m} | }||j_|V  |j`trdt rdt }|  t	  t
|t W dQ R X nt
|tj dS )z>Provide bound MetaData for a single test, dropping afterwards.r   )r   N)sqlr   MetaDatainstancer6   r)   Zin_transactionZget_transactionr*   r(   r   r   r   )r   requestr   r6   r,   r   r   r   r6      s    
zTestBase.metadatac             C   s*   g | ]"}d D ]}dD ]}|||fqqqS ))noneexecuter(   )TFr   ).0r*   second_operationbegin_nestedr   r   r   
<listcomp>   s   zTestBase.<listcomp>)TF)Zparamsc                s~   |j \ ddlm}m}m}mm ddlm |d||d|t	| dd pVt
j}|  fdd	}|S )
Nr   )TableColumnIntegerfuncselectr   )r   Ztestdatar"   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 d Q R X W d 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 d Q R X W d Q R X d} rr|d7 }s|d7 }|r|  | n2|  $}| | W d Q R X d S )Nzsavepoints not enabledrY   
   rN   zCan't operate on closed transaction inside context manager.  Please complete the context manager before emitting further commands.rO      r(      rR   r   r   )r(   r   requirements
savepointsenabledZ	skip_testrR   rO   insertr*   Zcommitr   Zexpect_raises_messagesaexcZInvalidRequestErrorhasattrZscalarcountZselect_fromr$   )ZsubjectZtrans_on_subjectZexecute_on_subjectr,   Znested_transZexpected_committedr&   )rR   r   rW   r*   rQ   rX   tr   r   run_test   s    
















z4TestBase.trans_ctx_manager_fixture.<locals>.run_test)Zparam
sqlalchemyrT   rU   rV   rW   rX   rF   r   r#   r   r   Zcreate)r   rM   r6   rT   rU   rV   r%   rf   r   )rR   r   rW   r*   rQ   rX   re   r   trans_ctx_manager_fixture   s    
xz"TestBase.trans_ctx_manager_fixture)N)__name__
__module____qualname____requires__Z__unsupported_on__Z__only_on__Z__skip_if__Z"__leave_connections_for_teardown__r   r   r=   r!   r'   r-   r5   r   r8   r:   r9   rD   rH   rI   r6   rh   r   r   r   r   r   "   s*   
r   c             c   sF   ddl m} ddlm} || }tj|| |V  tj| d S )Nr   )Enginer   )testing)	Zfuture.enginerm   rg   rn   Z_future_facader   Z_currentZpush_enginepop)Zenginerm   rn   Zfacader   r   r   r;   \  s    
r;   c               @   s"   e Zd Zejddddd ZdS )FutureEngineMixinTclass)autouser>   c          	   c   s0   t | dd ptj}t| d V  W d Q R X d S )Nr"   )r#   r   r   r;   )r   r%   r   r   r   r;   k  s    
z%FutureEngineMixin._push_future_engineN)ri   rj   rk   r   r=   r;   r   r   r   r   rp   j  s   rp   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eachNTrq   )rr   r>   c             c   s0   | j }|  |  |  d V  |  d S )N)	__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 )N)_setup_each_tables_setup_each_inserts_teardown_each_tables)r   r   r   r   _setup_tables_test_instance  s    z&TablesTest._setup_tables_test_instancec             C   s   | j S )N)_tables_metadata)r   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 )Nru   rt   )ru   N)run_define_tablesrun_create_tablesrun_insertsr   r   othertables	sequences
setup_bindr"   ra   rK   r   )r{   r   r   r   rw     s    


zTablesTest._init_classc          	   C   s6   | j dkr2|   | j }| | W d Q R X d S )Nrt   )r   _load_fixturesr"   r(   insert_data)r{   r&   r   r   r   ry     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 )Nrt   )
r   define_tablesr   r   
create_allr"   r   updater   
_sequences)r{   r   r   r   rx     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 )Nru   )
r   r   r   r   r   r"   r   r   r   r   )r   r   r   r   r~     s    


zTablesTest._setup_each_tablesc          	   C   s6   | j dkr2|   | j }| | W d Q R X d S )Nru   )r   r   r"   r(   r   )r   r&   r   r   r   r     s    
zTablesTest._setup_each_insertsc             C   sJ  | 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rF| jdkrF| jdkrF| j }xtdd t| jj D D ]}y:|r|  ||  W d Q R X n||  W q tjjk
r6 } ztjd||f tjd W d d }~X Y qX qW W d Q R X d S )Nru   r^   Fc             S   s   g | ]\}}|d k	r|qS )Nr   )rP   re   fksr   r   r   rS     s   z4TablesTest._teardown_each_tables.<locals>.<listcomp>zError emptying table %s: %r)file)r   r   clearr   r   r   r"   r#   r   r]   r_   run_deletesr(   reversedr   valuesrR   rO   deletera   rb   Z
DBAPIErrorr   print_sysstderr)r   r^   r&   tableexr   r   r   r     s6    





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 )Nrt   )r   r   r   r"   run_dispose_binddispose_bindrun_setup_bind)r{   r   r   r   rz     s    

z'TablesTest._teardown_once_metadata_bindc             C   s   t jS )N)r   r   )r{   r   r   r   r   
  s    zTablesTest.setup_bindc             C   s*   t |dr|  nt |dr&|  d S )Nr7   r+   )rc   r7   r+   )r{   r"   r   r   r   r     s    


zTablesTest.dispose_bindc             C   s   d S )Nr   )r{   r6   r   r   r   r     s    zTablesTest.define_tablesc             C   s   i S )Nr   )r{   r   r   r   fixtures  s    zTablesTest.fixturesc             C   s   d S )Nr   )r{   r-   r   r   r   r     s    zTablesTest.insert_datac             C   s   |  | j|| d S )N)Zassert_sql_countr"   )r   rd   fnr   r   r   
sql_count_!  s    zTablesTest.sql_count_c             C   s   |  | j|| d S )N)Z
assert_sqlr"   )r   Z	callable_Z
statementsr   r   r   sql_eq_$  s    zTablesTest.sql_eq_c          
      s   i i   }xX|    D ]H\}t|dk r.qttjrD| j |d  < |dd |< qW xjt| jj	 D ]V\}dkrqv krqv| j
 *}|  fdd| D  W dQ R X qvW dS )z4Insert rows as represented by the fixtures() method.r   r   r   Nc                s   g | ]}t t  |qS r   )dictzip)rP   Zcolumn_values)headersr   r   r   rS   =  s   z-TablesTest._load_fixtures.<locals>.<listcomp>)r   itemslen
isinstancer   Zstring_typesr   r   r   r   r"   r(   rO   r`   )r{   ZrowsrY   r   r&   r   )r   r   r   r   '  s&    

zTablesTest._load_fixtures)$ri   rj   rk   r   r   r   r   r   r   r"   r   r   r   r   r   r=   r|   r   propertyr   classmethodrw   ry   rx   r~   r   r   rz   r   r   r   r   r   r   r   r   r   r   r   r   rs   r  s:   		
)rs   c               @   s"   e Zd Zejddddd ZdS )NoCacheTr}   )rr   r>   c             c   s"   t jj}d t j_d V  |t j_d S )N)r   r   r   )r   r    r   r   r   _disable_cacheD  s    zNoCache._disable_cacheN)ri   rj   rk   r   r=   r   r   r   r   r   r   C  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 )N)set)r   r   r   r   
_event_fnsM  s    zRemovesEvents._event_fnsc             K   s(   | j |||f tj|||f| d S )N)r   addr   Zlisten)r   targetnamer   rG   r   r   r   event_listenQ  s    zRemovesEvents.event_listenTr}   )rr   r>   c             c   s$   d V  x| j D ]}tj|  qW d S )N)r   r   remove)r   keyr   r   r   _remove_eventsU  s    zRemovesEvents._remove_eventsN)
ri   rj   rk   r   Zmemoized_propertyr   r   r   r=   r   r   r   r   r   r   L  s   r   c              K   sD   |  dd |  dd | dtj}tjj|f| }t| |S )NZ	autoflushTZexpire_on_commitr"   )	
setdefaultro   r   r   ra   ormZSession_fixture_sessionsr   )rG   r"   Zsessr   r   r   rI   _  s    
rI   c               C   s   t jj  t  d S )N)ra   r   sessionclose_all_sessionsr   r   r   r   r   r   _close_all_sessionsj  s    r   c             C   s   t   tj  d S )N)r   ra   r   clear_mappers)r{   r   r   r   stop_test_class_inside_fixturesp  s    r   c               C   s   t r
t  d S )N)r   r   r   r   r   r   
after_testu  s    r   c               @   s   e Zd ZdS )ORMTestN)ri   rj   rk   r   r   r   r   r   z  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 )"
MappedTestrt   ru   NTrq   )rr   r>   c             c   sZ   | j }|  |jd kr t |_|  |  |  |  d V  |  |	  d S )N)
rv   rw   classesr   rx   _setup_once_classes_setup_once_mappersry   _teardown_once_classrz   )r   r{   r   r   r   r|     s    
z#MappedTest._setup_tables_test_classr}   c             c   sN   |    |   |   |   d V  tjj  |   | 	  | 
  d S )N)r~   _setup_each_classes_setup_each_mappersr   ra   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 )N)r   r   )r{   r   r   r   r     s    zMappedTest._teardown_once_classc             C   s   | j dkr| | j d S )Nrt   )run_setup_classes_with_register_classessetup_classes)r{   r   r   r   r     s    
zMappedTest._setup_once_classesc             C   s*   | j dkr&|  \| _| _| | j d S )Nrt   )run_setup_mappers_generate_registrymapper_registrymapperr   setup_mappers)r{   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 )Nrt   ru   )r   r   rv   r   r   r   r   )r   r   r   r   r     s    

zMappedTest._setup_each_mappersc             C   s   | j dkr| | j d S )Nru   )r   r   r   )r   r   r   r   r     s    
zMappedTest._setup_each_classesc             C   s   t | jd}||jfS )N)r6   )r   r   Zmap_imperatively)r{   Zdeclr   r   r   r     s    zMappedTest._generate_registryc                sx   | j   dk	stG  fdddt}G dd dt|t}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.

        Nc                   s   e Zd Z fddZdS )z6MappedTest._with_register_classes.<locals>.FindFixturec                s   |  |< t | ||| d S )N)type__init__)r{   	classnamebasesdict_)cls_registryr   r   r     s    z?MappedTest._with_register_classes.<locals>.FindFixture.__init__N)ri   rj   rk   r   r   )r   r   r   FindFixture  s   r   c               @   s   e Zd ZdS )z0MappedTest._with_register_classes.<locals>._BaseN)ri   rj   rk   r   r   r   r   _Base  s   r   c               @   s   e Zd ZdS )z0MappedTest._with_register_classes.<locals>.BasicN)ri   rj   rk   r   r   r   r   Basic  s   r   c               @   s   e Zd ZdS )z5MappedTest._with_register_classes.<locals>.ComparableN)ri   rj   rk   r   r   r   r   
Comparable  s   r   )
r   r   r   r   Zwith_metaclassobjectr   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 )Nrt   )r   ra   r   r   )r   r   r   r   r     s    
z!MappedTest._teardown_each_mappersc             C   s   | j dkr| j  d S )Nrt   )r   r   r   )r   r   r   r   r     s    
z!MappedTest._teardown_each_classesc             C   s   d S )Nr   )r{   r   r   r   r     s    zMappedTest.setup_classesc             C   s   d S )Nr   )r{   r   r   r   r     s    zMappedTest.setup_mappers)ri   rj   rk   r   r   r   r   r=   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ~  s    
r   c                   s4   e Zd ZdZdZedd Ze fddZ  ZS )DeclarativeMappedTestrt   c             C   s   d S )Nr   )r{   r   r   r   rx     s    z(DeclarativeMappedTest._setup_once_tablesc                sp   | j  G  fdddt}G dd dt}t| j||d}|| _tt| | | jj	rl| j
rl| jtj d S )Nc                   s   e Zd Z fddZdS )zLDeclarativeMappedTest._with_register_classes.<locals>.FindFixtureDeclarativec                s   |  |< t | ||| d S )N)r   r   )r{   r   r   r   )r   r   r   r     s    zUDeclarativeMappedTest._with_register_classes.<locals>.FindFixtureDeclarative.__init__N)ri   rj   rk   r   r   )r   r   r   FindFixtureDeclarative  s   r   c               @   s   e Zd ZejZdS )zFDeclarativeMappedTest._with_register_classes.<locals>.DeclarativeBasicN)ri   rj   rk   r   rT   Z__table_cls__r   r   r   r   DeclarativeBasic  s   r   )r6   	metaclassr{   )r   r   r   r   r   r   superr   r   r   r   r   r   r   )r{   r   r   r   Z	_DeclBase)rv   )r   r   r     s    z,DeclarativeMappedTest._with_register_classes)	ri   rj   rk   r   r   r   rx   r   __classcell__r   r   )rv   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 )NrF   )regexpsublower)r   textr   r   r   	normalize&  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   )rV   )rn   )rU   )Computed)rT   Zcomputed_default_tableidT)Zprimary_keyZnormalZcomputed_colznormal + 42Zwith_defaultZ42)Zserver_defaultZcomputed_column_tableZcomputed_no_flagznormal / 42)r   Zcomputed_virtualz
normal + 2F)Z	persistedz
normal / 2Zcomputed_storedznormal - 42znormal * 42)rF   rV   rn   r   rU   r   rT   ZrequiresZschemasr_   r   Ztest_schemaZcomputed_columns_virtualZappend_columnZcomputed_columns_stored)	r{   r6   rV   rn   rU   r   rT   re   Zt2r   r   r   r   )  sd    

z+ComputedReflectionFixtureTest.define_tables)ri   rj   rk   r   r   Z__backend__rl   recompiler   r   r   r   r   r   r   r   r     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nRt|j|j tt|jt|j x,t|j|jD ]\}}|j	||dsjtqjW ||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_equalo  s    zCacheKeyFixture._compare_equalc             C   s  | }| }xt tt|dD ]\}}||kr\| || || |\}}|d krZq$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xHt
|j|jD ]\}	}
|	j|
|dsP qW t|j	|j	 nt|j	|j	 t|| tr$t|| tr$g }g }x.t|| D ]}|jdkrJ|| qJW x.t|| D ]}|jdkrz|| qzW tt|jdd dtt|dd d tt|jd	d dtt|d
d d q$W d S )Nr   r!   )r   Z	bindparamc             S   s   | j S )N)r   )r   r   r   r   <lambda>      z8CacheKeyFixture._run_cache_key_fixture.<locals>.<lambda>)r   c             S   s   | j S )N)r   )r   r   r   r   r     r   c             S   s   | j S )N)r   )r   r   r   r   r     r   c             S   s   | j S )N)r   )r   r   r   r   r     r   )	itertoolscombinations_with_replacementranger   r   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   r   r   r   r   Zassert_a_paramsZassert_b_paramselemr   r   r   _run_cache_key_fixture  sV    
z&CacheKeyFixture._run_cache_key_fixturec             C   sH   | }| }x6t tt|dD ]\}}| || || | q"W d S )Nr   )r   r   r  r   r   )r   r=   r   r  r  r   r   r   r   r   _run_cache_key_equal_fixture  s
    z,CacheKeyFixture._run_cache_key_equal_fixtureN)ri   rj   rk   r   r  r  r   r   r   r   r   n  s   Kr   )4
contextlibr   r   r   rg   ra   rF   r   r   r   r   r   Zentitiesr   r	   r
   r   r   r   r   r   r   r   Zorm.decl_apir   r   rJ   r   Zsql.elementsr   Zmark_base_test_classr   r   r)   contextmanagerr;   rp   rs   r   r   r   r   rI   r   r   r   r   ZAssertsExecutionResultsr   r   r   r   r   r   r   r   <module>   sV     8 R	|$P