o
    j=U                     @   s  d dl mZ d dlZejejd 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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  d dl!m"Z" d dl#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/m0Z1 d dl2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z; d dl<m=Z= d dl>m?Z? G dd dej@ZAG dd dej@ZBeCdkreD  dS dS )    )print_functionN)level)pprint)	b64encodeetree)E)MethodContextrpc	ByteArrayFileAnyXmlIgnored)FakeContext)RESULT_SUFFIX)Service)
ServerBase)Application)srpc)BytesIO)FaultIntegerDecimalUnicodeDateDateTimeXmlDataArrayComplexModelXmlAttribute	Mandatory)XmlDocumentSchemaValidationError)six)get_xml_as_objectget_object_as_xmlget_object_as_xml_polymorphicget_xml_as_object_polymorphic)WsgiApplication)NS_XSIc                   @   s   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d5S )6TestXmlc                 C   s6   G dd dt }td}t||}|jdksJ d S )Nc                   @   s   e Zd ZeZdS )z$TestXml.test_empty_string.<locals>.aN)__name__
__module____qualname__r   b r/   r/   \/var/www/html/LicenciasMiG/venv/lib/python3.10/site-packages/spyne/test/protocol/test_xml.pya:   s    r1   z<a><b/></a> )r   r   
fromstringr$   r.   )selfr1   eltor/   r/   r0   test_empty_string9   s   

zTestXml.test_empty_stringc                    s   t d G  fdddt}t|gdt t d}t|}t|tj}dt 	ddg|_
||\}|| || || td	|j}ttj|d
dd dtt|ksdJ d S )N1e100c                       *   e Zd Zeedded fddZdS )z)TestXml.test_ignored.<locals>.SomeServicex      _returnsc                    s:   t |  t t|  t| tjksJ  | ksJ t| S N)printtypedecimalr   r   pdr/   r0   	some_callF   s
   z3TestXml.test_ignored.<locals>.SomeService.some_callNr+   r,   r-   r   r   rF   r/   rD   r/   r0   SomeServiceE       rH   tnsin_protocolout_protocol   <some_call xmlns="tns"><p>ascii   </p></some_call>    Tpretty_printutf8r   )rA   r   r   r   r!   r   r	   SERVERstrencode	in_stringgenerate_contextsget_in_objectget_out_objectget_out_stringr   r3   join
out_stringlogginginfotostringdecodelenlist)r4   rH   appserverinitial_ctxctxr5   r/   rD   r0   test_ignoredB   s$   
	


zTestXml.test_ignoredc                    s   G dd dt  G  fdddt}t|gddt t d}t|}t|tj}dg|_||\}|	| |
| || t|j t|jj td	|jjd
t |jjdd }ttj|dd |jdkspJ |jd dksyJ d S )Nc                   @   s   e Zd ZeeZeeZdS )z TestXml.test_xml_data.<locals>.CN)r+   r,   r-   r   r   r1   r   r.   r/   r/   r/   r0   Cd   s    rj   c                       s    e Zd Ze  ddd ZdS )z*TestXml.test_xml_data.<locals>.SomeServicer<   c                 S   s    | j dksJ | jdksJ | S )Nr1   r.   )r1   r.   cr/   r/   r0   rF   i   s   z4TestXml.test_xml_data.<locals>.SomeService.some_callN)r+   r,   r-   r   rF   r/   rj   r/   r0   rH   h   s    
rH   rJ   test_xml_datanamerL   rM   s1   <some_call xmlns="tns"><c b="b">a</c></some_call>rQ   z//tns:some_call
namespacesr   TrR   r1   r.   )r   r   r   r!   r   r	   rU   rX   rY   rZ   r[   r\   r?   r^   r   	interfacensmapr   r3   r]   xpathr   ra   textattrib)r4   rH   re   rf   rg   rh   retr/   rm   r0   rn   c   s.   




