o
    j                     @   sv  d dl Z e je jd 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mZmZ d dlmZmZmZmZmZmZmZmZmZmZmZ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)m*Z*m+Z+m,Z, e Z-G dd dej.Z/G dd dej.Z0G dd dej.Z1e2dkre3  dS dS )    N)level)pprint)create_engine)MetaData)Column)Table)IntegrityError)mapper)sessionmaker)MAnyDouble)XmlAttributeFileXmlDataComplexModelArray	Integer32UnicodeIntegerEnumTTableModelDateTimeBoolean)HybridFileStore)xml)table)get_pk_columns)PGJsonBPGJson
PGFileJsonPGObjectJsonc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestSqlAlchemyTypeMappingsc                    sf   t  d d  ddlm } G  fdddt}ddlm} |tdd|}||jjj	
 r1J d S )	Nr      )inspectc                       s*   e Zd Zd df ZeddZedZdS )z8TestSqlAlchemyTypeMappings.test_init.<locals>.SomeClass1%s_%d   Tpk    N)__name__
__module____qualname____tablename__r   ir   e fnr0   Z/var/www/html/LicenciasMiG/venv/lib/python3.10/site-packages/spyne/test/test_sqlalchemy.py
SomeClass1;   s    
r4   )get_dict_as_object   r.   )r$   stacksqlalchemy.inspection
TableModelspyne.util.dictdocr5   dictattrsr/   historyhas_changes)selfsqla_inspectr4   r5   instr0   r1   r3   	test_init7   s   z$TestSqlAlchemyTypeMappings.test_initc                    sp   t  d d  G  fdddt}t|jjjjjt	j
sJ G  fdddt}t|jjjjjt	js6J d S )Nr   r#   c                       s&   e Zd Zd df ZeddZeZdS )z8TestSqlAlchemyTypeMappings.test_bool.<locals>.SomeClass1r%   r&   Tr'   N)r*   r+   r,   r-   r   r.   r   br0   r1   r0   r3   r4   G   s    
r4   c                       s,   e Zd Zd df ZeddZeedZdS )z8TestSqlAlchemyTypeMappings.test_bool.<locals>.SomeClass2r%      Tr'   store_asN)	r*   r+   r,   r-   r   r.   r   intrD   r0   r1   r0   r3   
SomeClass2O       
rI   )r$   r8   r:   
isinstance
Attributes
sqla_tablecrD   type
sqlalchemyr   SmallIntegerr@   r4   rI   r0   r1   r3   	test_boolD   s   z$TestSqlAlchemyTypeMappings.test_boolc                    s   t  d d  G  fdddt}t|jjjjjt	sJ G  fdddt}t|jjjjjt
s4J G  fdddt}t|jjjjjtsJJ |jjjjjjd	ksVJ d S )
Nr   r#   c                       ,   e Zd Zd df ZeddZeddZdS )z9TestSqlAlchemyTypeMappings.test_jsonb.<locals>.SomeClass1r%   r&   Tr'   jsonrF   Nr*   r+   r,   r-   r   r.   r   ar0   r1   r0   r3   r4   Z   rJ   r4   c                       rT   )z9TestSqlAlchemyTypeMappings.test_jsonb.<locals>.SomeClass2r%   rE   Tr'   jsonbrF   NrV   r0   r1   r0   r3   rI   a   rJ   rI   c                       s4   e Zd Zd df ZeddZeeddddZd	S )
z9TestSqlAlchemyTypeMappings.test_jsonb.<locals>.SomeClass3r%   r#   Tr'   pathrX   )	db_formatrF   N)	r*   r+   r,   r-   r   r.   r   r   rW   r0   r1   r0   r3   
SomeClass3h   s    
r[   rX   )r$   r8   r:   rK   rL   rM   rN   rW   rO   r   r   r    dbt)r@   r4   rI   r[   r0   r1   r3   
test_jsonbW   s   z%TestSqlAlchemyTypeMappings.test_jsonbc                    s   t  d d G dd dt G  fdddt}t|jjjjj	t
s'J G  fdddt}t|jjjjj	t
s>J d S )	Nr   r#   c                   @      e Zd ZeZeZdS )z;TestSqlAlchemyTypeMappings.test_obj_json.<locals>.SomeClassNr*   r+   r,   r   sr   dr0   r0   r0   r3   	SomeClasss       rb   c                       s6   e Zd Zddf Zdeddfde ddfgZd	S )
z<TestSqlAlchemyTypeMappings.test_obj_json.<locals>.SomeClass1r%   r&   r.   Tr'   rW   rU   rF   N)r*   r+   r,   r-   r   r   
_type_infor0   rb   r2   r0   r3   r4   w   s
    r4   c                       s.   e Zd Zddf ZeddZ jddZdS )z<TestSqlAlchemyTypeMappings.test_obj_json.<locals>.SomeClass2r%   rE   Tr'   rU   rF   N)r*   r+   r,   r-   r   r.   	customizerW   r0   re   r0   r3   rI      s    
rI   )r$   r8   r   r:   rK   rL   rM   rN   rW   rO   r!   rR   r0   re   r3   test_obj_jsonp   s   z(TestSqlAlchemyTypeMappings.test_obj_jsonN)r*   r+   r,   rC   rS   r]   rg   r0   r0   r0   r3   r"   6   s
    r"   c                   @   sd  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWS )XTestSqlAlchemySchemac                 C   sX   t dt j td| _t| jd | _t  | _	t
j_| j| j	_t dtj d S )NrP   zsqlite:///:memory:)bindzTesting against sqlalchemy-%s)logging	getLoggersetLevelDEBUGr   enginer
   sessionr   metadatar:   rL   sqla_metadatari   inforP   __version__r@   r0   r0   r3   setUp   s   

