o
    Rc|                     @   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J |d S Nr   )selfvalmsgr   r   =D:\Flask\env\Lib\site-packages\sqlalchemy/testing/fixtures.pyassert_7   s   zTestBase.assert_c                 c   $    t jj}d t j_d V  |t j_d S r   r   dbZ_compiled_cacher   _cacher   r   r   nocache:   
   zTestBase.nocachec                 c   sH    t | dd p	tj}| }|V  W d    d S 1 sw   Y  d S Nbind)getattrr   r"   connect)r   engconnr   r   r   connection_no_transA   s
   
"zTestBase.connection_no_transc                 c   sL    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                 #   sd    g  g d fdd	}|V  D ]}z|   W q   Y q D ]}z|  W q"   Y q"d S )NFc                    s      |  |r |  d S d S r   )append)resultZconsumeto_closeZ
to_consumer   r   gob   s   
z/TestBase.close_result_when_finished.<locals>.go)F)allr1   )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_enginer3   r   r   r   future_connection}   s   
zTestBase.future_connectionc                 c   H    t | dd p	tj}t| d V  W d    d S 1 sw   Y  d S r'   r)   r   r"   _push_future_enginer   r+   r   r   r   rA      
   
"zTestBase.future_enginec                 #   s<    ddl m  	 	 	 		d fdd	}|V   jd d S )Nr   enginesFc                    s(   |d u ri }d|d<  j | ||||dS )NfixturescopeurloptionsfutureasyncioZtransfer_staticpooltesting_enginerL   rH   r   r   gen_testing_engine   s   z3TestBase.testing_engine.<locals>.gen_testing_enginerJ   )NNNFF) rI   Ztesting_reaperZ_drop_testing_engines)r   rS   r   rH   r   rR      s   zTestBase.testing_enginec                    s    fdd}|S )Nc                     s   d| d<  di | S )NTrP   r   r   )kwrQ   r   r   r8      s   z)TestBase.async_testing_engine.<locals>.gor   )r   rR   r8   r   rQ   r   async_testing_engine   s   zTestBase.async_testing_enginec                 C      t  S r   )fixture_sessionr   r   r   r   rX         zTestBase.fixture_sessionc                 c   s    ddl m} | }||j_|V  |j`tr?t r?t }|  t	  t
|t W d   dS 1 s8w   Y  dS 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_transactionr0   r.   r   r   r"   )r   requestr   r=   r2   r   r   r   r=      s$   
"zTestBase.metadatac                 C   s*   g | ]}d D ]}dD ]}|||fq
qqS ))noneexecuter.   TFr   ).0r0   second_operationbegin_nestedr   r   r   
<listcomp>   s    
zTestBase.<listcomp>ra   )paramsc                    s~   |j \ ddlm}m}m}mm ddlm |d||d|t	| dd p+t
j}|  fdd	}|S )
Nr   )TableColumnIntegerfuncselectr   r   testdatar(   c              
      s:  |   D} rtjjjstd |r|  }n| }|q |r-|  ddi n
| ddi r>|	  n|
  dkrttjjd3 dkrk|r`|  ddi n| ddi ndkrz|rv|   n|  W d    n1 sw   Y  W d    n1 sw   Y  |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rBttjjdL dkr|r|  ddi n1| ddi n&dkr!t|dr|   n|    nd
kr2|r.|   n|  W d    n	1 s=w   Y  W d    n	1 sMw   Y  d} r[|d7 }sb|d7 }|rv|  | d S |  }| | W d    d S 1 sw   Y  d S )Nzsavepoints not enabledrm   
   r_   zCan't operate on closed transaction inside context manager.  Please complete the context manager before emitting further commands.r`      r.      rd   r   r   )r.   r   requirements