zTestXml.test_xml_datac                 C   sf   t d}ddg}ttdd}t d |||d tt j|dd |jdd	did
}||ks1J d S )Nparentr1   r.   rJ   )	namespaceTrR   z//x:stringArray/x:string/text()xrq   )	r   Elementr   r   r!   	to_parentr?   ra   ru   )r4   ry   valclsru   r/   r/   r0   test_wrapped_array   s   
zTestXml.test_wrapped_arrayc                 C   sr   G dd dt }|ddgd}td}t d |||d ttj|dd	 |jd
ddid}||jks7J d S )Nc                   @   s   e Zd ZdZeddZdS )z&TestXml.test_simple_array.<locals>.clsrJ   	unbounded)
max_occursN)r+   r,   r-   __namespace__r   sr/   r/   r/   r0   r      s    r   r1   r.   r   ry   rJ   TrR   z//x:cls/x:s/text()r{   rq   )	r   r   r|   r!   r}   r?   ra   ru   r   )r4   r   r~   ry   ru   r/   r/   r0   test_simple_array   s   
zTestXml.test_simple_arrayc                    s   t d G  fdddt}t|gdt t d}t|}t|tj}dt 	ddg|_
||\}|| || || td	|j}ttj|d
d |jd|jjdd }|t ksiJ d S )Nr8   c                       r9   )z)TestXml.test_decimal.<locals>.SomeServicer:   r;   r<   c                    s6   t |  t t|  t| tjksJ  | ksJ | S r>   )r?   r@   rA   r   rB   rD   r/   r0   rF      s
   z3TestXml.test_decimal.<locals>.SomeService.some_callNrG   r/   rD   r/   r0   rH      rI   rH   rJ   rK   rN   rO   rP   rQ   TrR   z//tns:some_callResult/text()rq   r   )rA   r   r   r   r!   r   r	   rU   rV   rW   rX   rY   rZ   r[   r\   r   r3   r]   r^   r?   ra   ru   rs   rt   )r4   rH   re   rf   rg   rh   r5   targetr/   rD   r0   test_decimal   s.   
	


zTestXml.test_decimalc                 C   s  ddl m} ddlm} ddlm} dddd}G d	d
 d
t}||ddddd|}t|j|dd |jd|ddgks@J |jd|ddgksLJ |jd|ddgksXJ |jd|ddgksdJ |||}t| |j	dkstJ |j
dks{J |jdksJ |jdksJ d S )Nr   r   r$   r%   aaccdds0s2s3c                   @   s4   e Zd ZdZeZeddZeddZedddZdS )	zTestXml.test_subs.<locals>.Cr   bbsub_namer   sub_nsr   r   r   N)	r+   r,   r-   r   r   r1   r.   rl   rE   r/   r/   r/   r0   rj      s    

rj            r;   r1   r.   rl   rE   TrR   zs0:a/text()rq   1zs0:bb/text()2zs2:c/text()3zs3:dd/text()4lxmlr   spyne.util.xmlr$   r%   r   r?   ra   ru   r1   r.   rl   rE   r4   r   r$   r%   mrj   r5   rl   r/   r/   r0   	test_subs   s(   
zTestXml.test_subsc                 C   s  ddl m} ddlm} ddlm} dddd}G d	d
 d
