a
    ze                     @   s  d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ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mZ dZeje Zde Zdd
dZejaej Z!G dd de"Z#de Z$e#fddZ%G dd de"Z&G dd dej'Z(edkre)  dS )    N)OrderedDict)support)	SomeClassis_instance)uncache)NonCallableMockCallableMixinsentinel	MagicMockMockNonCallableMagicMockpatch_patchDEFAULTcall_get_targetbuiltinsz%s.PTModuleTc                    sB   G  fdddt }|s< fdd} fdd}||_||_| S )Nc                       s   e Zd Z fddZdS )z_get_proxy.<locals>.Proxyc                    s
   t  |S N)getattrselfnameobj 6/usr/lib/python3.9/unittest/test/testmock/testpatch.py__getattr__   s    z%_get_proxy.<locals>.Proxy.__getattr__N)__name__
__module____qualname__r   r   r   r   r   Proxy   s   r    c                    s   t  || d S r   )setattrr   r   valuer   r   r   __setattr__    s    z_get_proxy.<locals>.__setattr__c                    s   t  | d S r   )delattrr   r   r   r   __delattr__"   s    z_get_proxy.<locals>.__delattr__)objectr$   r&   )r   get_onlyr    r$   r&   r   r   r   
_get_proxy   s    r)   c                   @   sP   e Zd Zdd Zdd Zdd ZdZedd	 Ze	d
d Z
G dd deZdS )Fooc                 C   s   d S r   r   r   ar   r   r   __init__/       zFoo.__init__c                 C   s   d S r   r   r+   r   r   r   f0   r.   zFoo.fc                 C   s   d S r   r   r   r   r   r   g1   r.   zFoo.gbarc                   C   s   d S r   r   r   r   r   r   static_method4   s    zFoo.static_methodc                 C   s   d S r   r   )clsr   r   r   class_method7   s    zFoo.class_methodc                   @   s   e Zd Zdd ZdS )zFoo.Barc                 C   s   d S r   r   r0   r   r   r   r,   ;   r.   z	Foo.Bar.aNr   r   r   r,   r   r   r   r   Bar:   s   r7   N)r   r   r   r-   r/   r1   foostaticmethodr3   classmethodr5   r'   r7   r   r   r   r   r*   .   s   