savepointsenabledZ	skip_testrd   r`   insertr0   commitr   Zexpect_raises_messagesaexcZInvalidRequestErrorhasattrZscalarcountselect_fromr*   )subjectZtrans_on_subjectZexecute_on_subjectr2   Znested_transZexpected_committedr,   rd   r   rj   r0   rc   rk   tr   r   run_test   s   




)









a
$z4TestBase.trans_ctx_manager_fixture.<locals>.run_test)param
sqlalchemyrg   rh   ri   rj   rk   rT   r   r)   r   r"   create)r   r^   r=   rg   rh   ri   r+   r~   r   r|   r   trans_ctx_manager_fixture   s   
xz"TestBase.trans_ctx_manager_fixturer   )__name__
__module____qualname____requires__Z__unsupported_on__Z__only_on__Z__skip_if__Z"__leave_connections_for_teardown__r   r   rJ   r%   r-   r3   r;   r   r@   rB   rA   rR   rV   rX   r=   r   r   r   r   r   r   "   sJ    












r   c                 c   sH    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   rE   \  s   
rE   c                   @   "   e Zd Zejddddd ZdS )FutureEngineMixinTclassZautouserK   c                 c   rC   r'   rD   rF   r   r   r   rE   k  rG   z%FutureEngineMixin._push_future_engineN)r   r   r   r   rJ   rE   r   r   r   r   r   j      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   s2    | 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_tablesrY   r   r   r   _setup_tables_test_instance  s
   z&TablesTest._setup_tables_test_instancec                 C      | j S r   )_tables_metadatarY   r   r   r   tables_test_metadata  rZ   zTablesTest.tables_test_metadatac                 C   sX   | j dkr| jdkrd| _| jdv sJ t | _t | _t | _|  | _t	
 | _d S )Nr   r   )r   N)run_define_tablesrun_create_tablesrun_insertsr   othertables	sequences
setup_bindr(   rv   r\   r   r   r   r   r   r     s   


zTablesTest._init_classc                 C   P   | j dkr&|   | j }| | W d    d S 1 sw   Y  d S d S Nr   r   _load_fixturesr(   r.   insert_data)r   r,   r   r   r   r     s   
"zTablesTest._setup_once_insertsc                 C   sV   | j dkr)| | j | jdkr| j| j | j| jj | j| jj	 d S d S r   
r   define_tablesr   r   
create_allr(   r   updater   Z
_sequencesr   r   r   r   r     s   

zTablesTest._setup_once_tablesc                 C   sr   | j dkr)| | j | jdkr| j| j | j| jj | j| jj	 d S | jdkr7| j| j d S d S Nr   r   rY   r   r   r   r     s   


zTablesTest._setup_each_tablesc                 C   r   r   r   )r   r,   r   r   r   r     s   
"zTablesTest._setup_each_insertsc                 C   st  | j dkr| j  | jdkrt| j| j | j  n| jdkr(t| j| j ttj	dd}|r4|j
}| j dkr| jdkr| jdkr| j b}tdd t| jj D D ]I}z'|ry|  ||  W d    n1 ssw   Y  n||  W qX tjjy } ztjd||f tjd W Y d }~qXd }~ww W d    d S 1 sw   Y  d S d S d S d S )Nr   rr   Fc                 S   s   g | ]
\}}|d ur|qS r   r   )rb   r}   fksr   r   r   re     s    z4TablesTest._teardown_each_tables.<locals>.<listcomp>zError emptying table %s: %r)file)r   r   clearr   r   r   r(   r)   r   rq   rs   run_deletesr.   reversedr   valuesrd   r`   deleterv   rw   Z
DBAPIErrorr   print_sysstderr)r   rr   r,   tableexr   r   r   r     sT   




	