zTestSqlAlchemySchema.setUpc                    s   t  d d G dd dt G  fdddt}| j  |d dd	d
d}| j| | j  ddl	m
} d|j_||d || jjv sLJ | j  |jjdksYJ d S )Nr   r#   c                   @   r^   )z;TestSqlAlchemySchema.test_obj_json_dirty.<locals>.SomeClassNr_   r0   r0   r0   r3   rb      rc   rb   c                       s4   e Zd Zddf Zdeddfd dfgZdS )	z<TestSqlAlchemySchema.test_obj_json_dirty.<locals>.SomeClass1r%   r&   r.   Tr'   rW   rX   N)r*   r+   r,   r-   r   rG   rd   r0   re   r0   r3   r4      s
    r4      r`   g      E@)r`   ra   )r.   rW   )flag_modifiedssrW   )r$   r8   r   r:   rp   
create_allro   addcommitsqlalchemy.orm.attributesrw   rW   r`   dirty)r@   r4   sc1rw   r0   re   r3   test_obj_json_dirty   s   



z(TestSqlAlchemySchema.test_obj_json_dirtyc                 C   s   G dd dt }|j}| j  |jjjdksJ |jjjdks"J t|j	}|j
dd d |D ]}d|jv s?d	|jv s?J d	|jv rI|jsIJ q1d S )
Nc                   @   s<   e Zd ZdZddiZedddZedddZedddZ	d	S )
z3TestSqlAlchemySchema.test_schema.<locals>.SomeClass
some_classsqlite_autoincrementTFprimary_keyautoincrement@   )unique)indexN)
r*   r+   r,   r-   __table_args__r   idr   r`   r.   r0   r0   r0   r3   rb      s    rb   TFc                 S   s   | j S Nname)idxr0   r0   r3   <lambda>   s    z2TestSqlAlchemySchema.test_schema.<locals>.<lambda>)keyr.   r`   )r:   	__table__rp   ry   rN   r   r   r   listindexessortcolumnsr   )r@   rb   tr   r   r0   r0   r3   test_schema   s   



z TestSqlAlchemySchema.test_schemac                 C   s2   G dd dt }|j}| j  d|jv sJ d S )Nc                   @   s6   e Zd ZdZddiZedddZededdd	Z	d
S )z;TestSqlAlchemySchema.test_colname_simple.<locals>.SomeClassr   r   TFr   r   rx   r   )sqla_column_argsN)
r*   r+   r,   r-   r   r   r   r   r<   r`   r0   r0   r0   r3   rb      s
    rb   rx   r:   r   rp   ry   rN   r@   rb   r   r0   r0   r3   test_colname_simple   s   
z(TestSqlAlchemySchema.test_colname_simplec                    F   G dd dt  G  fdddt }|j}| j  d|jv s!J d S )Nc                   @   *   e Zd ZdZddiZeddZedZdS )zGTestSqlAlchemySchema.test_colname_complex_table.<locals>.SomeOtherClasssome_other_classr   Tr   r   N	r*   r+   r,   r-   r   r   r   r   r`   r0   r0   r0   r3   SomeOtherClass   
    
r   c                       8   e Zd ZdZddifZeddZ jdedddZ	d	S )
zBTestSqlAlchemySchema.test_colname_complex_table.<locals>.SomeClassr   r   Tr   r   oor   rG   r   N
r*   r+   r,   r-   r   r   r   rf   r<   or0   r   r0   r3   rb          

rb   oo_idr   r   r0   r   r3   test_colname_complex_table   
   

z/TestSqlAlchemySchema.test_colname_complex_tablec                    r   )Nc                   @   r   )zFTestSqlAlchemySchema.test_colname_complex_json.<locals>.SomeOtherClassr   r   Tr   r   Nr   r0   r0   r0   r3   r      r   r   c                       r   )
zATestSqlAlchemySchema.test_colname_complex_json.<locals>.SomeClassr   r   Tr   rU   r   r   r   Nr   r0   r   r0   r3   rb      r   rb   r   r   r   r0   r   r3   test_colname_complex_json   r   z.TestSqlAlchemySchema.test_colname_complex_jsonc                    s   G dd dt  G  fdddt }| j   dd}||d}| j| | j  | j  | j|d}t	| |j
jdksFJ |jdksMJ d |_
| j  | j  | j|d}|j
d ksjJ |jd ksqJ d S )	Nc                   @   r   )z<TestSqlAlchemySchema.test_nested_sql.<locals>.SomeOtherClassr   r   Tr   r   Nr   r0   r0   r0   r3   r   	  r   r   c                       s0   e Zd ZdZddifZeddZ jddZdS )z7TestSqlAlchemySchema.test_nested_sql.<locals>.SomeClassr   r   Tr   r   rF   N	r*   r+   r,   r-   r   r   r   rf   r   r0   r   r0   r3   rb     s    
rb   eher`   )r   r&   )r:   rp   ry   ro   rz   r{   closequerygetprintr   r`   o_id)r@   rb   socscsc_dbr0   r   r3   test_nested_sql  s$   
	





z$TestSqlAlchemySchema.test_nested_sqlc                       G dd dt  G  fdddt }| j   dd} dd}|||gd}| j| | j  | j  | j|d	}|j	d
 j
dksKJ |j	d	 j
dksUJ | j  d S )Nc                   @   r   )zKTestSqlAlchemySchema.test_nested_sql_array_as_table.<locals>.SomeOtherClassr   r   Tr   r   Nr   r0   r0   r0   r3   r   0  r   r   c                       .   e Zd ZdZddiZeddZe ddZdS )zFTestSqlAlchemySchema.test_nested_sql_array_as_table.<locals>.SomeClassr   r   Tr   r   rF   N	r*   r+   r,   r-   r   r   r   r   othersr0   r   r0   r3   rb   7  
    
rb   ehe1r   ehe2r   r&   r   r:   rp   ry   ro   rz   r{   r   r   r   r   r`   r@   rb   soc1soc2r   r   r0   r   r3   test_nested_sql_array_as_table/     




z3TestSqlAlchemySchema.test_nested_sql_array_as_tablec                    r   )Nc                   @   r   )zQTestSqlAlchemySchema.test_nested_sql_array_as_multi_table.<locals>.SomeOtherClassr   r   Tr   r   Nr   r0   r0   r0   r3   r   P  r   r   c                       4   e Zd ZdZddiZeddZe edddZ	dS )zLTestSqlAlchemySchema.test_nested_sql_array_as_multi_table.<locals>.SomeClassr   r   Tr   multirF   N
r*   r+   r,   r-   r   r   r   r   r   r   r0   r   r0   r3   rb   W  
    