r*   z%s.Fooc                 C   s   d S r   r   r,   br   r   r   function@   r.   r=   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )	Containerc                 C   s
   i | _ d S r   valuesr0   r   r   r   r-   D   s    zContainer.__init__c                 C   s
   | j | S r   r?   r   r   r   r   __getitem__G   s    zContainer.__getitem__c                 C   s   || j |< d S r   r?   r"   r   r   r   __setitem__J   s    zContainer.__setitem__c                 C   s   | j |= d S r   r?   r   r   r   r   __delitem__M   s    zContainer.__delitem__c                 C   s
   t | jS r   )iterr@   r0   r   r   r   __iter__P   s    zContainer.__iter__N)r   r   r   r-   rA   rB   rC   rE   r   r   r   r   r>   C   s
   r>   c                   @   s  e Zd Zdd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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXdY Z.dZd[ Z/d\d] Z0d^d_ Z1d`da Z2dbdc Z3ddde Z4dfdg Z5dhdi Z6djdk Z7dldm Z8dndo Z9dpdq Z:drds Z;dtdu Z<dvdw Z=dxdy Z>dzd{ Z?d|d} Z@d~d ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXeYdddd ZZeYdddd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd ZbddĄ ZcddƄ ZdddȄ Zeddʄ Zfdd̄ Zgdd΄ ZhddЄ Zidd҄ ZjddԄ Zkddք Zldd؄ Zmddڄ Zndd܄ Zoddބ ZpdS )	PatchTestTc                 C   s<   t }|st}| t| | t|| | t|t d S r   )r   r   assertRaises	TypeError
assertTruer   assertFalser   )r   r   magic	MockClassr   r   r   assertNotCallableW   s    zPatchTest.assertNotCallablec                    sJ   G dd dt  t  dtj fdd}|   jtjd d S )Nc                   @   s   e Zd ZejZdS )z4PatchTest.test_single_patchobject.<locals>.SomethingNr   r   r   r	   Original	attributer   r   r   r   	Somethingb   s   rQ   rP   c                      s     jtjd d S NZ	unpatchedassertEqualrP   r	   Patchedr   rQ   r   r   r   teste   s    z/PatchTest.test_single_patchobject.<locals>.testpatch not restoredr'   r   r	   rU   rT   rP   rO   r   rW   r   rV   r   test_single_patchobjecta   s    z!PatchTest.test_single_patchobjectc                 C   s@   d}|  t| tdd W d    n1 s20    Y  d S )Nz>'Something' must be the actual object to be patched, not a strrQ   Zdo_something)ZassertRaisesRegexrH   r   r'   )r   msgr   r   r   &test_patchobject_with_string_as_targetm   s    z0PatchTest.test_patchobject_with_string_as_targetc                    sH   G dd dt  t  dd  fdd}|   jtjd d S )Nc                   @   s   e Zd ZejZdS )z7PatchTest.test_patchobject_with_none.<locals>.SomethingNrN   r   r   r   r   rQ   s   s   rQ   rP   c                      s     jd d S rR   )assertIsNonerP   r   rV   r   r   rW   v   s    z2PatchTest.test_patchobject_with_none.<locals>.testrX   )r'   r   rT   rP   r	   rO   rZ   r   rV   r   test_patchobject_with_noner   s    z$PatchTest.test_patchobject_with_nonec                    sl   G dd dt  t  dtjt  dtj fdd}|   jtjd  jtj	d d S )Nc                   @   s   e Zd ZejZejZdS )z6PatchTest.test_multiple_patchobject.<locals>.SomethingNr   r   r   r	   rO   rP   	Original2next_attributer   r   r   r   rQ      s   rQ   rP   rb   c                      s(     jtjd   jtjd d S rR   )rT   rP   r	   rU   rb   Patched2r   rV   r   r   rW      s    z1PatchTest.test_multiple_patchobject.<locals>.testrX   )
r'   r   r	   rU   rc   rT   rP   rO   rb   ra   rZ   r   rV   r   test_multiple_patchobject   s    z#PatchTest.test_multiple_patchobjectc                 C   sJ   t }tdt tjdd }z"tja |  | t tj W |a n|a 0 d S )N%s.somethingc                   S   s   d S r   r   r   r   r   r   rW      s    z8PatchTest.test_object_lookup_is_quite_lazy.<locals>.test)	somethingr   r   r	   
Something2Zreplacement_valuerT   r   originalrW   r   r   r    test_object_lookup_is_quite_lazy   s    
z*PatchTest.test_object_lookup_is_quite_lazyc                    s   t dt tj fdd}|   tjtjd t dt tjt dt tj fdd} tjtjd  tj	tjd |   tjtjd  tj	tjd t
 }tj|_t dt | fdd}|  |   t|d d S )	Nre   c                      s     tjtjd d S rR   )rT   PTModulerf   r	   rg   r   r0   r   r   rW      s    z"PatchTest.test_patch.<locals>.testrX   z%s.something_elsec                      s(     tjtjd   tjtjd d S rR   )rT   rk   rf   r	   rg   something_elseSomethingElser   r0   r   r   rW      s    %s.openc                      s     tddtjd d S )Nfilenamerzopen not patched)rT   openr	   Handler   r0   r   r   rW      s    )r   r   r	   rg   rT   rk   rf   rQ   rm   rl   r   rr   return_valuebuiltin_stringassertNotEqualrq   )r   rW   mockr   r0   r   
test_patch   s:    zPatchTest.test_patchc                    s6   t dt tj fdd}|   tjjd d S )Nz%s.SomeClass.class_attributec                      s     tjjtjd d S rR   )rT   rk   r   class_attributer	   ClassAttributer   r0   r   r   rW      s    
z2PatchTest.test_patch_class_attribute.<locals>.testrX   )r   r   r	   ry   r^   rk   r   rx   rZ   r   r0   r   test_patch_class_attribute   s    
z$PatchTest.test_patch_class_attributec                    s   G dd dt  t  d fdd}|  t  dt  d fdd}d  |tjtj\|tjtj d S )Nc                   @   s   e Zd ZejZejZdS )z:PatchTest.test_patchobject_with_default_mock.<locals>.TestN)r   r   r   r	   rO   rf   ra   
something2r   r   r   r   Test   s   r|   rf   c                    s"    |  jd | td d S )N"Mock not passed into test function.patch with two arguments did not create a mock)rT   rf   assertIsInstancer
   rv   )r|   r   r   r   rW      s    
z:PatchTest.test_patchobject_with_default_mock.<locals>.testr{   c                    s    | tjd  |tjd  | jd  | jd |td |td |d |d ||fS )Nz0Patched function didn't receive initial argumentz/Patched function didn't receive second argumentr}   z)Second Mock not passed into test functionr~   zunexpected value for mock1)	rT   r	   this1this2r{   rf   r   r
   ru   )r   r   Zmock1Zmock2r|   Z
outerMock1Z
outerMock2r   r   r   rW      s*    



)r'   r   r	   r   r   rZ   r   r   r   "test_patchobject_with_default_mock   s    


z,PatchTest.test_patchobject_with_default_mockc                    s&   t dt td fdd}|  d S )N%s.SomeClassspecc                    s2     t|   ttjt  tdd  d S )Nc                   S   s   t jS r   r   
not_wibbler   r   r   r   <lambda>  r.   z>PatchTest.test_patch_with_spec.<locals>.test.<locals>.<lambda>rT   r   rI   r   wibbler
   rG   AttributeErrorMockSomeClassr0   r   r   rW     s    z,PatchTest.test_patch_with_spec.<locals>.test)r   r   r   rZ   r   r0   r   test_patch_with_spec  s    zPatchTest.test_patch_with_specc                    s&   t jtdtd fdd}|  d S )Nrx   r   c                    s6     tj|   ttjjt  tdd  d S )Nc                   S   s   t jjS r   r   rx   r   r   r   r   r   r     r.   zDPatchTest.test_patchobject_with_spec.<locals>.test.<locals>.<lambda>	rT   r   rx   rI   r   r   r
   rG   r   ZMockAttributer0   r   r   rW     s    z2PatchTest.test_patchobject_with_spec.<locals>.testr   r'   r   rZ   r   r0   r   test_patchobject_with_spec  s    z$PatchTest.test_patchobject_with_specc                    s(   t dt dgd fdd}|  d S )Nr   r   r   c                    s2     t|   ttjt  tdd  d S )Nc                   S   s   t jS r   r   r   r   r   r   r     r.   zFPatchTest.test_patch_with_spec_as_list.<locals>.test.<locals>.<lambda>r   r   r0   r   r   rW     s    z4PatchTest.test_patch_with_spec_as_list.<locals>.testr   r   rZ   r   r0   r   test_patch_with_spec_as_list  s    z&PatchTest.test_patch_with_spec_as_listc                    s(   t jtddgd fdd}|  d S )Nrx   r   r   c                    s6     tj|   ttjjt  tdd  d S )Nc                   S   s   t jjS r   r   r   r   r   r   r   *  r.   zLPatchTest.test_patchobject_with_spec_as_list.<locals>.test.<locals>.<lambda>r   r   r0   r   r   rW   $  s    z:PatchTest.test_patchobject_with_spec_as_list.<locals>.testr   rZ   r   r0   r   "test_patchobject_with_spec_as_list#  s    z,PatchTest.test_patchobject_with_spec_as_listc                    s4   t dt t dt dgd fdd}|  d S )Nrn   r   r   r   c                    s2     t|   ttjt  tdd  d S )Nc                   S   s   t jS r   r   r   r   r   r   r   6  r.   zMPatchTest.test_nested_patch_with_spec_as_list.<locals>.test.<locals>.<lambda>r   )r   ZMockOpenr0   r   r   rW   1  s    z;PatchTest.test_nested_patch_with_spec_as_list.<locals>.test)r   rt   r   rZ   r   r0   r   #test_nested_patch_with_spec_as_list/  s    
z-PatchTest.test_nested_patch_with_spec_as_listc                    s&   t dt dd fdd}|  d S )Nr   Tr   c                    s*    t   j t fdd d S )Nc                      s    j S r   r   r   r   r   r   r   A  r.   zIPatchTest.test_patch_with_spec_as_boolean.<locals>.test.<locals>.<lambda>rT   r   r   rG   r   r   r0   r   r   rW   ;  s    z7PatchTest.test_patch_with_spec_as_boolean.<locals>.testr   rZ   r   r0   r   test_patch_with_spec_as_boolean:  s    z)PatchTest.test_patch_with_spec_as_booleanc                    s&   t jtddd fdd}|  d S )Nr   Tr   c                    s*    t   j t fdd d S )Nc                      s    j S r   r   r   r   r   r   r   M  r.   zPPatchTest.test_patch_object_with_spec_as_boolean.<locals>.test.<locals>.<lambda>r   r   r0   r   r   rW   G  s    z>PatchTest.test_patch_object_with_spec_as_boolean.<locals>.test)r   r'   rk   rZ   r   r0   r   &test_patch_object_with_spec_as_booleanF  s    z0PatchTest.test_patch_object_with_spec_as_booleanc                    s&   t dt dd fdd}|  d S )Nr   Tr   c                    s>    t| t |      j t fdd d S )Nc                      s    j S r   r   r   instancer   r   r   [  r.   zVPatchTest.test_patch_class_acts_with_spec_is_inherited.<locals>.test.<locals>.<lambda>)rI   r   r
   rM   r   rG   r   r   r0   r   r   rW   S  s
    
zDPatchTest.test_patch_class_acts_with_spec_is_inherited.<locals>.testr   rZ   r   r0   r   ,test_patch_class_acts_with_spec_is_inheritedR  s    	z6PatchTest.test_patch_class_acts_with_spec_is_inheritedc                    s:   t dt tjdd fdd}|   tdd  d S )N
%s.froobleTcreatec                      s     ttj d S r   )rT   froobler	   Froobler   r0   r   r   rW   a  s    zLPatchTest.test_patch_with_create_mocks_non_existent_attributes.<locals>.testc                   S   s   t S r   r   r   r   r   r   r   f  r.   zPPatchTest.test_patch_with_create_mocks_non_existent_attributes.<locals>.<lambda>)r   rt   r	   r   rG   	NameErrorrZ   r   r0   r   4test_patch_with_create_mocks_non_existent_attributes`  s    z>PatchTest.test_patch_with_create_mocks_non_existent_attributesc                    s:   t jtdtjdd fdd}|   ttd d S )Nr   Tr   c                      s     tjtj d S r   )rT   r   r   r	   r   r   r0   r   r   rW   j  s    zRPatchTest.test_patchobject_with_create_mocks_non_existent_attributes.<locals>.test)r   r'   r   r	   r   rJ   hasattrrZ   r   r0   r   :test_patchobject_with_create_mocks_non_existent_attributesi  s    zDPatchTest.test_patchobject_with_create_mocks_non_existent_attributesc                 C   s\   |  t. tdt tjdd }|  W d    n1 s>0    Y  |  tdd  d S )Nr   c                   S   s   d S r   r   r   r   r   r   rW   t  s    z9PatchTest.test_patch_wont_create_by_default.<locals>.testc                   S   s   t S r   r   r   r   r   r   r   x  r.   z=PatchTest.test_patch_wont_create_by_default.<locals>.<lambda>)rG   r   r   rt   r	   r   r   rZ   r   r   r   !test_patch_wont_create_by_defaultr  s
    