"z TablesTest._teardown_each_tablesc                 C   sJ   | j r
t| j| j | jdkr| | j d | j_| jd ur#d | _d S 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   
  rZ   zTablesTest.setup_bindc                 C   s0   t |dr|  d S t |dr|  d S d S )Nr>   r1   )rx   r>   r1   )r   r(   r   r   r   r     s
   

zTablesTest.dispose_bindc                 C      d S r   r   )r   r=   r   r   r   r        zTablesTest.define_tablesc                 C   s   i S r   r   r   r   r   r   fixtures  r   zTablesTest.fixturesc                 C   r   r   r   )r   r3   r   r   r   r     r   zTablesTest.insert_datac                 C   s   |  | j|| d S r   )Zassert_sql_countr(   )r   ry   fnr   r   r   
sql_count_!     zTablesTest.sql_count_c                 C   s   |  | j|| d S r   )Z
assert_sqlr(   )r   Z	callable_Z
statementsr   r   r   sql_eq_$  r   zTablesTest.sql_eq_c              	      s   i i  }|    D ]$\}t|dk rqttjr!| j |d  < |dd |< qt| jj	 D ]5\}du rAq8 vrFq8| j
 }|  fdd| D  W d   n1 shw   Y  q8dS )z4Insert rows as represented by the fixtures() method.r   r   r   Nc                    s   g | ]}t t  |qS r   )dictzip)rb   Zcolumn_valuesheadersr   r   r   re   <  s    z-TablesTest._load_fixtures.<locals>.<listcomp>)r   itemslen