rb   r   r   r   r   r&   r   r   r   r0   r   r3   $test_nested_sql_array_as_multi_tableO  r   z9TestSqlAlchemySchema.test_nested_sql_array_as_multi_tablec                    s   G dd dt  G  fdddt }| j   dd} dd}|||gd}| j| | j  | j  | j  }|d	 j	d	 j
d
ksLJ |d
 j	d	 j
d
ksXJ | j  d S )Nc                   @   r   )z^TestSqlAlchemySchema.test_nested_sql_array_as_multi_table_with_backref.<locals>.SomeOtherClassr   r   Tr   r   Nr   r0   r0   r0   r3   r   p  r   r   c                       s6   e Zd ZdZddiZeddZe eddddZ	dS )	zYTestSqlAlchemySchema.test_nested_sql_array_as_multi_table_with_backref.<locals>.SomeClassr   r   Tr   some_classes)r   backrefrF   Nr   r0   r   r0   r3   rb   w  s    


rb   r   r   r   r   r   r&   )r:   rp   ry   ro   rz   r{   r   r   allr   r   )r@   rb   r   r   r   soc_dbr0   r   r3   1test_nested_sql_array_as_multi_table_with_backrefo  s   




zFTestSqlAlchemySchema.test_nested_sql_array_as_multi_table_with_backrefc                       G dd dt  G  fdddt}| j   dd} dd}|||gd}| j| | j  | j  | j|	d	}|j
d
 jdksKJ |j
d	 jdksUJ | j  d S )Nc                   @      e Zd ZeZedZdS )zITestSqlAlchemySchema.test_nested_sql_array_as_xml.<locals>.SomeOtherClassr   Nr*   r+   r,   r   r   r   r`   r0   r0   r0   r3   r         r   c                       r   )zDTestSqlAlchemySchema.test_nested_sql_array_as_xml.<locals>.SomeClassr   r   Tr   r   rF   Nr   r0   r   r0   r3   rb     r   rb   r   r   r   r   r&   r   r   r:   rp   ry   ro   rz   r{   r   r   r   r   r`   r   r0   r   r3   test_nested_sql_array_as_xml     




z1TestSqlAlchemySchema.test_nested_sql_array_as_xmlc                    s   G dd dt  G  fdddt}| j   dd} dd}|||gd}| j| | j  | j  | j 	d	
 d
 d
 }d
dlm} ||jdksVJ | j  d S )Nc                   @   r   )zOTestSqlAlchemySchema.test_nested_sql_array_as_xml_no_ns.<locals>.SomeOtherClassr   Nr   r0   r0   r0   r3   r     r   r   c                       r   )zJTestSqlAlchemySchema.test_nested_sql_array_as_xml_no_ns.<locals>.SomeClassr   r   Tr   )no_nsrF   N)
r*   r+   r,   r-   r   r   r   r   r   r   r0   r   r0   r3   rb     r   rb   r   r   r   r   zselect others from some_classr   )etreeSomeOtherClassArray)r   r:   rp   ry   ro   rz   r{   r   
connectionexecutefetchalllxmlr   
fromstringtag)r@   rb   r   r   r   sc_xmlr   r0   r   r3   "test_nested_sql_array_as_xml_no_ns  s"   




z7TestSqlAlchemySchema.test_nested_sql_array_as_xml_no_nsc                 C   s   G dd dt }G dd d|}| j  |ddg dd}| j| | j  | j  | j|d}|j	g dks@J | j  | j|d}|j
dksUJ z|j	 W td	 tyf   Y nw | j  d S )
Nc                   @   r   )z=TestSqlAlchemySchema.test_inheritance.<locals>.SomeOtherClassr   r   Tr   r   Nr   r0   r0   r0   r3   r     r   r   c                   @   s"   e Zd ZeeedddZdS )z8TestSqlAlchemySchema.test_inheritance.<locals>.SomeClassTrW   r   root_tagN)r*   r+   r,   r   r   rG   r   numbersr0   r0   r0   r3   rb     s    rb   rv   r`   r&   rE   r#   r6   r   r`   r   z	must fail)r:   rp   ry   ro   rz   r{   r   r   r   r   r   AttributeError	Exception)r@   r   rb   r   r   r0   r0   r3   test_inheritance  s&   



z%TestSqlAlchemySchema.test_inheritancec                       G dd dt  G  fdddt }G dd d|}tj  |jj}|jj}|jr,J | D ]}||urD|jd |jd urDt	dq0d S )	Nc                   @   r   )zFTestSqlAlchemySchema.test_inheritance_with_complex_fields.<locals>.Foofoor   Tr   r   Nr   r0   r0   r0   r3   Foo  r   r   c                       sL   e Zd ZdZddiZddddZeddZedZ	ed	Z
e d
ZdS )zFTestSqlAlchemySchema.test_inheritance_with_complex_fields.<locals>.Barbarr   TrO   *polymorphic_onpolymorphic_identitywith_polymorphicr   r      r   N)r*   r+   r,   r-   r   __mapper_args__r   r   r   r`   rO   r   rG   foosr0   r   r0   r3   Bar  s    
r   c                   @      e Zd ZddiZeZdS )zITestSqlAlchemySchema.test_inheritance_with_complex_fields.<locals>.SubBarr   subbarNr*   r+   r,   r   r   r.   r0   r0   r0   r3   SubBar      r   r   IThou shalt stop children relationships from overriding the ones in parent
r:   rP   ormconfigure_mappersrL   sqla_mapperconcreteiterate_to_rootrelationshipsr   r@   r   r   mapper_subbar
mapper_bar
inheritingr0   r   r3   $test_inheritance_with_complex_fields  s   

z9TestSqlAlchemySchema.test_inheritance_with_complex_fieldsc                    r   )	Nc                   @   r   )zATestSqlAlchemySchema.test_mixins_with_complex_fields.<locals>.Foor   r   Tr   r   Nr   r0   r0   r0   r3   r     r   r   c                       sP   e Zd ZdZddiZdZddddZeddZe	dZ
e	d	Ze d
ZdS )zATestSqlAlchemySchema.test_mixins_with_complex_fields.<locals>.Barr   r   TrO   r   r   r   r   r   r   N)r*   r+   r,   r-   r   	__mixin__r   r   r   r   r`   rO   r   rG   r   r0   r   r0   r3   r     s    
r   c                   @   r   )zDTestSqlAlchemySchema.test_mixins_with_complex_fields.<locals>.SubBarr   r   Nr   r0   r0   r0   r3   r   -  r   r   r   r   r   r  r0   r   r3   test_mixins_with_complex_fields  s   