$z+PatchTest.test_patch_wont_create_by_defaultc                 C   s\   |  t. ttdtjdd }|  W d    n1 s>0    Y  | ttd d S )Nordc                   S   s   d S r   r   r   r   r   r   rW   }  s    z?PatchTest.test_patchobject_wont_create_by_default.<locals>.test)	rG   r   r   r'   r   r	   r   rJ   r   rZ   r   r   r   'test_patchobject_wont_create_by_default{  s
    
$z1PatchTest.test_patchobject_wont_create_by_defaultc                 C   sH   t td dd }t td dd }| | d | | d d S )	Nz.ordc                 S   s   d| _ tdS )Ne   c)rs   r   )Zmock_ordr   r   r   test_ord  s    z>PatchTest.test_patch_builtins_without_create.<locals>.test_ordz.openc                 S   s*   | j }d|j_ td}| }|  |S )Nabcdzdoesnotexists.txt)rs   readrq   close)Z	mock_openmZfobjdatar   r   r   	test_open  s    z?PatchTest.test_patch_builtins_without_create.<locals>.test_openr   r   r   r   rT   )r   r   r   r   r   r   "test_patch_builtins_without_create  s    



	z,PatchTest.test_patch_builtins_without_createc                    sP   G dd dt  t  dtdd  fdd}|    tj d S )Nc                   @   s   e Zd Zedd ZdS )z5PatchTest.test_patch_with_static_methods.<locals>.Fooc                   S   s   t jS r   )r	   Staticr   r   r   r   woot  s    z:PatchTest.test_patch_with_static_methods.<locals>.Foo.wootN)r   r   r   r9   r   r   r   r   r   r*     s   r*   r   c                   S   s   t jS r   )r	   rU   r   r   r   r   r     r.   z:PatchTest.test_patch_with_static_methods.<locals>.<lambda>c                      s      tj d S r   )rT   r   r	   rU   r   r*   r   r   r   	anonymous  s    z;PatchTest.test_patch_with_static_methods.<locals>.anonymous)r'   r   r9   rT   r   r	   r   )r   r   r   r   r   test_patch_with_static_methods  s
    z(PatchTest.test_patch_with_static_methodsc                    s8   t j}tt dd fdd}|   t j| d S )Nr*   c                      s     tjd d S Nr*   )rT   r	   r*   r   r0   r   r   r     s    z-PatchTest.test_patch_local.<locals>.anonymous)r	   r*   r   r'   rT   )r   r8   r   r   r0   r   test_patch_local  s
    zPatchTest.test_patch_localc                    sT   G dd dt }|  tj _t  dd fdd}|   jtj d S )Nc                   @   s   e Zd ZdZdS )z'PatchTest.test_patch_slots.<locals>.Foo)r*   N)r   r   r   	__slots__r   r   r   r   r*     s   r*   c                      s     jd d S r   )rT   r*   r   r8   r   r   r   r     s    z-PatchTest.test_patch_slots.<locals>.anonymous)r'   r	   r*   r   rT   )r   r*   r   r   r   r   test_patch_slots  s    zPatchTest.test_patch_slotsc                    sf   G dd dt  G  fdddt }t  dtj|}| }|  |   jtjd d S )Nc                   @   s   e Zd ZejZdS )z=PatchTest.test_patchobject_class_decorator.<locals>.SomethingNrN   r   r   r   r   rQ     s   rQ   c                       s(   e Zd Z fddZ fddZdS )z7PatchTest.test_patchobject_class_decorator.<locals>.Fooc                    s     jtjd d S rR   rS   
other_selfrV   r   r   test_method  s    zCPatchTest.test_patchobject_class_decorator.<locals>.Foo.test_methodc                    s     jtjd d S Nznon-test method patched)rT   rP   r	   rO   r   rV   r   r   not_test_method  s    zGPatchTest.test_patchobject_class_decorator.<locals>.Foo.not_test_methodN)r   r   r   r   r   r   rV   r   r   r*     s   r*   rP   rX   )	r'   r   r	   rU   r   r   rT   rP   rO   )r   r*   r/   r   rV   r    test_patchobject_class_decorator  s    z*PatchTest.test_patchobject_class_decoratorc                    sr   G dd dt }G  fdddt }tdt |}| }|  |   |jtjd  t	j
tjd d S )Nc                   @   s   e Zd ZejZdS )z7PatchTest.test_patch_class_decorator.<locals>.SomethingNrN   r   r   r   r   rQ     s   rQ   c                       s(   e Zd ZdZ fddZ fddZdS )z1PatchTest.test_patch_class_decorator.<locals>.FooZwhateverc                    s     tj|d d S rR   )rT   rk   rf   )r   Zmock_somethingr0   r   r   r     s    
z=PatchTest.test_patch_class_decorator.<locals>.Foo.test_methodc                    s     tjtjd d S r   )rT   rk   rf   r	   rQ   r   r0   r   r   r     s    zAPatchTest.test_patch_class_decorator.<locals>.Foo.not_test_methodN)r   r   r   Ztest_class_attrr   r   r   r0   r   r   r*     s   r*   re   rX   )r'   r   r   r   r   rT   rP   r	   rO   rk   rf   rQ   )r   rQ   r*   r/   r   r0   r   test_patch_class_decorator  s    
z$PatchTest.test_patch_class_decoratorc                    sZ   G dd dt  t  dtjt  dtj fdd}|   jtjd d S )Nc                   @   s   e Zd ZejZejZdS )z3PatchTest.test_patchobject_twice.<locals>.SomethingNr`   r   r   r   r   rQ     s   rQ   rP   c                      s     jtjd d S rR   rS   r   rV   r   r   rW     s    z.PatchTest.test_patchobject_twice.<locals>.testrX   rY   rZ   r   rV   r   test_patchobject_twice  s    z PatchTest.test_patchobject_twicec                    s   t  dd   }t  fdd}|   | t ddi fdd}|   | t dg fd	d}|   | d S )
Nrf   initialotherc                      s   d d<  d= d d< d S N   r,   r   something elser   r   r   r8   r   r   rW     s    z'PatchTest.test_patch_dict.<locals>.testr,   r<   c                      s$    t d   d d d S Nr   r,   r<   rT   lenr   r   r   r   rW     s    r;   c                      s$    t d   d d d S r   r   r   r   r   r   rW     s    r'   copyr   dictrT   rh   r   r   r   test_patch_dict  s    zPatchTest.test_patch_dictc                    s   t   t  d< d d<  j }t  fdd}|   j| t ddi fdd}|   j| d S )	Nr   rf   r   c                      s   d d<  d= d d< d S r   r   r   r   r   r   rW   &  s    z=PatchTest.test_patch_dict_with_container_object.<locals>.testr,   r<   c                      s&    t jd   d d d S r   )rT   r   r@   r   r   r   r   rW   0  s    r>   r'   r@   r   r   r   rT   rh   r   r   r   %test_patch_dict_with_container_object  s    

z/PatchTest.test_patch_dict_with_container_objectc                    s   t  dd   }tj dd fdd}|   | tj ddidd fd	d}|   | tj d
gdd fdd}|   | d S )Nrf   r   Tclearc                      s      i  d d< d d< d S Nr   r,   r   r   rT   r   r   r   r   rW   >  s    z2PatchTest.test_patch_dict_with_clear.<locals>.testr,   r<   c                      s     ddi d S Nr,   r<   r   r   r   r   r   rW   H  s    r;   c                      s     ddi d S r   r   r   r   r   r   rW   P  s    r   rh   r   r   r   test_patch_dict_with_clear:  s    z$PatchTest.test_patch_dict_with_clearc                    s   t   t  d< d d<  j }tj dd fdd}|   j| tj dd	idd fd
d}|   j| d S )Nr   rf   r   Tr   c                      s"     ji  d d< d d< d S r   rT   r@   r   r   r   r   rW   `  s    zGPatchTest.test_patch_dict_with_container_object_and_clear.<locals>.testr,   r<   c                      s     jddi d S r   r   r   r   r   r   rW   j  s    r   rh   r   r   r   /test_patch_dict_with_container_object_and_clearY  s    

