U
    [hx                     @   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   ?/tmp/pip-unpacked-wheel-joqu7d3y/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 r   r   dbZ_compiled_cacher   _cacher   r   r   nocache:   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_transA   s    
zTestBase.connection_no_transc                 c   sJ   t | dd ptj}| }| }|a|V  d a|jr>|  |  d S r&   )	r(   r   r"   r)   begin_connection_fixture_connectionZ	is_activerollbackclose)r   r*   r+   transr   r   r   
connectionH   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   gob   s    
z/TestBase.close_result_when_finished.<locals>.go)F)allr0   )r   r8   rr   r6   r   close_result_when_finished]   s    z#TestBase.close_result_when_finishedc                 c   s   t |d}|V  |  d S N)metadata)r   dispose)r   r=   regr   r   r   r   s   s    
zTestBase.registryc                 C   s   |  S r   )Zgenerate_base)r   r   r   r   r   	decl_basey   s    zTestBase.decl_basec                 c   s
   |V  d S r   r   )r   future_enginer2   r   r   r   future_connection}   s    zTestBase.future_connectionc              	   c   s0   t | dd ptj}t| d V  W 5 Q R X d S r&   r(   r   r"   _push_future_enginer   r*   r   r   r   rA      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asyncioZtransfer_staticpooltesting_enginerJ   rF   r   r   gen_testing_engine   s    z3TestBase.testing_engine.<locals>.gen_testing_enginerH   )NNNFF) rG   Ztesting_reaperZ_drop_testing_engines)r   rQ   r   rF   r   rP      s         zTestBase.testing_enginec                    s    fdd}|S )Nc                     s   d| d<  f | S )NTrN   r   )kwrO   r   r   r8      s    z)TestBase.async_testing_engine.<locals>.gor   )r   rP   r8   r   rO   r   async_testing_engine   s    zTestBase.async_testing_enginec                 C   s   t  S r   )fixture_sessionr   r   r   r   rU      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instancer=   r.   Zin_transactionZget_transactionr/   r-   r   r   r"   )r   requestr   r=   r1   r   r   r   r=      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>r]   )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   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 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 }|r|  | n2|  $}| | W 5 Q R X d S )Nzsavepoints not enabledri   
   r[   zCan't operate on closed transaction inside context manager.  Please complete the context manager before emitting further commands.r\      r-      r`   r   r   )r-   r   requirements
savepointsenabledZ	skip_testr`   r\   insertr/   commitr   Zexpect_raises_messagesaexcZInvalidRequestErrorhasattrZscalarcountselect_fromr)   )subjectZtrans_on_subjectZexecute_on_subjectr1   Znested_transZexpected_committedr+   r`   r   rf   r/   r_   rg   tr   r   run_test   s    




 











z4TestBase.trans_ctx_manager_fixture.<locals>.run_test)param
sqlalchemyrc   rd   re   rf   rg   rR   r   r(   r   r"   create)r   rZ   r=   rc   rd   re   r*   rz   r   rx   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   rH   r%   r,   r2   r;   r   r@   rB   rA   rP   rT   rU   r=   r~   r   r   r   r   r   "   sH   












r   c                 c   sF   ddl m} ddlm} || }tj|| |V  tj| d S )Nr   )Enginer   testing)	Zfuture.enginer   r|   r   Z_future_facader   _currentZpush_enginepop)Zenginer   r   Zfacader   r   r   rD   \  s    
rD   c                   @   s"   e Zd Zejddddd ZdS )FutureEngineMixinTclassZautouserI   c              	   c   s0   t | dd ptj}t| d V  W 5 Q R X d S r&   rC   rE   r   r   r   rD   k  s    
z%FutureEngineMixin._push_future_engineN)r   r   r   r   rH   rD   r   r   r   r   r   j  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eachNTr   r   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_tablesrV   r   r   r   _setup_tables_test_instance  s    z&TablesTest._setup_tables_test_instancec                 C   s   | j S r   )_tables_metadatarV   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_bindr'   rr   rX   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_fixturesr'   r-   insert_data)r   r+   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_allr'   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   rV   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   r+   r   r   r   r     s    
zTablesTest._setup_each_insertsc                 C   sF  | 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rB| jdkrB| jdkrB| j }tdd t| jj D D ]}z:|r|  ||  W 5 Q R X n||  W q tjjk
r4 } ztjd||f tjd W 5 d }~X Y qX qW 5 Q R X d S )Nr   rn   Fc                 S   s   g | ]\}}|d k	r|qS r   r   )r^   ry   fksr   r   r   ra     s   z4TablesTest._teardown_each_tables.<locals>.<listcomp>zError emptying table %s: %r)file)r   r   clearr   r   r   r'   r(   r   rm   ro   run_deletesr-   reversedr   valuesr`   r\   deleterr   rs   Z
DBAPIErrorr   print_sysstderr)r   rn   r+   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   r'   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 )Nr>   r0   )rt   r>   r0   )r   r'   r   r   r   r     s    