z4TestSqlAlchemySchema.test_mixins_with_complex_fieldsc           	      C   s  G dd dt }G dd d|}G dd d|}td| jtdtjd	d
tdtdtdtdtdtdtdtddd}t|||jj	dd}t||dd}t||dd}| j
  |dd}| j| | j  | j  | j|djdd j	dksJ d S )Nc                   @      e Zd Zdd Zdd ZdS )zBTestSqlAlchemySchema.test_sqlalchemy_inheritance.<locals>.Employeec                 S   s
   || _ d S r   r   )r@   r   r0   r0   r3   __init__E  s   
zKTestSqlAlchemySchema.test_sqlalchemy_inheritance.<locals>.Employee.__init__c                 S   s   | j jd | j S N )	__class__r*   r   rt   r0   r0   r3   __repr__H  s   zKTestSqlAlchemySchema.test_sqlalchemy_inheritance.<locals>.Employee.__repr__Nr*   r+   r,   r  r  r0   r0   r0   r3   EmployeeD      r  c                   @   r  )zATestSqlAlchemySchema.test_sqlalchemy_inheritance.<locals>.Managerc                 S      || _ || _d S r   )r   manager_data)r@   r   r  r0   r0   r3   r  L     
zJTestSqlAlchemySchema.test_sqlalchemy_inheritance.<locals>.Manager.__init__c                 S      | j jd | j d | j S r  )r  r*   r   r  rt   r0   r0   r3   r  P     
zJTestSqlAlchemySchema.test_sqlalchemy_inheritance.<locals>.Manager.__repr__Nr  r0   r0   r0   r3   ManagerK      r  c                   @   r  )zBTestSqlAlchemySchema.test_sqlalchemy_inheritance.<locals>.Engineerc                 S   r  r   )r   engineer_info)r@   r   r  r0   r0   r3   r  W  r  zKTestSqlAlchemySchema.test_sqlalchemy_inheritance.<locals>.Engineer.__init__c                 S   r  r  )r  r*   r   r  rt   r0   r0   r3   r  [  r  zKTestSqlAlchemySchema.test_sqlalchemy_inheritance.<locals>.Engineer.__repr__Nr  r0   r0   r0   r3   EngineerV  r  r  	employeesemployee_idTr   r   2   r  r  rO      F)nullableemployeer   r   manager)inheritsr   engineerdatar   r&   )r!  )objectr   rp   r   rP   r   Stringr	   rN   rO   ry   ro   rz   r{   r   r   r   	filter_byone)	r@   r  r  r  employees_tableemployee_mappermanager_mapperengineer_mapperr'  r0   r0   r3   test_sqlalchemy_inheritance@  s<   



z0TestSqlAlchemySchema.test_sqlalchemy_inheritancec                 C   s   G dd dt }G dd d|}| j  |jjjjdksJ |jjjjdks)J |dd}| j	| | j
  |j}z|d	d
}| j	| | j
  W td ty_   | j  Y nw |dd}| j	| | j
  | j  | j|dj|d jdksJ | j  d S )Nc                   @   sB   e Zd ZdZddiZdddZeddZedd	Ze	d
dd	Z
dS )zjTestSqlAlchemySchema.test_inheritance_polymorphic_with_non_nullables_in_subclasses.<locals>.SomeOtherClassr   r   Tr   r&   r&  r   Fnillabler   N)r*   r+   r,   r-   r   r   r   r   r   r   r`   r0   r0   r0   r3   r     s    


r   c                   @   s"   e Zd ZdddifZeddZdS )zeTestSqlAlchemySchema.test_inheritance_polymorphic_with_non_nullables_in_subclasses.<locals>.SomeClassr0   r   rE   Fr4  N)r*   r+   r,   r   r   r.   r0   r0   r0   r3   rb     s
    rb   FTr`   r   rv   r7   zMust fail with IntegrityError.r   r   r&   )r:   rp   ry   r   rN   r`   r$  r.   ro   rz   r{   r   r   rollbackr   expunge_allr   r   r-  r.  r   r   )r@   r   rb   r   soc_idr   sc2r0   r0   r3   =test_inheritance_polymorphic_with_non_nullables_in_subclasses~  s6   	






zRTestSqlAlchemySchema.test_inheritance_polymorphic_with_non_nullables_in_subclassesc                 C   s   G dd dt }G dd d|}| j  |ddg dd}| j| | j  | j  | j|d	j	dd

 jdksBJ | j  d S )Nc                   @   s>   e Zd ZdZddiZdddZeddZedZ	ed	d
Z
dS )zITestSqlAlchemySchema.test_inheritance_polymorphic.<locals>.SomeOtherClassr   r   Tr   r&   r&  r   r   Fr4  N)r*   r+   r,   r-   r   r   r   r   r   r`   r   r0   r0   r0   r3   r     s    