z9PatchTest.test_patch_dict_with_container_object_and_clearc                 C   sZ   ddi}t j|dd }| |ddi W d    n1 s<0    Y  | |ddi d S )Nr,   r<   r   )r,   )r   r   rT   )r   r8   patchedr   r   r   "test_patch_dict_as_context_managers  s    .z,PatchTest.test_patch_dict_as_context_managerc                 C   sZ   i }t dt t t dt t ddt tt t |dd }| |jd d S )Nr   Tautospecc                   S   s   d S r   r   r   r   r   r   	some_name}  s    z0PatchTest.test_name_preserved.<locals>.some_namer   )r   r   r'   r   r   rT   )r   r8   r   r   r   r   test_name_preservedz  s    zPatchTest.test_name_preservedc                 C   s\   i }t |ddidd }| t |  W d    n1 sB0    Y  | |i  d S )Nr,   r<   c                   S   s   t dd S )NZKonradr   r   r   r   r   rW     s    z1PatchTest.test_patch_with_exception.<locals>.test)r   r   rG   r   rT   )r   r8   rW   r   r   r   test_patch_with_exception  s    
$z#PatchTest.test_patch_with_exceptionc                    s&   t dddi fdd}|  d S )Nz
os.environkonrad_delongz
some valuec                      s     dtj d S )Nr   )assertInosenvironr   r0   r   r   rW     s    z3PatchTest.test_patch_dict_with_string.<locals>.test)r   r   rZ   r   r0   r   test_patch_dict_with_string  s    z%PatchTest.test_patch_dict_with_stringc                    s`   t j }tdddi fdd}z,ddit _|   t jddi W |t _n|t _0 d S )Nz%unittest.test.testmock.support.targetr2   BARc                      s     tjddd d S )NBAZr   r8   r2   )rT   r   targetr   r0   r   r   rW     s    z<PatchTest.test_patch_dict_decorator_resolution.<locals>.testr8   r   )r   r   r   r   r   rT   rh   r   r0   r   $test_patch_dict_decorator_resolution  s    

z.PatchTest.test_patch_dict_decorator_resolutionc                 C   s   t dt tdddd }| t| t jtdtdddd }| t| t dt ddd	d }| t| t jtdddd
d }| t| d S )Nr   Tr   spec_setc                 S   s
   d| _ d S Nr8   zrL   r   r   r   rW     s    z+PatchTest.test_patch_spec_set.<locals>.testr   c                 S   s
   d| _ d S r   r   r   r   r   r   rW     s    r   c                 S   s
   d| _ d S r   r   r   r   r   r   rW     s    c                 S   s
   d| _ d S r   r   r   r   r   r   rW     s    )r   r   r   rG   r   r'   r   rZ   r   r   r   test_patch_spec_set  s    



zPatchTest.test_patch_spec_setc                 C   s(   t dt dddd }| t| d S )Nr   Tr   c                 S   s   |  }d|_ d S r   r   )rL   r   r   r   r   rW     s    z-PatchTest.test_spec_set_inherit.<locals>.test)r   r   rG   r   rZ   r   r   r   test_spec_set_inherit  s    
zPatchTest.test_spec_set_inheritc                 C   sd   t }tdt }| t | | }z$| || | t | W |  n
|  0 | t | d S )Nre   )rf   r   r   assertIsstartassertIsNotstop)r   ri   patcherrv   r   r   r   test_patch_start_stop  s    zPatchTest.test_patch_start_stopc                 C   s   t tdd}| |  d S Nr2   r   )r   foo_namer^   r  r   r  r   r   r   test_stop_without_start  s    z!PatchTest.test_stop_without_startc                 C   s.   t tdd}|  |  | |  d S r  )r   r  r   r  r^   r  r   r   r   test_stop_idempotent  s    zPatchTest.test_stop_idempotentc                 C   sf   t }ttdd}| t | | }z$| |d | t | W |  n
|  0 | t | d S )Nrf   r8   )rf   r   r'   rk   r   r   rT   r  )r   ri   r  Zreplacedr   r   r   test_patchobject_start_stop  s    z%PatchTest.test_patchobject_start_stopc                 C   sn   ddi}|  }tj|dgdd}| || |  z| |ddi W |  n
|  0 | || d S )Nr8   r2   spameggsTr   r  r  )r   r   r   rT   r   r  r   dri   r  r   r   r   test_patch_dict_start_stop  s    z$PatchTest.test_patch_dict_start_stopc                 C   s@   ddi}|  }tj|dgdd}| |  | || d S )Nr8   r2   r
  Tr   )r   r   r   rJ   r  rT   r  r   r   r   "test_patch_dict_stop_without_start  s
    z,PatchTest.test_patch_dict_stop_without_startc                    s   | ddi    }G  fdddt}tj ddidd|}|  | | }|  |  | |  |  | | }|  |  | |  |  | d S )	Nr  r  c                       s(   e Zd Z fddZ fddZdS )z7PatchTest.test_patch_dict_class_decorator.<locals>.Testc                    s     ddi d S Nr8   r2   r   r0   r  thisr   r   
test_first  s    zBPatchTest.test_patch_dict_class_decorator.<locals>.Test.test_firstc                    s     ddi d S r  r   r0   r  r   r   test_second  s    zCPatchTest.test_patch_dict_class_decorator.<locals>.Test.test_secondN)r   r   r   r  r  r   r  r   r   r|     s   r|   r8   r2   Tr   )r   r'   r   r   rT   r  r  )r   ri   r|   rW   r   r  r   test_patch_dict_class_decorator  s     z)PatchTest.test_patch_dict_class_decoratorc                    s   G dd dt }G dd d}||| |fD ]X}t| t  dd fdd}|   jd |jd d j q,d S )	Nc                   @   s   e Zd ZdZdS )z0PatchTest.test_get_only_proxy.<locals>.Somethingr8   Nr   r   r   r8   r   r   r   r   rQ   -  s   rQ   c                   @   s   e Zd ZdZdS )z4PatchTest.test_get_only_proxy.<locals>.SomethingElser8   Nr  r   r   r   r   rm   /  s   rm   r8   r2   c                      s     jd d S Nr2   rT   r8   r   proxyr   r   r   rW   5  s    z+PatchTest.test_get_only_proxy.<locals>.testr'   r)   r   rT   r8   ZassertNotIn__dict__r   rQ   rm   thingrW   r   r  r   test_get_only_proxy,  s    zPatchTest.test_get_only_proxyc                    s   G dd dt }G dd d}||| |fD ]\}t|dd t  dd fd	d
}|   jd |jd d j q,d S )Nc                   @   s   e Zd ZdZdS )z6PatchTest.test_get_set_delete_proxy.<locals>.Somethingr8   Nr  r   r   r   r   rQ   ?  s   rQ   c                   @   s   e Zd ZdZdS )z:PatchTest.test_get_set_delete_proxy.<locals>.SomethingElser8   Nr  r   r   r   r   rm   A  s   rm   F)r(   r8   r2   c                      s     jd d S r  r  r   r  r   r   rW   G  s    z1PatchTest.test_get_set_delete_proxy.<locals>.testr  r  r   r  r   test_get_set_delete_proxy>  s    z#PatchTest.test_get_set_delete_proxyc                 C   s^   t dt d}ttfi |}| }|  | t | | |j	 d | 
|jt d S )N!   Zside_effectzfoo.bar.return_valuer8   )KeyErrorr
   r   r  r   r  rG   rT   r8   r2   r   r   kwargsr  rv   r   r   r   test_patch_keyword_argsP  s    z!PatchTest.test_patch_keyword_argsc                 C   sb   t dt d}tjtdfi |}| }|  | t | | |j	
 d | |j	t d S )Nr"  r#  r/   )r$  r
   r   r'   r*   r   r  rG   rT   r8   r2   r   r%  r   r   r   test_patch_object_keyword_args]  s    z(PatchTest.test_patch_object_keyword_argsc                 C   sh   ddi}|  }tj|dddd}|  z"| |tdddd W |  n
|  0 | || d S )Nr8   r2   r         )r8   r2   Zbaz)r   r   r   r   rT   r  )r   ri   r   r  r   r   r   test_patch_dict_keyword_argsj  s    z&PatchTest.test_patch_dict_keyword_argsc                    s   G dd dt }fdd fdd fdd}ttd	d
|}| }t| |  tjt }tj |dd	d
|}| }t| |  d S )Nc                   @   s8   e Zd Zdd Zdd Zdd ZdZG dd	 d	eZd
S )z$PatchTest.test_autospec.<locals>.Booc                 S   s   d S r   r   r+   r   r   r   r-   {  r.   z-PatchTest.test_autospec.<locals>.Boo.__init__c                 S   s   d S r   r   r+   r   r   r   r/   |  r.   z&PatchTest.test_autospec.<locals>.Boo.fc                 S   s   d S r   r   r0   r   r   r   r1   }  r.   z&PatchTest.test_autospec.<locals>.Boo.gr2   c                   @   s   e Zd Zdd ZdS )z(PatchTest.test_autospec.<locals>.Boo.Barc                 S   s   d S r   r   r0   r   r   r   r,     r.   z*PatchTest.test_autospec.<locals>.Boo.Bar.aNr6   r   r   r   r   r7     s   r7   N)	r   r   r   r-   r/   r1   r8   r'   r7   r   r   r   r   Booz  s
   r,  c                    s"   | d |  d  t|  d S N   )assert_called_withrG   rH   r   r0   r   r   _test  s    
z&PatchTest.test_autospec.<locals>._testc                    s  |  d | j d  t| j  |   | j   t| jd  tt| d | j  | jj   tt| jd | 	  | j	  | j	
  | j	j
   t| j	j
d | 	 
  | 	 j
   t| 	 j
d  tt| j	d  tt| 	 d d S )Nr.  hr2   r<   )r/   r/  rG   rH   r1   r   r   r8   lowerr7   r,   r   r0   r   r   _test2  s(    




z'PatchTest.test_autospec.<locals>._test2c                    s,    |  |  | d  | t | S r-  )r   r*   r   r0  r3  r   r   r   r=     s
    z)PatchTest.test_autospec.<locals>.functionTr   r*   )r'   r   r  r   r*   sysmodulesr   )r   r,  r=   rW   rv   moduler   r4  r   test_autospecy  s    	
zPatchTest.test_autospecc                    s&   t dt dd fdd}|  d S )N%s.functionTr   c                    s   t    tt j  tt j t d  tt j t d t   t   t dd t dd  tt   tt	t d d S )Nr.     r   r8   )
r=   Zassert_not_calledrG   AssertionErrorZassert_calledZassert_called_oncer/  rH   r   r   r   r0   r   r   rW     s    

z.PatchTest.test_autospec_function.<locals>.testr   rZ   r   r0   r   test_autospec_function  s    z PatchTest.test_autospec_functionc                 C   s0   t dt ddddd }| }| |d d S )Nr9  Tr   )r   rs   c                 S   s
   t ddS )Nr.  r:  )r=   )Zmock_functionr   r   r   rW     s    z.PatchTest.test_autospec_keywords.<locals>.testr   )r   rW   resultr   r   r   test_autospec_keywords  s    

z PatchTest.test_autospec_keywordsc                 C   sD   t dt dd }t  |  W d    n1 s60    Y  d S )Nz%s.Foo.static_methodTr   )r   r   r*   r3   assert_called_once_withr   methodr   r   r   test_autospec_staticmethod  s    z$PatchTest.test_autospec_staticmethodc                 C   sD   t dt dd }t  |  W d    n1 s60    Y  d S )Nz%s.Foo.class_methodTr   )r   r   r*   r5   r?  r@  r   r   r   test_autospec_classmethod  s    z#PatchTest.test_autospec_classmethodc                 C   sN   t dt ddd}| t|j tjt }t j|dddd}| t|j d S )Nr9  r   T)newr   r=   )r   r   rG   rH   r   r5  r6  r'   )r   r  r7  r   r   r   test_autospec_with_new  s
    
z PatchTest.test_autospec_with_newc                 C   sZ   G dd dt }tt|d}| }z&| || | |jt W |  n
|  0 d S )Nc                   @   s   e Zd Zg ZdS )z0PatchTest.test_autospec_with_object.<locals>.BarN)r   r   r   extrar   r   r   r   r7     s   r7   r   )r*   r   r  r   r   rF  listr  )r   r7   r  rv   r   r   r   test_autospec_with_object  s    z#PatchTest.test_autospec_with_objectc                 C   sP   t }ttdd}| }z(| || | |d| W |  n
|  0 d S )NTr   r   )r*   r   r  r   r   r  )r   ZFooClassr  rv   r   r   r   test_autospec_inherits  s    z PatchTest.test_autospec_inheritsc                 C   s|   t tdd}| }zX| dt| | dt|j | dt|d  | dt|d j W |  n
|  0 d S )NTr   z name='Foo'z name='Foo.f'z name='Foo()'z name='Foo().f')r   r  r   r   reprr/   r  )r   r  rv   r   r   r   test_autospec_name  s    zPatchTest.test_autospec_namec                 C   sb   t tdt dd }z
|  W n   t }Y n0 td d d}||| }| d| d S )Nr/   c                   S   s   t d S r   )r;  r   r   r   r   rW     s    z'PatchTest.test_tracebacks.<locals>.testr   zraise AssertionError)	r   r'   r*   r5  exc_infounittestZTextTestResultZ_exc_info_to_stringr   )r   rW   errr=  	tracebackr   r   r   test_tracebacks  s    

zPatchTest.test_tracebacksc                 C   sT   t ttd}| }|  | }|  | || ||fD ]}| | q@d S )Nnew_callable)r   r  r   r   r  r   rM   r   r  Zm1Zm2rv   r   r   r   test_new_callable_patch#  s    z!PatchTest.test_new_callable_patchc                 C   sX   t jtdtd}| }|  | }|  | || ||fD ]}| | qDd S )Nr/   rQ  )r   r'   r*   r   r   r  r   rM   rS  r   r   r   test_new_callable_patch_object0  s    z(PatchTest.test_new_callable_patch_objectc                    sn   G  fdddt  tt ddd}| }z2| t|  |  jtddd W |	  n
|	  0 d S )Nc                       s   e Zd ZdZ fddZdS )z:PatchTest.test_new_callable_keyword_arguments.<locals>.BarNc                    s
   | _ d S r   r&  r   r&  r7   r   r   r-   @  s    zCPatchTest.test_new_callable_keyword_arguments.<locals>.Bar.__init__r   r   r   r&  r-   r   rX  r   r   r7   >  s   r7   r.  r:  )rR  arg1arg2)rZ  r[  )
r'   r   r  r   r   typerT   r&  r   r  )r   r  r   r   rX  r   #test_new_callable_keyword_arguments=  s    z-PatchTest.test_new_callable_keyword_argumentsc                    s   G  fdddt  tt  d}|  z |  jt d W |  n
|  0 tt  d}|  z |  jt d W |  n
|  0 d S )Nc                       s   e Zd ZdZ fddZdS )z-PatchTest.test_new_callable_spec.<locals>.BarNc                    s
   | _ d S r   rV  rW  rX  r   r   r-   O  s    z6PatchTest.test_new_callable_spec.<locals>.Bar.__init__rY  r   rX  r   r   r7   M  s   r7   rR  r   r   )rR  r   r   )r'   r   r  r   rT   r&  r   r  r  r   rX  r   test_new_callable_specL  s    z PatchTest.test_new_callable_specc                 C   sb   dt  }t|td}| t|j t|tdd}| }z| j|dd W |  n
|  0 d S )Nz	%s.weeeeerQ  T)rR  r   F)rK   )r  r   r   rG   r   r   rM   r  )r   Znon_existent_attrpr   r   r   r   test_new_callable_createa  s    z"PatchTest.test_new_callable_createc                 C   s4   | j tttt td | j ttjtdt td d S )N)rD  rR  r/   )rG   
ValueErrorr   r  r'   r
   r*   r0   r   r   r   'test_new_callable_incompatible_with_newo  s    z1PatchTest.test_new_callable_incompatible_with_newc                 C   s0   | j ttttdd | j ttjtdtdd d S )NT)rR  r   r/   )rG   rb  r   r  r
   r'   r*   r0   r   r   r   ,test_new_callable_incompatible_with_autospecy  s    z6PatchTest.test_new_callable_incompatible_with_autospecc           	   
   C   s   G dd dt }tttt |f}|D ]`}dD ]V}|di}ttfd|i|}| }z"|j}| t	t