t}||ddddd|}t|j|dd |ddgks>J |ddgksHJ |jd|ddgksTJ |jd|ddgks`J |||}t| |j	dkspJ |j
dkswJ |jdks~J |jdksJ d S )Nr   r   r   r   r   r   r   r   c                   @   sD   e Zd ZdZeeZeeddZeeddZeedddZ	dS )	z&TestXml.test_sub_attributes.<locals>.Cr   r   r   r   r   r   r   N)
r+   r,   r-   r   r   r   r1   r.   rl   rE   r/   r/   r/   r0   rj      s    rj   r   r   r   r;   r   TrR   z//*/@ar   z//*/@bbr   z	//*/@s2:crq   r   z
//*/@s3:ddr   r   r   r/   r/   r0   test_sub_attributes   s(   
zTestXml.test_sub_attributesc                 C   s~   t }tdtdtdtdg}|D ]&}t||}t|tjdks'J |jdks.J |jdks5J |j	dks<J qd S )	Ns   <d>2013-04-05</d>s   <d>2013-04-05+02:00</d>s   <d>2013-04-05-02:00</d>s   <d>2013-04-05Z</d>Ti  r;      )
r   r   r3   r$   
isinstancedatetimedateyearmonthday)r4   rE   	xml_datesxml_daterl   r/   r/   r0   
test_dates  s   
zTestXml.test_datesc                 C   s   t j}t|dt}|jdksJ t|dt}|jdksJ t|dt}|jdks-J t|dt}tjs@|jdks>J d S |jdksGJ d S )Nz!<d>2013-04-05T06:07:08.123456</d>i@ z"<d>2013-04-05T06:07:08.1234567</d>iA z"<d>2013-04-05T06:07:08.1234564</d>z"<d>2013-04-05T06:07:08.1234565</d>)r   r3   r$   r   microsecondr#   PY2)r4   fsrE   r/   r/   r0   test_datetime_usec  s   zTestXml.test_datetime_usecc                 C   s,   t |t j}||_||\}|| |S r>   )r	   rU   rX   rY   rZ   )r4   rf   rX   rg   rh   r/   r/   r0   _get_ctx(  s
   
zTestXml._get_ctxc                 C   s   G dd dt }t|gddtddt d}t|}| |dg}|| || td		|j
jd
t |jjdd }|dksEJ | |dg}| t|j| d S )Nc                   @   s$   e Zd Zeeeeddd ZdS )z4TestXml.test_mandatory_elements.<locals>.SomeServicer<   c                 S   s   | dksJ | S Nhellor/   r   r/   r/   r0   rF   1  s   z>TestXml.test_mandatory_elements.<locals>.SomeService.some_callN)r+   r,   r-   r   Mr   rF   r/   r/   r/   r0   rH   0  s    rH   rJ   test_mandatory_elementsr   	validatorro   s/   <some_call xmlns="tns"><s>hello</s></some_call>rQ   z//tns:some_call%s/text()rq   r   r   #   <some_call xmlns="tns"></some_call>)r   r   r!   r   r   r[   r\   r   r3   r]   r^   ru   r   rs   rt   assertRaisesr"   )r4   rH   re   rf   rh   rx   r/   r/   r0   r   /  s,   


zTestXml.test_mandatory_elementsc              	   C   s   G dd dt }t|gddtddt d}t|}dd	}td
 |dddddt|dddd }td
 dd	d|v sDJ d S )Nc                   @   s&   e Zd Zeeddeddd ZdS )z<TestXml.test_unicode_chars_in_exception.<locals>.SomeServicer{   )patternr<   c                 S   s   t tttt d S r>   )testshouldneverreachherer   r/   r/   r0   rF   R  s   zFTestXml.test_unicode_chars_in_exception.<locals>.SomeService.some_callN)r+   r,   r-   r   r   rF   r/   r/   r/   r0   rH   Q  s    rH   rJ   r   r   r   ro   u,   <some_call xmlns="tns"><s>Ğ</s></some_call>rT   AAAr2   /POST	localhost80http)QUERY_STRING	PATH_INFOREQUEST_METHODSERVER_NAMESERVER_PORTz
wsgi.inputzwsgi.url_schemec                 S   s
   t | |S r>   )r?   )r{   yr/   r/   r0   <lambda>j  s   
 z9TestXml.test_unicode_chars_in_exception.<locals>.<lambda>u   ĞrQ   )r   r   r!   r(   rW   r?   r   r]   )r4   rH   re   rf   reqrespr/   r/   r0   test_unicode_chars_in_exceptionP  s.   
	z'TestXml.test_unicode_chars_in_exceptionc                       G dd dt  G  fdddt}t|gddtddt d	}t|}| |d
g}| t|j| | |dg}| t|j| d S )Nc                   @   s   e Zd ZeeZdS )z-TestXml.test_mandatory_subelements.<locals>.CN)r+   r,   r-   r   r   foor/   r/   r/   r0   rj   p  s    rj   c                       (   e Zd Ze jddeddd ZdS )z7TestXml.test_mandatory_subelements.<locals>.SomeServicer   
min_occursr<   c                 S   s    | d usJ | j dksJ | j S r   )r   rk   r/   r/   r0   rF   t  s   zATestXml.test_mandatory_subelements.<locals>.SomeService.some_callNr+   r,   r-   r   	customizer   rF   r/   rm   r/   r0   rH   s      rH   rJ   test_mandatory_subelementsr   r   ro   r   *   <some_call xmlns="tns"><c></c></some_call>	r   r   r   r!   r   r   r   r"   r[   r4   rH   re   rf   rh   r/   rm   r0   r   o  s    z"TestXml.test_mandatory_subelementsc                    r   )Nc                   @      e Zd ZeeeZdS )z4TestXml.test_mandatory_element_attributes.<locals>.CN)r+   r,   r-   r   r   r   barr/   r/   r/   r0   rj         rj   c                       r   )z>TestXml.test_mandatory_element_attributes.<locals>.SomeServicer   r   r<   c                 S   s.   | d usJ t | dsJ | jdksJ | jS )Nr   r   )hasattrr   rk   r/   r/   r0   rF     s   zHTestXml.test_mandatory_element_attributes.<locals>.SomeService.some_callNr   r/   rm   r/   r0   rH     r   rH   rJ   !test_mandatory_element_attributesr   r   ro   r   r   r   r   r/   rm   r0   r     s    z)TestXml.test_mandatory_element_attributesc                 C   sD   G dd dt }t|ddd|}t|}t| |dks J d S )Nc                   @   s.   e Zd ZG dd dejZeeZeeZ	dS )z-TestXml.test_bare_sub_name_ns.<locals>.Actionc                   @   s   e Zd ZdZdZdS )z8TestXml.test_bare_sub_name_ns.<locals>.Action.AttributesSOME_NSActionN)r+   r,   r-   r   r   r/   r/   r/   r0   
Attributes      r   N)
r+   r,   r-   r   r   r   r   datar   must_understandr/   r/   r/   r0   r     s    r   r{   r   )r   sB   <ns0:Action xmlns:ns0="SOME_NS" must_understand="y">x</ns0:Action>r   r%   r   ra   r?   r4   r   r5   eltstrr/   r/   r0   test_bare_sub_name_ns  s
   
zTestXml.test_bare_sub_name_nsc                 C   s>   G dd dt }t| |}t|}t| |dksJ d S )Nc                   @   r   )z5TestXml.test_null_mandatory_attribute.<locals>.ActionN)r+   r,   r-   r   r   r   r   r/   r/   r/   r0   r     r   r   s	   <Action/>r   r   r/   r/   r0   test_null_mandatory_attribute  s
   
z%TestXml.test_null_mandatory_attributec                 C   s@   d}t |gtd}t|}t| |jt|dksJ d S )N   aaaaBrO   )r%   r   r   ra   r?   rv   r   rb   r4   vr5   r   r/   r/   r0   test_bytearray  s
   
zTestXml.test_bytearrayc                 C   sD   d}t |tddd}t|}t| tj|d dd|ks J d S )Nz<roots><bloody/></roots>r   Tno_namespacer   unicodeencodingr%   r   r   ra   r?   r   r/   r/   r0   test_any_xml_text  s
   
zTestXml.test_any_xml_textc                 C   s@   d}t |tddd}t|}t| t|d |ksJ d S )Ns   <roots><bloody/></roots>r   Tr   r   r   r   r/   r/   r0   test_any_xml_bytes  s
   
zTestXml.test_any_xml_bytesc                 C   sR   t t t  }t|td}t|}t| t|d t|ks'J d S )Nr   r   )r   rootsbloodyr%   r   r   ra   r?   r   r/   r/   r0   test_any_xml_elt  s
   
 zTestXml.test_any_xml_eltc                 C   sN   d}t |}ttj|dtd}t|}t| |jt|	dks%J d S )Nr   )handler   rO   )
r   r%   r   Valuer   ra   r?   rv   r   rb   )r4   r   fr5   r   r/   r/   r0   	test_file  s   
zTestXml.test_filec                 C   s6   t tddidt}t|}t| d|v sJ d S )Nthisthat)details"   <detail><this>that</this></detail>)r%   r   r   ra   r?   )r4   r5   r   r/   r/   r0   test_fault_detail_as_dict  s   
z!TestXml.test_fault_detail_as_dictc                 C   sB   t tdd}tdd| d|j}dd|v sJ d S )Nu   yağmur)out_documentz
iso-8859-9r   rQ   u   ğ)r   r   rainr!   create_out_stringr]   r^   rW   )r4   rh   r   r/   r/   r0   test_xml_encoding  s   zTestXml.test_xml_encodingc                 C   s   G dd dt }t d |td}|jdksJ t d |tdt }|jdks.J tddd |tdt }|jd u sDJ d S )Nc                   @   s"   e Zd ZdefdeddfgZdS )z.TestXml.test_default.<locals>.SomeComplexModelr1   r.   default)r  N)r+   r,   r-   r   
_type_infor/   r/   r/   r0   SomeComplexModel  s    r  z\
                <hey>
                    <a>string</a>
                </hey>
            r  z
                <hey>
                    <a>string</a>
                    <b xsi:nil="true" xmlns:xsi="%s"/>
                </hey>
            F)replace_null_with_default)r   r!   from_elementr   r3   r.   r)   )r4   r  objr/   r/   r0   test_default  s(   

zTestXml.test_defaultc                    s   G fdddt G fdddG  fdddt    d}t| }tj|dd	}tjr;t|d
d ntjj	
| t|}t| }|j|jksZJ |j|jf|jj|jjkslJ |jj|jjf|jj|jjks~J |jj|jjfd S )Nc                       *   e Zd ZdZdeiZ fddZ  ZS )z-TestXml.test_polymorphic_roundtrip.<locals>.Bsome_ns_bc                       t  |   d| _d S )Nr.   )super__init__r  r4   )r   	__class__r/   r0   r  .     
z6TestXml.test_polymorphic_roundtrip.<locals>.B.__init__r+   r,   r-   r   r   r  r  __classcell__r/   )r   r  r0   r   (  
    r   c                       r  )z-TestXml.test_polymorphic_roundtrip.<locals>.Cr  _cc                    r  )Nrl   )r  r  r   r  )rj   r  r/   r0   r  8  r  z6TestXml.test_polymorphic_roundtrip.<locals>.C.__init__r  r/   rm   r  r0   rj   2  r  rj   c                       s.   e Zd ZdZedZd fdd	Z  ZS )z-TestXml.test_polymorphic_roundtrip.<locals>.Ar  )_ar  Nc                    s   t  |   d| _|| _d S )Nr1   )r  r  r!  r  )r4   r.   )Ar  r/   r0   r  C  s   
z6TestXml.test_polymorphic_roundtrip.<locals>.A.__init__r>   r  r/   )r"  r   r  r0   r"  <  s    r"  )r.   TrR   r2   )end)r   r&   r   ra   r#   r   r?   sysstdoutbufferwriter3   r'   r!  r  r   )r4   r1   r5   
xml_stringelement_treenew_ar/   )r"  r   rj   r0   test_polymorphic_roundtrip&  s   




$(z"TestXml.test_polymorphic_roundtripN)r+   r,   r-   r7   ri   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r+  r/   r/   r/   r0   r*   8   s6    	!&
"!!!!"	-r*   c                   @   s   e Zd Zdd Zdd ZdS )TestIncrementalc                    s   G dd dt   dddfG  fdddt}|jd }t|d	}t  }|_tt|gt	|tj
 t| }ttj|d
d |jddtiddgksVJ |jddtiddgksdJ d S )Nc                   @      e Zd ZeZeZdS )z2TestIncremental.test_one.<locals>.SomeComplexModelNr+   r,   r-   r   r   r   ir/   r/   r/   r0   r  Z  r   r  r1   r   r   r/  c                       s"   e Zd Ze dfddZdS )z-TestIncremental.test_one.<locals>.SomeServicer<   c                        S r>   r/   rh   r   r/   r0   geta     z1TestIncremental.test_one.<locals>.SomeService.getN)r+   r,   r-   r
   r4  r/   r  r   r/   r0   rH   `  s    rH   r4  