r   c                   @   s*   e Zd ZddiZeeedddZdS )zDTestSqlAlchemySchema.test_inheritance_polymorphic.<locals>.SomeClassr   rE   TrW   r   N)	r*   r+   r,   r   r   r   rG   r   r   r0   r0   r0   r3   rb     s    rb   rv   r`   r   r   r   r6  rE   )r:   rp   ry   ro   rz   r{   r   r   r   r-  r.  r   )r@   r   rb   r   r0   r0   r3   test_inheritance_polymorphic  s   	


z1TestSqlAlchemySchema.test_inheritance_polymorphicc                    r   )Nc                   @   r   )zJTestSqlAlchemySchema.test_nested_sql_array_as_json.<locals>.SomeOtherClassr   Nr   r0   r0   r0   r3   r     r   r   c                       r   )zETestSqlAlchemySchema.test_nested_sql_array_as_json.<locals>.SomeClassr   r   Tr   rU   rF   Nr   r0   r   r0   r3   rb     r   rb   r   r   r   r   r&   r   r   r   r0   r   r3   test_nested_sql_array_as_json  r   z2TestSqlAlchemySchema.test_nested_sql_array_as_jsonc                 C   sr   G dd dt }| j  | j|dd | j  | j  | j|d}|j	dks0J |j
dks7J d S )Nc                   @   s2   e Zd ZdZddiZeeddZee	dZ
dS )z6TestSqlAlchemySchema.test_modifiers.<locals>.SomeClassr   r   Tr'   r   N)r*   r+   r,   r-   r   r   r   r.   r   r   r`   r0   r0   r0   r3   rb     s
    rb   r`   r   r&   )r:   rp   ry   ro   rz   r{   r8  r   r   r.   r`   )r@   rb   retr0   r0   r3   test_modifiers  s   


z#TestSqlAlchemySchema.test_modifiersc                    sp   G dd dt  G  fdddt}| j  | j|  | j  | j  | j|	dj
dks6J d S )Nc                   @   r   )z>TestSqlAlchemySchema.test_default_ctor.<locals>.SomeOtherClassr   Nr   r0   r0   r0   r3   r     r   r   c                       s:   e Zd ZdZddiZeddZe ddZe	ddd	Z
d
S )z9TestSqlAlchemySchema.test_default_ctor.<locals>.SomeClassr   r   Tr   rU   rF   r)   uuu)defaultN)r*   r+   r,   r-   r   r   r   r   r   r   fr0   r   r0   r3   rb      s    
rb   r&   r@  )r   r:   rp   ry   ro   rz   r{   r8  r   r   rB  r@   rb   r0   r   r3   test_default_ctor  s   


 z&TestSqlAlchemySchema.test_default_ctorc                 C   sn   G dd dt }| j  | }|jd u sJ | j| | j  | j  | j|	djdks5J d S )Nc                   @   s.   e Zd ZdZddiZeddZedddZdS )	z:TestSqlAlchemySchema.test_default_value.<locals>.SomeClassr   r   Tr   r)   r@  )
db_defaultN)	r*   r+   r,   r-   r   r   r   r   rB  r0   r0   r0   r3   rb     r   rb   r&   r@  )
r:   rp   ry   rB  ro   rz   r{   r8  r   r   )r@   rb   valr0   r0   r3   test_default_value  s   


 z'TestSqlAlchemySchema.test_default_valuec                    sJ   G dd dt  G  fdddt }| j  | j|  | j  d S )Nc                   @   r   )zTTestSqlAlchemySchema.test_default_ctor_with_sql_relationship.<locals>.SomeOtherClassr   r   Tr   r   Nr   r0   r0   r0   r3   r   #  r   r   c                       s.   e Zd ZdZddiZeddZ jddZdS )zOTestSqlAlchemySchema.test_default_ctor_with_sql_relationship.<locals>.SomeClassr   r   Tr   r   rF   Nr   r0   r   r0   r3   rb   *  r   rb   )r:   rp   ry   ro   rz   r{   rC  r0   r   r3   'test_default_ctor_with_sql_relationship"  s
   
z<TestSqlAlchemySchema.test_default_ctor_with_sql_relationshipc                    sJ   G dd dt  G  fdddt }| j  |jj\}d|jv s#J d S )Nc                   @   r   )z@TestSqlAlchemySchema.test_store_as_index.<locals>.SomeOtherClassr   r   Tr   r   Nr   r0   r0   r0   r3   r   6  r   r   c                       s0   e Zd ZdZddiZeddZ jdddZdS )	z;TestSqlAlchemySchema.test_store_as_index.<locals>.SomeClassr   r   Tr   r   btree)rG   r   Nr   r0   r   r0   r3   rb   =  s
    
rb   r   )r:   rp   ry   r   r   r   )r@   rb   r   r0   r   r3   test_store_as_index5  s
   

z(TestSqlAlchemySchema.test_store_as_indexc                 C   s  G dd dt }| j  | j|dg dd | j  | j|d}|jg dks0J ~| j|d}|j	d | j  ~| j|d}|jg dksXJ | j|d}|jdd  |_| j  ~| j|d}|jg dksJ d S )	Nc                   @   s(   e Zd ZdZeddZeedZ	dS )z>TestSqlAlchemySchema.test_scalar_collection.<locals>.SomeClassr   Tr   r   N)
r*   r+   r,   r-   r   r   r   r   rG   valuesr0   r0   r0   r3   rb   I      
rb   r&   )rW   rD   rN   )r   rK  ra   )rW   rD   rN   ra   )rD   rN   ra   )
r:   rp   ry   ro   rz   r{   r   r   rK  append)r@   rb   r   r0   r0   r3   test_scalar_collectionH  s&   



z+TestSqlAlchemySchema.test_scalar_collectionc                    s   G dd dt  G  fdddt }| j   ddd dd	d d
ddg}||d}| j| | j  |d |_| j  ~| j|	d}d
dd |jD dks[J tdd |jD dksiJ d S )Nc                   @   &   e Zd ZdZeddZedZeZdS )z=TestSqlAlchemySchema.test_multiple_fk.<locals>.SomeChildClasssome_child_classTr   r   N	r*   r+   r,   r-   r   r   r   r`   r.   r0   r0   r0   r3   SomeChildClassf  
    
rR  c                       s2   e Zd ZdZeddZe dZ dZ	dS )z8TestSqlAlchemySchema.test_multiple_fk.<locals>.SomeClassr   Tr   r   N)
r*   r+   r,   r-   r   r   r   rG   childrenmirrorr0   rR  r0   r3   rb   m  s
    
rb   piX  r`   r.   |
   q	   )rT  r&    c                 S      g | ]}|j qS r0   r   .0sccr0   r0   r3   