|d W |  q*|  0 q*q"d S )Nc                   @   s   e Zd ZdS )z>PatchTest.test_new_callable_inherit_for_mocks.<locals>.MockSubNr   r   r   r   r   r   r   MockSub  s   rf  r   TrR  x)r   r   r   r
   r   r  r   rs   rG   r   r   r  )	r   rf  ZMockClassesZKlassargr&  r`  r   r   r   r   r   #test_new_callable_inherit_for_mocks  s    
z-PatchTest.test_new_callable_inherit_for_mocksc                 C   sp   G dd dt }tt|dd}| }z,| t|| | tt|d W |	  n
|	  0 | 
|jt d S )Nc                   @   s   e Zd Zdd ZdS )z>PatchTest.test_new_callable_inherit_non_mock.<locals>.NotAMockc                 S   s
   || _ d S r   r   )r   r   r   r   r   r-     s    zGPatchTest.test_new_callable_inherit_non_mock.<locals>.NotAMock.__init__N)r   r   r   r-   r   r   r   r   NotAMock  s   rj  Tr^  rs   )r'   r   r  r   rI   r   rG   r   r   r  rT   r   r*   )r   rj  r`  r   r   r   r   "test_new_callable_inherit_non_mock  s    z,PatchTest.test_new_callable_inherit_non_mockc                    sR   | t  G  fdddt}tttd|}|   |   | t   d S )Nc                       s*   e Zd Z fddZdd Zdd ZdS )z>PatchTest.test_new_callable_class_decorating.<locals>.SomeTestc                    s(    t  t| tt d S r   )r   r*   r   r   r   r   Zmock_foori   rW   r   r   r0    s    zDPatchTest.test_new_callable_class_decorating.<locals>.SomeTest._testc                 S   s   |  | d S r   r0  rl  r   r   r   test_two  s    zGPatchTest.test_new_callable_class_decorating.<locals>.SomeTest.test_twoc                 S   s   |  | d S r   rn  rl  r   r   r   test_one  s    zGPatchTest.test_new_callable_class_decorating.<locals>.SomeTest.test_oneNr   r   r   r0  ro  rp  r   rm  r   r   SomeTest  s   rr  rQ  )r*   r'   r   r  r   rp  ro  r   )r   rr  r   rm  r   "test_new_callable_class_decorating  s    