out_object
descriptorTrR   zx:getResult/x:i/text()r{   rq   r   zx:getResult/x:s/text()r   r   public_methodsr   r   
out_streamr!   r   r+   	serializeRESPONSEr   r3   getvaluer?   ra   ru   r4   rH   descrh   ostrr5   r/   r6  r0   test_oneY  s(   
zTestIncremental.test_onec                    s   G dd dt   ddd ddd dd	d d
dd dddgG  fdddt}|jd }tg|d}t  }|_tt|gt	|tj
 t| }ttj|dd |jddtidg dkslJ |jddtidg dks{J d S )Nc                   @   r-  )z3TestIncremental.test_many.<locals>.SomeComplexModelNr.  r/   r/   r/   r0   r  t  r   r  r1   r   r0  r.   r   rl   r   rE   r;   er   c                       s&   e Zd Zee dfddZdS )z.TestIncremental.test_many.<locals>.SomeServicer<   c                    r1  r>   r/   r2  r3  r/   r0   r4    r5  z2TestIncremental.test_many.<locals>.SomeService.getN)r+   r,   r-   r
   r   r4  r/   r6  r/   r0   rH     s    rH   r4  r7  TrR   z)x:getResult/x:SomeComplexModel/x:i/text()r{   rq   )r   r   r   r   5z)x:getResult/x:SomeComplexModel/x:s/text())r1   r.   rl   rE   rD  r:  r@  r/   r6  r0   	test_manys  s2   





zTestIncremental.test_manyN)r+   r,   r-   rC  rF  r/   r/   r/   r0   r,  X  s    r,  __main__)E
__future__r   r_   basicConfigDEBUGr$  unittestrA   r   r   base64r   r   r   lxml.builderr   spyner	   r
   r   r   r   r   spyne.contextr   spyne.constr   spyne.servicer   spyne.serverr   spyne.applicationr   spyne.decoratorr   spyne.util.sixr   spyne.modelr   r   r   r   r   r   r   r   r   r   r    r   spyne.protocol.xmlr!   r"   
spyne.utilr#   r   r$   r%   r&   r'   spyne.server.wsgir(   spyne.const.xmlr)   TestCaser*   r,  r+   mainr/   r/   r/   r0   <module>   sD    4    $<