isinstancer   string_typesr   r   r   r   r(   r.   r`   rt   )r   rowsrm   r   r,   r   r   r   r   '  s2   


zTablesTest._load_fixtures)$r   r   r   r   r   r   r   r   r   r(   r   r   r   r   r   rJ   r   r   propertyr   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  sV    






)





r   c                   @   r   )NoCacheTr   r   c                 c   r    r   r!   r#   r   r   r   _disable_cacheD  r&   zNoCache._disable_cacheN)r   r   r   r   rJ   r   r   r   r   r   r   C  r   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   rW   r   )setrY   r   r   r   
_event_fnsM  rZ   zRemovesEvents._event_fnsc                 K   s,   | j |||f tj|||fi | d S r   )r   addr   listen)r   targetnamer   rU   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   rJ   r   r   r   r   r   r   L  s    
r   c                  K   sH   |  dd |  dd | dtj}tjj|fi | }t| |S )NZ	autoflushTZexpire_on_commitr(   )	
setdefaultr   r   r"   rv   ormSession_fixture_sessionsr   )rU   r(   sessr   r   r   rX   _  s   
rX   c                   C   s   t jj  t  d S r   )rv   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   rv   r   clear_mappersr   r   r   r   stop_test_class_inside_fixturesp  s   r   c                   C   s   t rt  d S d S r   )r   r   r   r   r   r   
after_testu  s   
r   c                   @      e Zd ZdS )ORMTestNr   r   r   r   r   r   r   r   z      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   s\    | j }|  |jd u 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   sP    |    |   |   |   d V  tjj  |   | 	  | 
  d S r   )r   _setup_each_classes_setup_each_mappersr   rv   r   r   r   _teardown_each_mappers_teardown_each_classesr   rY   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      | j dkr| | j d S 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 d S r   )run_setup_mappers_generate_registrymapper_registrymapperr   setup_mappersr   r   r   r   r     s   
zMappedTest._setup_once_mappersc                 C   s<   | j dkr|  \| j_| j_| j dkr| | j d S d S )Nr   r   )r  r  r   r  r  r   r  rY   r   r   r   r     s   

zMappedTest._setup_each_mappersc                 C   r   r   r   rY   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us	J 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                          e Zd Z fddZdS )z6MappedTest._with_register_classes.<locals>.FindFixturec                       |  |< t | ||| d S r   )type__init__r   	classnamebasesZdict_Zcls_registryr   r   r
       z?MappedTest._with_register_classes.<locals>.FindFixture.__init__Nr   r   r   r
  r   r  r   r   FindFixture      r  c                   @   r   )z0MappedTest._with_register_classes.<locals>._BaseNr   r   r   r   r   _Base  r   r  c                   @   r   )z0MappedTest._with_register_classes.<locals>.BasicNr   r   r   r   r   Basic  r   r  c                   @   r   )z5MappedTest._with_register_classes.<locals>.ComparableNr   r   r   r   r   
Comparable  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 d S r   )r  rv   r   r   rY   r   r   r   r     s   
z!MappedTest._teardown_each_mappersc                 C   s   | j dkr| j  d S d S r   )r   r   r   rY   r   r   r   r     s   
z!MappedTest._teardown_each_classesc                 C   r   r   r   r   r   r   r   r     r   zMappedTest.setup_classesc                 C   r   r   r   r   r   r   r   r    r   zMappedTest.setup_mappers)r   r   r   r   r  r   r   rJ   r   r   r   r   r   r   r   r   r  r   r   r   r   r  r   r   r   r   r   ~  s4    








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   r   r   r   r   r   r   r   r     r   z(DeclarativeMappedTest._setup_once_tablesc                    sx   | j  G  fdddt}G dd dt}t| j||d}|| _tt| | | jj	r8| j
r:| jtj d S d S d S )Nc                       r  )zLDeclarativeMappedTest._with_register_classes.<locals>.FindFixtureDeclarativec                    r  r   )r   r
  r  r  r   r   r
    r  zUDeclarativeMappedTest._with_register_classes.<locals>.FindFixtureDeclarative.__init__Nr  r   r  r   r   FindFixtureDeclarative  r  r  c                   @   s   e Zd ZejZdS )zFDeclarativeMappedTest._with_register_classes.<locals>.DeclarativeBasicN)r   r   r   r   rg   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 )NrT   )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	rn|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	r||d||dd	d |jjj	r||d||dd	d d S d S d S )Nr   )ri   r   )rh   )Computed)rg   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)rT   ri   r   r   rh   r%  rg   requiresZschemasrs   r   Ztest_schemaZcomputed_columns_virtualappend_columnZcomputed_columns_stored)	r   r=   ri   r   rh   r%  rg   r}   t2r   r   r   r   )  s~   	

	






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 u r|jdsJ |d u sJ ||fS t|j|j tt|jt|j t|j|jD ]\}}|j||dsDJ q7||fS )Nr%   compare_values)	_generate_cache_key_annotationsgetr   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r+| || || |\}}|d u r*qn[||  }||  }|d u s?|d u r\|d u rM|| jdsMJ |d u r[|| jds[J q|j|jkrt	|j
|j
D ]\}	}
|	j|
|dsv nqit|j|j nt|j|j t|| trt|| trg }g }t|| D ]}|jdkr|| qt|| D ]}|jdkr|| qt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   r   r   r   r7  r   r   r   <lambda>      z8CacheKeyFixture._run_cache_key_fixture.<locals>.<lambda>r=  c                 S   r   r   r=  r>  r   r   r   r?    r@  c                 S   r   r   r=  r>  r   r   r   r?    r@  c                 S   r   r   r=  r>  r   r   r   r?    r@  )	itertoolscombinations_with_replacementranger   r<  r0  r1  r2  r   r   r4  r5  r	   r   r   r   ZiterateZ__visit_name__r4   r   sortedr   Zunique_list)r   rJ   r/  case_acase_br6  r7  r8  r9  r:  r;  Zassert_a_paramsZassert_b_paramselemr   r   r   _run_cache_key_fixture  sv   




z&CacheKeyFixture._run_cache_key_fixturec                 C   sD   | }| }t tt|dD ]\}}| || || | qd S )Nr   )rA  rB  rC  r   r<  )r   rJ   r/  rE  rF  r6  r7  r   r   r   _run_cache_key_equal_fixture  s   z,CacheKeyFixture._run_cache_key_equal_fixtureN)r   r   r   r<  rH  rI  r   r   r   r   r-  n  s    Kr-  )4
contextlibrA  r+  r   r   rv   rT   r   r   r   r   r	   entitiesr
   r   r   r   r   r   r   r   r   r   Zorm.decl_apir   r   r[   r   Zsql.elementsr   Zmark_base_test_classr  r   r/   contextmanagerrE   r   r   r   r   r   r   rX   r   r   r   r   ZAssertsExecutionResultsr   r  r  r-  r   r   r   r   <module>   sZ     8
 R	|$P