z,PatchTest.test_new_callable_class_decoratingc              	      s   t  t j}t j}tjtddd}tjt ddd}||fD ]t}|  z4t   t jd t jd W |	  n
|	  0 t   t j| t j| q8tjtddd fdd}|  d S )Nr.  r:  )r/   r1   r   r)  c                      s,    t  tjd tjd d S )Nr   r)  )r   r*   rT   r/   r1   r   original_foor   r   r   rW     s    z+PatchTest.test_patch_multiple.<locals>.test)
r*   r/   r1   r   multipler  r   r   rT   r  )r   
original_f
original_gZpatcher1Zpatcher2r  rW   r   rt  r   test_patch_multiple  s$    zPatchTest.test_patch_multiplec                 C   s$   |  ttjt |  ttjt d S r   )rG   rb  r   rv  r  r*   r0   r   r   r   test_patch_multiple_no_kwargs  s    z'PatchTest.test_patch_multiple_no_kwargsc                    sV   t  t j}t j}tjttdtd fdd}|  t j| t j| d S )Nr   r/   r1   r8   c                    sZ    t   tj|  tjd  tj| t| t t|t d S Nr   	r   r*   r/   rT   r1   r8   rI   r   r
   )r/   r8   rt  r   r   rW     s    z8PatchTest.test_patch_multiple_create_mocks.<locals>.testr*   r/   r1   r   rv  r  r   rT   )r   rw  rx  rW   r   rt  r    test_patch_multiple_create_mocks  s    z*PatchTest.test_patch_multiple_create_mocksc                    sr   t j}t j}tt dd}d|_tt dt}d|_|g|_| fdd}|   t j|  t j| d S )Nr/   r   r1   c                    s      tj|   tjd d S r|  )r   r*   r1   rT   r/   )r1   r0   r   r   rW     s    zHPatchTest.test_patch_multiple_create_mocks_different_order.<locals>.test)	r*   r/   r1   r   r'   attribute_namer   additional_patchersrT   )r   rw  rx  r  r   rW   r   r0   r   0test_patch_multiple_create_mocks_different_order  s    z:PatchTest.test_patch_multiple_create_mocks_different_orderc                    s   t t j}t j}tjttdtjttdttd  fdd}tjttdttd tjttd fdd}ttd tjttdtjttd fdd	}fd
d |  |  |  t j| t j| d S )N)r/   r   z.gc                    s    | fi | d S r   r   r1   r&  rn  r   r   test1  s    z?PatchTest.test_patch_multiple_stacked_decorators.<locals>.test1c                    s    | fi | d S r   r   r  rn  r   r   test2  s    z?PatchTest.test_patch_multiple_stacked_decorators.<locals>.test2c                    s    | fi | d S r   r   r  rn  r   r   test3  s    z?PatchTest.test_patch_multiple_stacked_decorators.<locals>.test3c                    s   | d}| d}| t  tj| tj|  tj| t|t	 t| t	 t|t	 d S )Nr/   r8   )
poprJ   r   r*   r/   r1   r8   rI   r   r
   )r1   r&  r/   r8   rt  r   r   r0    s    


z?PatchTest.test_patch_multiple_stacked_decorators.<locals>._testr~  )r   rw  rx  r  r  r  r   )r0  ru  r   r   &test_patch_multiple_stacked_decorators  s*    


z0PatchTest.test_patch_multiple_stacked_decoratorsc                 C   s   t }t j}t j}tjttdtd}| }z||d }|d }| t	|t	ddg | 
t | | 
t j| | 
t j| | t|t | t|t W |  n
|  0 | t j| | t j| d S )Nr   r{  r/   r8   )r*   r/   r1   r   rv  r  r   r   rT   setr   r8   rI   r   r
   r  )r   ru  rw  rx  r  r=  r/   r8   r   r   r   (test_patch_multiple_create_mocks_patcher3  s"    z2PatchTest.test_patch_multiple_create_mocks_patcherc                    sv   | t  t j}t j}G  fdddt}tjttdtd|}| }|  |	  | 
t j| | 
t j| d S )Nc                       s*   e Zd Z fddZdd Zdd ZdS )z@PatchTest.test_patch_multiple_decorating_class.<locals>.SomeTestc                    sZ    t   tj| tjd  tj| t|t t|t d S r|  r}  r   r/   r8   ru  rW   r   r   r0  T  s    zFPatchTest.test_patch_multiple_decorating_class.<locals>.SomeTest._testc                 S   s   |  || d S r   rn  r  r   r   r   ro  \  s    zIPatchTest.test_patch_multiple_decorating_class.<locals>.SomeTest.test_twoc                 S   s   |  || d S r   rn  r  r   r   r   rp  ^  s    zIPatchTest.test_patch_multiple_decorating_class.<locals>.SomeTest.test_oneNrq  r   r  r   r   rr  R  s   rr  r   r{  )r*   r/   r1   r'   r   rv  r  r   rp  ro  rT   )r   rw  rx  rr  r  r   r  r   $test_patch_multiple_decorating_classL  s    z.PatchTest.test_patch_multiple_decorating_classc                 C   sn   t jtdd}| t|j t jtddd}|  z| tjd W |  n
|  0 | 	t
td d S )Nblam)r  T)r  r   )r   rv  r*   rG   r   r   rT   r  r  rJ   r   r  r   r   r   test_patch_multiple_createm  s    z$PatchTest.test_patch_multiple_createc                 C   s   t jttddgd}| }zf| tj|d  tjd tjd tjj	d tjj	d | 
tttjdd  W |  n
|  0 d S )Nr,   r<   )r8   r   r8   r.  r:  r   )r   rv  r*   r   r   rT   r8   r,   r<   r/  rG   r   r!   r  )r   r  r=  r   r   r   test_patch_multiple_spec_set{  s    z&PatchTest.test_patch_multiple_spec_setc                 C   s   G dd dt }tjttt|d}| }z\| tj|d  | tj|d  | 	tj| | 	tj| | 
tjtj W |  n
|  0 d S )Nc                   @   s   e Zd ZdS )z9PatchTest.test_patch_multiple_new_callable.<locals>.ThingNre  r   r   r   r   Thing  s   r  )r/   r1   rR  r/   r1   )r'   r   rv  r*   r   r   r   r/   r1   r   r   r  )r   r  r  r=  r   r   r    test_patch_multiple_new_callable  s    z*PatchTest.test_patch_multiple_new_callablec                 C   s   t j}t j}tt ddtt ddtt dddd }tt ddtt ddtt dddd }tt ddtt ddtt ddd	d
 }|||fD ],}| t| | t j| | t j| qd S )Nr1   r.  missingr/   c                   S   s   d S r   r   r   r   r   r   thing1  s    z3PatchTest.test_nested_patch_failure.<locals>.thing1c                   S   s   d S r   r   r   r   r   r   thing2  s    z3PatchTest.test_nested_patch_failure.<locals>.thing2c                   S   s   d S r   r   r   r   r   r   thing3  s    z3PatchTest.test_nested_patch_failure.<locals>.thing3)r*   r/   r1   r   r'   rG   r   rT   )r   rw  rx  r  r  r  funcr   r   r   test_nested_patch_failure  s$    z#PatchTest.test_nested_patch_failurec           	      C   s   t j}t j}t j}dd }tt ddtjt d|dtt dddd	 }tjt d|dtt ddtt ddd