<listcomp>      z9TestSqlAlchemySchema.test_multiple_fk.<locals>.<listcomp>zp|qc                 S   r^  r0   r7   r_  r0   r0   r3   rb    rc  ik  )r:   rp   ry   ro   rz   flushrU  r{   r   r   joinrT  sum)r@   rb   rT  r   r0   rV  r3   test_multiple_fke  s    







 z%TestSqlAlchemySchema.test_multiple_fkc                 C   sV   G dd dt }G dd dt }|jjd j}t|dksJ |\}|jdks)J d S )Nc                   @   rO  )z;TestSqlAlchemySchema.test_simple_fk.<locals>.SomeChildClassrP  Tr   r   NrQ  r0   r0   r0   r3   rR    rS  rR  c                   @   s$   e Zd ZdZeddZeddZdS )z6TestSqlAlchemySchema.test_simple_fk.<locals>.SomeClassr   Tr   some_child_class.id)fkN)r*   r+   r,   r-   r   r   child_idr0   r0   r0   r3   rb     s    
rb   rj  r&   rh  )r:   r   rN   foreign_keyslen_colspec)r@   rR  rb   rk  ri  r0   r0   r3   test_simple_fk  s   z#TestSqlAlchemySchema.test_simple_fkc                    s   G dd dt  G dd dt G  fdddt }|jjjd }|jjj\}|jdks/J |jjj\}|jd	ks<J |jj	j\}|jd
ksIJ d S )Nc                   @   "   e Zd ZdZeddZedZdS )zGTestSqlAlchemySchema.test_multirel_single_table.<locals>.SomeChildClassrP  Tr   r   Nr*   r+   r,   r-   r   r   r   r`   r0   r0   r0   r3   rR        
rR  c                   @   s   e Zd ZdZeddZeZdS )zLTestSqlAlchemySchema.test_multirel_single_table.<locals>.SomeOtherChildClasssome_other_child_classTr   N)r*   r+   r,   r-   r   r   r.   r0   r0   r0   r3   SomeOtherChildClass  s    
rs  c                
       sR   e Zd ZdZeddZe eddddddd	d
Zeeddddddd	d
Z	dS )zBTestSqlAlchemySchema.test_multirel_single_table.<locals>.SomeClassr   Tr   rT  joined	parent_idrj  cascade)r   lazyleftrightfk_left_ondeletefk_right_ondeleterF   other_child_idN)
r*   r+   r,   r-   r   r   r   r   rT  other_childrenr0   rR  rs  r0   r3   rb     s&    
	
rb   rT  zsome_class.idrh  zsome_other_child_class.id)
r:   rL   rq   tablesrN   ru  rk  rm  rj  r|  )r@   rb   r   fkpfkcfkocr0   r~  r3   test_multirel_single_table  s   z/TestSqlAlchemySchema.test_multirel_single_tablec                    s   G dd dt }t jj  t  | j jj_ jj  G  fddd }tt	|j
  t|j
d ts:J dd t|D dgksHJ dd | D dgksVJ t|j
d	 ts`J |j
d	 jjd
kskJ d S )Nc                   @   ro  )z7TestSqlAlchemySchema.test_reflection.<locals>.SomeClassr   Tr   r)   Nrp  r0   r0   r0   r3   rb     rq  rb   c                       s   e Zd Z jjjd ZdS )z7TestSqlAlchemySchema.test_reflection.<locals>.Reflectedr   N)r*   r+   r,   rL   rq   r  r   r0   TM2r0   r3   	Reflected  s    r  r   c                 S      g | ]\}}|qS r0   r0   r`  kvr0   r0   r3   rb        z8TestSqlAlchemySchema.test_reflection.<locals>.<listcomp>c                 S   r  r0   r0   r  r0   r0   r3   rb    r  r`   r)   )r:   rL   rq   ry   r   rn   ri   reflectr   r<   rd   items
issubclassr   r   get_primary_keysr   max_len)r@   rb   r  r0   r  r3   test_reflection  s   z$TestSqlAlchemySchema.test_reflectionc                    s   G dd dt  G  fdddt }G  fdddt }| j ddd	d
 | j  | j d}| j|d}| j|d}d|_d|_| j  |jd	ksYJ |jdks`J d S )Nc                   @   s&   e Zd ZdZeddZeZedZdS )zBTestSqlAlchemySchema._test_sqlalchemy_remapping.<locals>.SomeTable
some_tableTr'   r)   N)	r*   r+   r,   r-   r   r   r.   r   r`   r0   r0   r0   r3   	SomeTable  s
    
r  c                       s    e Zd Z jZeddZeZdS )zHTestSqlAlchemySchema._test_sqlalchemy_remapping.<locals>.SomeTableSubsetTr'   N)r*   r+   r,   r   r   r   r.   r0   r  r0   r3   SomeTableSubset  s    
r  c                       s&   e Zd Z jZdd  j D ZdS )zMTestSqlAlchemySchema._test_sqlalchemy_remapping.<locals>.SomeTableOtherSubsetc                 S   s    g | ]\}}|d v r||fqS ))r   r`   r0   r  r0   r0   r3   rb    s    zXTestSqlAlchemySchema._test_sqlalchemy_remapping.<locals>.SomeTableOtherSubset.<listcomp>N)r*   r+   r,   r   rd   r  r0   r  r0   r3   SomeTableOtherSubset  s    r  r&   rE   r`   )r   r.   r`   r#   rx   )r:   ro   rz   r{   r   r   r.   r`   )r@   r  r  ststsstosr0   r  r3   _test_sqlalchemy_remapping  s   