zTablesTest.dispose_bindc                 C   s   d S r   r   )r   r=   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   r2   r   r   r   r     s    zTablesTest.insert_datac                 C   s   |  | j|| d S r   )Zassert_sql_countr'   )r   ru   fnr   r   r   
sql_count_!  s    zTablesTest.sql_count_c                 C   s   |  | j|| d S r   )Z
assert_sqlr'   )r   Z	callable_Z
statementsr   r   r   sql_eq_$  s    zTablesTest.sql_eq_c              
      s   i i   }|    D ]H\}t|dk r,qttjrB| j |d  < |dd |< qt| jj	 D ]V\}dkrqp krqp| j
 *}|  fdd| D  W 5 Q R X qpdS )z4Insert rows as represented by the fixtures() method.r   r   r   Nc                    s   g | ]}t t  |qS r   )dictzip)r^   Zcolumn_valuesheadersr   r   r   ra   <  s   z-TablesTest._load_fixtures.<locals>.<listcomp>)r   itemslen
isinstancer   string_typesr   r   r   r   r'   r-   r\   rp   )r   Zrowsri   r   r+   r   r   r   r   '  s,    


zTablesTest._load_fixtures)$r   r   r   r   r   r   r   r   r   r'   r   r   r   r   r   rH   r   r   propertyr   classmethodr   r   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_cacheD  s    zNoCache._disable_cacheN)r   r   r   r   rH   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 r   )setrV   r   r   r   
_event_fnsM  s    zRemovesEvents._event_fnsc                 K   s(   | j |||f tj|||f| d S r   )r   addr   listen)r   targetnamer   rS   r   r   r   event_listenQ  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_eventsU  s    
zRemovesEvents._remove_eventsN)
r   r   r   r   Zmemoized_propertyr   r   r   rH   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'   )	
setdefaultr   r   r"   rr   ormSession_fixture_sessionsr   )rS   r'   sessr   r   r   rU   _  s    
rU   c                   C   s   t jj  t  d S r   )rr   r   sessionclose_all_sessionsr   r   r   r   r   r   _close_all_sessionsj  s    r   c                 C   s   t   tj  d S r   )r   rr   r   clear_mappersr   r   r   r   stop_test_class_inside_fixturesp  s    r   c                   C   s   t r
t  d S r   )r   r   r   r   r   r   
after_testu  s    r   c                   @   s   e Zd ZdS )ORMTestNr   r   r   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 )"
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   rr   r   r   r   _teardown_each_mappers_teardown_each_classesr   rV   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   rV   r   r   r   r     s    

zMappedTest._setup_each_mappersc                 C   s   | j dkr| | j d S r   r   rV   r   r   r   r     s    
zMappedTest._setup_each_classesc                 C   s   t | jd}||jfS r<   )r   r   Zmap_imperatively)r   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 r   )type__init__r   	classnamebasesZdict_Zcls_registryr   r   r     s    z?MappedTest._with_register_classes.<locals>.FindFixture.__init__Nr   r   r   r   r   r   r   r   FindFixture  s   r   c                   @   s   e Zd ZdS )z0MappedTest._with_register_classes.<locals>._BaseNr   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  )
r   r   r   r   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 r   )r   rr   r   r   rV   r   r   r   r     s    
z!MappedTest._teardown_each_mappersc                 C   s   | j dkr| j  d S r   )r   r   r   rV   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)r   r   r   r   r   r   r   rH   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                    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 r   )r   r   r   r   r   r   r     s    zUDeclarativeMappedTest._with_register_classes.<locals>.FindFixtureDeclarative.__init__Nr   r   r   r   r   FindFixtureDeclarative  s   r  c                   @   s   e Zd ZejZdS )zFDeclarativeMappedTest._with_register_classes.<locals>.DeclarativeBasicN)r   r   r   r   rc   Z__table_cls__r   r   r   r   DeclarativeBasic  s   r  )r=   	metaclassr   )r   r   r  r   r   r  superr  r   r   r   r   r   r"   )r   r   r  r  Z	_DeclBaser   r   r   r     s    z,DeclarativeMappedTest._with_register_classes)	r   r   r   r   r   r   r   r   __classcell__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 )NrR   )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   )re   r   )rd   )Computed)rc   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)rR   re   r   r   rd   r  rc   requiresZschemasro   r   Ztest_schemaZcomputed_columns_virtualZappend_columnZcomputed_columns_stored)	r   r=   re   r   rd   r  rc   ry   t2r   r   r   r   )  sz    	
	



z+ComputedReflectionFixtureTest.define_tables)r   r   r   r   r   Z__backend__r   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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_equalo  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>r)  c                 S   s   | j S r   r)  r*  r   r   r   r+    r,  c                 S   s   | j S r   r)  r*  r   r   r   r+    r,  c                 S   s   | j S r   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__r3   r   sortedr   Zunique_list)r   rH   r  case_acase_br"  r#  r$  r%  r&  r'  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   )r-  r.  r/  r   r(  )r   rH   r  r1  r2  r"  r#  r   r   r   _run_cache_key_equal_fixture  s    
 z,CacheKeyFixture._run_cache_key_equal_fixtureN)r   r   r   r(  r4  r5  r   r   r   r   r  n  s   Kr  )4
contextlibr-  r  r   r|   rr   rR   r   r   r   r   r	   entitiesr
   r   r   r   r   r   r   r   r   r   Zorm.decl_apir   r   rW   r   Zsql.elementsr   Zmark_base_test_classr  r   r.   contextmanagerrD   r   r   r   r   r   r   rU   r   r   r   r   ZAssertsExecutionResultsr   r  r  r  r   r   r   r   <module>   sX     8
 R	|$P