d }tt ddtt ddtjt d|ddd }|||fD ]:}| t| | t j| | t j| | t j| qd S )Nc                   S   s   t dd S Ncrasherr   r   r   r   r   r    s    z4PatchTest.test_new_callable_failure.<locals>.crasherr1   r.  r8   rQ  r/   c                   S   s   d S r   r   r   r   r   r   r    s    z3PatchTest.test_new_callable_failure.<locals>.thing1c                   S   s   d S r   r   r   r   r   r   r    s    z3PatchTest.test_new_callable_failure.<locals>.thing2c                   S   s   d S r   r   r   r   r   r   r    s    z3PatchTest.test_new_callable_failure.<locals>.thing3)	r*   r/   r1   r8   r   r'   rG   r   rT   )	r   rw  rx  ru  r  r  r  r  r  r   r   r   test_new_callable_failure  s*    z#PatchTest.test_new_callable_failurec                 C   s   t j}t j}tt dd}d|_tt dd}d|_tt dd}d|_||g||gfD ]>}||_|dd }| t| | 	t j| | 	t j| qXd S )Nr/   r.  r1   r  c                   S   s   d S r   r   r   r   r   r   r    s    z3PatchTest.test_patch_multiple_failure.<locals>.func)
r*   r/   r1   r   r'   r  r  rG   r   rT   )r   rw  rx  r  goodbadadditionalsr  r   r   r   test_patch_multiple_failure  s    
z%PatchTest.test_patch_multiple_failurec           
      C   s   t j}t j}t j}dd }tt dd}d|_tt dd}d|_tjt d|d}d|_||g||gfD ]L}||_|dd	 }	| t	|	 | 
t j| | 
t j| | 
t j| qhd S )
Nc                   S   s   t dd S r  r   r   r   r   r   r    s    zCPatchTest.test_patch_multiple_new_callable_failure.<locals>.crasherr/   r.  r1   r8   rQ  c                   S   s   d S r   r   r   r   r   r   r     s    z@PatchTest.test_patch_multiple_new_callable_failure.<locals>.func)r*   r/   r1   r8   r   r'   r  r  rG   r   rT   )
r   rw  rx  ru  r  r  r  r  r  r  r   r   r   (test_patch_multiple_new_callable_failure  s$    
z2PatchTest.test_patch_multiple_new_callable_failurec                    sL   t dtfddi}|  tj dd fdd}|   jd d S )Nr*   fishZtastynearly gone)r  c                      s     jd d S )Nr  )rT   r  r   r   r   r   rW     s    z=PatchTest.test_patch_multiple_string_subclasses.<locals>.test)r\  strr   rv  rT   r  )r   r*   rW   r   r   r   %test_patch_multiple_string_subclasses	  s    z/PatchTest.test_patch_multiple_string_subclasseszunittest.mock.patch.TEST_PREFIXr8   c                 C   sl   G dd dt }t |dd|}| }| | d | | d | | d | | d d S )Nc                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )z-PatchTest.test_patch_test_prefix.<locals>.Foori   c                 S   s   | j S r   r  r0   r   r   r   foo_one  s    z5PatchTest.test_patch_test_prefix.<locals>.Foo.foo_onec                 S   s   | j S r   r  r0   r   r   r   foo_two  s    z5PatchTest.test_patch_test_prefix.<locals>.Foo.foo_twoc                 S   s   | j S r   r  r0   r   r   r   rp    s    z6PatchTest.test_patch_test_prefix.<locals>.Foo.test_onec                 S   s   | j S r   r  r0   r   r   r   ro    s    z6PatchTest.test_patch_test_prefix.<locals>.Foo.test_twoN)r   r   r   r  r  r  rp  ro  r   r   r   r   r*     s
   r*   r  changedri   )r'   r   rT   r  r  rp  ro  r   r*   r8   r   r   r   test_patch_test_prefix  s    z PatchTest.test_patch_test_prefixr2   c                    s   G  fdddt }ddi tj dd|}| }| | ddi | | ddi | | ddi | | ddi d S )Nc                       s<   e Zd Z fddZ fddZ fddZ fddZd	S )
z2PatchTest.test_patch_dict_test_prefix.<locals>.Fooc                    s   t  S r   r   r0   Zthe_dictr   r   bar_one.  s    z:PatchTest.test_patch_dict_test_prefix.<locals>.Foo.bar_onec                    s   t  S r   r  r0   r  r   r   bar_two0  s    z:PatchTest.test_patch_dict_test_prefix.<locals>.Foo.bar_twoc                    s   t  S r   r  r0   r  r   r   rp  2  s    z;PatchTest.test_patch_dict_test_prefix.<locals>.Foo.test_onec                    s   t  S r   r  r0   r  r   r   ro  4  s    z;PatchTest.test_patch_dict_test_prefix.<locals>.Foo.test_twoN)r   r   r   r  r  rp  ro  r   r  r   r   r*   -  s   r*   keyri   r  )r  )r'   r   r   rT   r  r  rp  ro  r  r   r  r   test_patch_dict_test_prefix+  s    
z%PatchTest.test_patch_dict_test_prefixc              	   C   s   dD ]}t dt fi |di}| }zT| dt| | dt|j | dt|  | dt| j W |  q|  0 qd S )Nr   r   r   r   Tz name='SomeClass'z! name='SomeClass.class_attribute'z name='SomeClass()'z# name='SomeClass().class_attribute')r   r   r   r   rJ  rx   r  )r   rh  r`  r   r   r   r   test_patch_with_spec_mock_reprA  s    
z(PatchTest.test_patch_with_spec_mock_reprc                 C   s^   t ddd>}| dt|j  | dt|   W d    n1 sP0    Y  d S )Nunittest.test.testmock.supportTr   z" name='support.SomeClass.wibble()'z$ name='support.SomeClass().wibble()')r   r   rJ  r   r   )r   r   r   r   r   test_patch_nested_autospec_reprP  s    z)PatchTest.test_patch_nested_autospec_reprc              	   C   s  dD ] }t dt fi |di}| }z|  t g}| |j| | |j| | |jjt g | }|t  | |j| |  |t   | |j| | |jt g | |jjt g | |jt g W |	  q|	  0 qd S )Nr  r   T)
r   r   r   r   r   rT   Z
mock_callsZmethod_callsappendr  )r   rh  r`  r   Zkallsr=  r   r   r   test_mock_calls_with_patchY  s&    

z$PatchTest.test_mock_calls_with_patchc                 C   s   t d}| t|j tdD t }|tjd< d|_t d}d|_|  |	  W d    n1 sh0    Y  | 
|jd d S )Nsquizz.squozzsquizz   r   )r   rG   ImportErrorr   r   r   r5  r6  Zsquozzr  rT   )r   Zp1r  r   r   r   test_patch_imports_lazilyt  s    

&z#PatchTest.test_patch_imports_lazilyc                    s   G dd dG fdddt   fdd}|ddd	 }td
, t }|tjd
< | t| W d    n1 sx0    Y  | jd t | 	jd d | 	jd d d S )Nc                   @   s   e Zd ZdZdS )z;PatchTest.test_patch_propagates_exc_on_exit.<locals>.holder)NNNN)r   r   r   rL  r   r   r   r   holder  s   r  c                       s   e Zd Zd fdd	ZeZdS )zAPatchTest.test_patch_propagates_exc_on_exit.<locals>.custom_patchNc                    s    t | ||| |||f _d S r   )r   __exit__rL  )r   etypevaltbr  r   r   r    s    zJPatchTest.test_patch_propagates_exc_on_exit.<locals>.custom_patch.__exit__)NNN)r   r   r   r  r  r   r  r   r   custom_patch  s   r  c              
      s$   t | \}} ||td dd d d i 	S )NF)r   r   )r   getterrP   )r  r   r   with_custom_patch  s
    zFPatchTest.test_patch_propagates_exc_on_exit.<locals>.with_custom_patchr  c                 S   s   t d S r   )RuntimeErrorr   r   r   r   rW     s    z9PatchTest.test_patch_propagates_exc_on_exit.<locals>.testr  r   r.  zexception value not propagatedr:  z"exception traceback not propagated)
r   r   r   r5  r6  rG   r  r   rL  ZassertIsNotNone)r   r  rW   r  r   )r  r  r   !test_patch_propagates_exc_on_exit  s     


*z+PatchTest.test_patch_propagates_exc_on_exitc                 C   sp   dD ]f}t dt fddi|di}| t|j | tdd  t tfddi|di}|  |  qd S )Nr   r   r   z%s.doesnotexistr   Tc                   S   s   t S r   )doesnotexistr   r   r   r   r     r.   z1PatchTest.test_create_and_specs.<locals>.<lambda>)r   r   rG   rH   r   r   MODNAMEr  )r   kwargr`  r   r   r   test_create_and_specs  s    zPatchTest.test_create_and_specsc                 C   s   t }dD ]6}ttfddi|di}| t|j | t | qdD ]6}ttfddi|di}| t|j | t | qDdD ]6}ttfddi|di}| t|j | t | qd S )Nr   r   r   r   r   r   )r   r   r   )rk   r   r  rG   rH   r   r   )r   ri   r  r`  r   r   r   test_multiple_specs  s    zPatchTest.test_multiple_specsc                 C   s@   t tdddd}| }z|j d|_W |  n
|  0 d S )NFr  r   )r   r  r   Zdoes_not_existr  )r   r`  rv   r   r   r    test_specs_false_instead_of_none  s    z*PatchTest.test_specs_false_instead_of_nonec              	   C   sR   dD ]H}t tfi |di}| }z| tt|d W |  q|  0 qd S )Nr  r   Zdoesnotexit)r   r  r   rG   r   r   r  r   r  r`  r   r   r   r   test_falsey_spec  s    zPatchTest.test_falsey_specc              	   C   sh   dD ]^}t tfddi|di}| }z.| tt|dd | tt|d W |  q|  0 qd S )Nr  r   Tr  rf   )r   r  r   rG   r   r!   r   r  r  r   r   r   test_spec_set_true  s    
zPatchTest.test_spec_set_truec                 C   sB   d}t t|d}| }z| t| W |  n
|  0 d S )N)__call__r   )r   r  r   rI   callabler  r   r   r`  r   r   r   r   test_callable_spec_as_list  s    z$PatchTest.test_callable_spec_as_listc                 C   sB   d}t t|d}| }z| t| W |  n
|  0 d S )Nr   r   )r   r  r   rJ   r  r  r  r   r   r   test_not_callable_spec_as_list  s    z(PatchTest.test_not_callable_spec_as_listc                    s^   t jt j t j}tdt  tdt  td fdd}|  t j| d S )N	os.unlinkos.chdirzos.pathc                    s6   t   tj|  tj tj  d S r   )r   stopallr   r   pathunlinkchdir)Z	mock_pathr  r   r  r   r   r      s    z-PatchTest.test_patch_stopall.<locals>.patched)	r   r  r  r  r   rf   r   rl   r   )r   r  r   r   r  r   test_patch_stopall  s    zPatchTest.test_patch_stopallc                    sP   g G dd dt fdd  fdddD  t  | g d d S )	Nc                   @   s   e Zd Zd Z ZZdS )z*PatchTest.test_stopall_lifo.<locals>.thingN)r   r   r   onetwothreer   r   r   r   r    s   r  c              
      s8   G  fdddt fdd d d dd d d i 	S )Nc                       s"   e Zd Z fddZ  ZS )z?PatchTest.test_stopall_lifo.<locals>.get_patch.<locals>.mypatchc                    s     t|  S r   )r  superr  r0   )	__class__rP   mypatchstoppedr   r   r    s    