z/TestSqlAlchemySchema._test_sqlalchemy_remappingc                 C   s   G dd dt }| j  |tjdddgdd}| j| | j  | j  | j	|
d}t| |jjdks>J |jjdksFJ |jjd	 d d  dksTJ d S )
Nc                   @   s*   e Zd ZdZeddZeedddZdS )z1TestSqlAlchemySchema.test_file_storage.<locals>.CrN   Tr'   test_file_storagerU   rF   N)	r*   r+   r,   r-   r   r   r   r   rB  r0   r0   r0   r3   C
  s    
r  r   rO   s   data)r   rO   r*  )rB  r&   r   )r:   rp   ry   r   Valuero   rz   rd  r{   r   r   r   rB  r   rO   r*  )r@   r  rN   r0   r0   r3   r  	  s   


 z&TestSqlAlchemySchema.test_file_storagec                    sR   G dd dt  G  fdddt } d|d  jjdj|u s'J d S )Nc                   @      e Zd ZdZeddZdS )zITestSqlAlchemySchema.test_append_field_complex_existing_column.<locals>.CrN   Tr'   Nr*   r+   r,   r-   r   ur0   r0   r0   r3   r        r  c                       s$   e Zd ZdZeddZ dZdS )zITestSqlAlchemySchema.test_append_field_complex_existing_column.<locals>.Dra   Tr'   r   N)r*   r+   r,   r-   r   ra   rG   rN   r0   r  r0   r3   D!  s    
r  ra   r   )r:   append_fieldrG   rL   r  get_propertyargumentr@   r  r0   r  r3   )test_append_field_complex_existing_column  s   z>TestSqlAlchemySchema.test_append_field_complex_existing_columnc                 C   sB   G dd dt }G dd d|}|dt |jjdsJ d S )Nc                   @   r  )zATestSqlAlchemySchema.test_append_field_complex_delayed.<locals>.CrN   Tr'   Nr  r0   r0   r0   r3   r  *  r  r  c                   @   s   e Zd ZeZdS )zATestSqlAlchemySchema.test_append_field_complex_delayed.<locals>.DN)r*   r+   r,   r   r.   r0   r0   r0   r3   r  .  s    r  ra   )r:   r  r   rL   r  has_propertyr@   r  r  r0   r0   r3   !test_append_field_complex_delayed)  s   z6TestSqlAlchemySchema.test_append_field_complex_delayedc                    s(   G dd dt  G  fdddt }d S )Nc                   @   r  )zSTestSqlAlchemySchema._test_append_field_complex_explicit_existing_column.<locals>.CrN   Tr'   Nr*   r+   r,   r-   r   r   r0   r0   r0   r3   r  8  r  r  c                       s,   e Zd ZdZeddZ dZedZdS )zSTestSqlAlchemySchema._test_append_field_complex_explicit_existing_column.<locals>.Dra   Tr'   r      N)	r*   r+   r,   r-   r   r   rG   rN   c_idr0   r  r0   r3   r  >  s
    

r  )r:   r  r0   r  r3   3_test_append_field_complex_explicit_existing_column5  s   zHTestSqlAlchemySchema._test_append_field_complex_explicit_existing_columnc                    s   G dd dt  G  fdddt } d|jtddd | j   d	d
 dd
}}|d	||gd}| j| | j  |j	j
d	ksJJ d S )Nc                   @   r  )zHTestSqlAlchemySchema.test_append_field_complex_circular_array.<locals>.CccTr'   Nr  r0   r0   r0   r3   r  E  r  r  c                       s0   e Zd ZdZeddZe jedddZ	dS )zHTestSqlAlchemySchema.test_append_field_complex_circular_array.<locals>.DddTr'   dd_id)ry  rF   N)
r*   r+   r,   r-   r   r   r   rf   r   rN   r0   r  r0   r3   r  I  s    
r  ra   r  rx  rF   r&   r6  rE   )r   rN   )r:   r  rf   r   rp   ry   ro   rz   r{   ra   r   )r@   r  c1c2ra   r0   r  r3   (test_append_field_complex_circular_arrayD  s   

z=TestSqlAlchemySchema.test_append_field_complex_circular_arrayc                 C   sj   G dd dt }G dd dt }|d|d |jjdj|u s%J t|jjj	d j
tjs3J d S )Nc                   @   r  )zDTestSqlAlchemySchema.test_append_field_complex_new_column.<locals>.CrN   Tr'   Nr  r0   r0   r0   r3   r  X  r  r  c                   @   r  )zDTestSqlAlchemySchema.test_append_field_complex_new_column.<locals>.Dra   Tr'   Nr  r0   r0   r0   r3   r  \  r  r  ra   r   d_id)r:   r  rG   rL   r  r  r  rK   rM   rN   rO   rP   r   r  r0   r0   r3   $test_append_field_complex_new_columnW  s   z9TestSqlAlchemySchema.test_append_field_complex_new_columnc                 C   s~   G dd dt }G dd dt }|dt|d |jjdj|u s'J tt	|jj
 t|jj