zDPatchTest.test_stopall_lifo.<locals>.get_patch.<locals>.mypatch.stop)r   r   r   r  __classcell__r   )rP   r  r  )r  r   r    s   r  c                      s    S r   r   r   r  r   r   r     r.   z@PatchTest.test_stopall_lifo.<locals>.get_patch.<locals>.<lambda>F)r   )rP   )r  r  )rP   r  r   	get_patch  s    
z.PatchTest.test_stopall_lifo.<locals>.get_patchc                    s   g | ]} |  qS r   )r   ).0r  )r  r   r   
<listcomp>  r.   z/PatchTest.test_stopall_lifo.<locals>.<listcomp>)r  r  r  )r  r  r  )r'   r   r  rT   r0   r   )r  r  r  r   test_stopall_lifo
  s    zPatchTest.test_stopall_lifoc                    s   i }ddi}ddd |  }|  }   }t|ddd  t|dd	i  t  fd
d}|  | || | || |  | t  | || | || |  | d S )Nr.  r,   ABr.  r:  IIIr:  r<   c                      s
    d= d S r-  r   r   Zdic3r   r   r   %  s    z2PatchTest.test_patch_dict_stopall.<locals>.patched)r   r   r   r   ru   rT   r  )r   dic1dic2origdic1origdic2Zorigdic3r   r   r  r   test_patch_dict_stopall  s$    
z!PatchTest.test_patch_dict_stopallc                 C   s   t j}t j}i }ddd}| }| }tdt  tdt  t|ddd  t|  |d= | 	t j| | 	t j| | 
|| | 
|| t  | t j| | t j| | || | || d S )	Nr  r  r  r  r  r  r  r.  )r   r  r  r   r   rf   r   rl   r   r   ru   r  r   rT   )r   Zoriginal_unlinkZoriginal_chdirr  r  r  r  r   r   r   !test_patch_and_patch_dict_stopall5  s(    
z+PatchTest.test_patch_and_patch_dict_stopallc                 C   s  ddd}t |dd | | d W d    n1 s<0    Y  | | d |j}t |dd | |jd W d    n1 s0    Y  | |j| t |d	d
 | |jd
 W d    n1 s0    Y  | |jd t |dtdg$ | |jtdg W d    n1 s.0    Y  | |jt  dddd}t |dtdg | | d W d    n1 s0    Y  | | d d S )Nr   c                 S   s   | S r   r   rg  r   r   r   r8   O  s    z)PatchTest.test_special_attrs.<locals>.foo__defaults__)r.  r.  __doc__ZFUNr   Z
testpatch2z unittest.test.testmock.testpatch__annotations__)sr.  r  c                 W   s   | S r   r   )rg  r,   r   r   r   r8   c  s    __kwdefaults__)rg  r.  )r   )r   r'   rT   r  r   r   r  )r   r8   Zorig_docr   r   r   test_special_attrsN  s$    
,,,4.zPatchTest.test_special_attrsc                 C   s   t  }t |d< d|d< | }ttdtd}t| | }t|t |$ | 	t| | W d    n1 s|0    Y  | 	|| t||$ | 	t| | W d    n1 s0    Y  | 	|| d S )Nr,   Zpythonr<   Zcdefghijklmnopqrstuvwxyz   )
r   r'   r   rG  ziprangeitemsr   r   rT   )r   r8   ri   Zupdate_valuesZpatched_valuesr   r   r   test_patch_orderdicti  s    
22zPatchTest.test_patch_orderdictc                 C   sl   dd l }tdF tjd= tjd= tjd= tjd= tddd	 }|  W d    n1 s^0    Y  d S )
Nr   zsys.modulesr  zunittest.test.testmockzunittest.testrM   unittest.test.testmock.support.Xc                 S   s   d S r   r   r   r   r   r   rW     s    z9PatchTest.test_dotted_but_module_not_loaded.<locals>.test)unittest.test.testmock.supportr   r   r5  r6  )r   rM  rW   r   r   r   !test_dotted_but_module_not_loaded|  s    
z+PatchTest.test_dotted_but_module_not_loadedc              
   C   s   G dd d}dd| fD ]b}| j |dB | t t| W d    n1 sT0    Y  W d    q1 sr0    Y  qd S )Nc                   @   s   e Zd ZdS )z*PatchTest.test_invalid_target.<locals>.FooNre  r   r   r   r   r*     s   r*       )r   )ZsubTestrG   rH   r   )r   r*   r   r   r   r   test_invalid_target  s
    zPatchTest.test_invalid_targetc                 C   sL   t dt dddd }| t |  W d    n1 s>0    Y  d S )Nr  r.  )rD  rg  c                   S   s   d S r   r   r   r   r   r   rW     s    z@PatchTest.test_cant_set_kwargs_when_passing_a_mock.<locals>.test)r   r'   rG   rH   rZ   r   r   r   (test_cant_set_kwargs_when_passing_a_mock  s    
z2PatchTest.test_cant_set_kwargs_when_passing_a_mockN)T)qr   r   r   rM   r[   r]   r_   rd   rj   rw   rz   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   r   r   r   r   r   r  r  r  r	  r  r  r  r   r!  r'  r(  r+  r8  r<  r>  rB  rC  rE  rH  rI  rK  rP  rT  rU  r]  r_  ra  rc  rd  ri  rk  rs  ry  rz  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  r  r  r  r  r  r  r  r  r  r  r	  r   r   r   r   rF   U   s   

+*

			
!		C	
+!

	"



rF   __main__)T)*r   r5  collectionsr   rM  Zunittest.test.testmockr   r  r   r   Ztest.test_importlib.utilr   Zunittest.mockr   r   r	   r
   r   r   r   r   r   r   r   rt   r6  r   rk   r  r)   rQ   rf   rm   rl   r'   r*   r  r=   r>   ZTestCaserF   mainr   r   r   r   <module>   sD   4

              Y