jd jtjs=J d S )Nc                   @   r  )z7TestSqlAlchemySchema.test_append_field_array.<locals>.CrN   Tr'   Nr  r0   r0   r0   r3   r  f  r  r  c                   @   r  )z7TestSqlAlchemySchema.test_append_field_array.<locals>.Dra   Tr'   Nr  r0   r0   r0   r3   r  j  r  r  ra   r   r  )r:   r  r   rG   rL   r  r  r  r   reprrM   rK   rN   rO   rP   r   r  r0   r0   r3   test_append_field_arraye  s   z,TestSqlAlchemySchema.test_append_field_arrayc                 C   s   G dd dt }G dd dt }|dt|tdd |jjdj|u s*J |jj	j
d }d|jv s8J d	|jv s?J d S )
Nc                   @   r  )z<TestSqlAlchemySchema.test_append_field_array_many.<locals>.CrN   Tr'   Nr  r0   r0   r0   r3   r  u  r  r  c                   @   r  )z<TestSqlAlchemySchema.test_append_field_array_many.<locals>.Dra   Tr'   Nr  r0   r0   r0   r3   r  y  r  r  ra   c_dr   r  r  )r:   r  r   rG   r   rL   r  r  r  rq   r  rN   )r@   r  r  	rel_tabler0   r0   r3   test_append_field_array_manyt  s   z1TestSqlAlchemySchema.test_append_field_array_manyc                    sZ   G dd dt  G  fdddt } d|jdtddd	  jjd jdks+J d S )
Nc                   @   r  )z>TestSqlAlchemySchema.test_append_field_complex_cust.<locals>.CrN   Tr'   Nr  r0   r0   r0   r3   r    r  r  c                       s(   e Zd ZdZeddZe dZdS )z>TestSqlAlchemySchema.test_append_field_complex_cust.<locals>.Dra   Tr'   r   N)	r*   r+   r,   r-   r   r   r   rG   rN   r0   r  r0   r3   r    s    
r  ra   Fr  r  )r$  rG   )r:   r  rf   r   r   rN   r$  r  r0   r  r3   test_append_field_complex_cust  s   
z3TestSqlAlchemySchema.test_append_field_complex_custc                 C   s   G dd dt }| }|dt |  | j  d|jv s!J d|jjj	v s*J | j
|dd | j
  | j
| jdksEJ d S )Nc                   @   r  )z7TestSqlAlchemySchema._test_append_field_cust.<locals>.CrN   Tr'   Nr  r0   r0   r0   r3   r    r  r  r`   r   r   )r:   rf   r  r   rp   ry   rd   rL   r  r   ro   rz   r{   r   firstr`   )r@   r  C2r0   r0   r3   _test_append_field_cust  s   

z,TestSqlAlchemySchema._test_append_field_custc                 C   s\   G dd dt }G dd d|}| }| jdksJ | jdks$J | jd ks,J d S )Nc                   @   ,   e Zd ZdZdddZeddZeeZdS )z5TestSqlAlchemySchema.test_polymorphic_cust.<locals>.CrN   r   r&   r&  Tr'   N	r*   r+   r,   r-   r   r   r   r   r   r0   r0   r0   r3   r        
r  c                   @   r   )z5TestSqlAlchemySchema.test_polymorphic_cust.<locals>.Dr   rE   N)r*   r+   r,   r   r   ra   r0   r0   r0   r3   r    r   r  r&   rE   )r:   rf   r   )r@   r  r  D2r0   r0   r3   test_polymorphic_cust  s   
z*TestSqlAlchemySchema.test_polymorphic_custc                 C   s   G dd dt }G dd d|}|dt | j  | j|ddd | j  | j|	 }|j
dks9J |jdks@J |jd	ksGJ d S )
Nc                   @   r  )z7TestSqlAlchemySchema.test_base_append_simple.<locals>.BrD   r   r&   r&  Tr'   Nr  r0   r0   r0   r3   B  r  r  c                   @   r   )z7TestSqlAlchemySchema.test_base_append_simple.<locals>.Cr   r&   Nr*   r+   r,   r   r   r`   r0   r0   r0   r3   r    r   r  r.   r   *   rX  r&   )r:   r  r   rp   ry   ro   rz   r{   r   r  r`   r.   r   )r@   r  r  rN   r0   r0   r3   test_base_append_simple  s   


z,TestSqlAlchemySchema.test_base_append_simplec                 C   s   G dd dt }G dd d|}G dd dt }|d|d | j  | j||d	d
d | j  | j|	 }|j
jd	ksGJ d S )Nc                   @   r  )z8TestSqlAlchemySchema.test_base_append_complex.<locals>.BrD   r   r&   r&  Tr'   Nr  r0   r0   r0   r3   r    r  r  c                   @   r   )z8TestSqlAlchemySchema.test_base_append_complex.<locals>.Cr   r&   Nr  r0   r0   r0   r3   r    r   r  c                   @   s"   e Zd ZdZeddZeeZdS )z8TestSqlAlchemySchema.test_base_append_complex.<locals>.Dra   Tr'   N)r*   r+   r,   r-   r   r   r   r.   r0   r0   r0   r3   r    s    
r  ra   r   r  r7   )ra   )r:   r  rG   rp   ry   ro   rz   r{   r   r  ra   r.   )r@   r  r  r  rN   r0   r0   r3   test_base_append_complex  s   


z-TestSqlAlchemySchema.test_base_append_complexN).r*   r+   r,   ru   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r3  r;  r<  r=  r?  rD  rG  rH  rJ  rN  rg  rn  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r0   r0   r0   r3   rh      sX    	$'  !")*>5"/  rh   c                   @   r  )"TestSqlAlchemySchemaWithPostgresqlc                 C   s   t   | _tj_d S r   )r   rp   r:   rL   rq   rt   r0   r0   r3   ru     s   z(TestSqlAlchemySchemaWithPostgresql.setUpc                    sT   dd G  fdddt }| jj }d|jv sJ t|jjjj ks(J d S )N	test_enum)
SUBSCRIBEDUNSUBSCRIBEDUNCONFIRMEDc                       s(   e Zd ZZeddZe ddiZdS )z?TestSqlAlchemySchemaWithPostgresql.test_enum.<locals>.SomeClassTr   	type_namestatus_choicesN)r*   r+   r,   r-   r   r   r   r/   r0   enums
table_namer0   r3   rb   
  rL  rb   r/   )r:   rp   r  rN   tupler/   rO   r  r   r0   r  r3   r    s   z,TestSqlAlchemySchemaWithPostgresql.test_enumN)r*   r+   r,   ru   r  r0   r0   r0   r3   r    r  r  __main__)4rj   basicConfigrm   r$   unittestrP   r   r   r   r   r   sqlalchemy.excr   sqlalchemy.ormr	   r
   spyner   r   r   spyne.modelr   r   r   r   r   r   r   r   r   r   r   r   spyne.model.binaryr   spyne.model.complexr   r   spyne.store.relationalr   spyne.store.relational.documentr   r   r    r!   r:   TestCaser"   rh   r  r*   mainr0   r0   r0   r3   <module>   sF   8T        