o
    wOiE                     @   s   d dl Z d dlZd dlZd dlmZ zd dlZW n ey'   d dlmZ Y nw G dd deZG dd deZ	G dd	 d	e	Z
dS )
    N)TestClientApiBase)mockc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestClientApiInternalsc                 C   sH   dddddd}|  d| | jd}| | jjjd d	 d
 d
S )! Read timeout set to the default get   /testkeytestmodifiedIndexkeyvalueactionnode      timeoutN	_mock_apiclientreadassertEqualapi_execute	call_argsselfdres r   P/home/ubuntu/.local/lib/python3.10/site-packages/etcd/tests/unit/test_request.pytest_read_default_timeout   s   z0TestClientApiInternals.test_read_default_timeoutc                 C   L   dddddd}|  d| | jjddd	 | | jjjd
 d d dS )z( Read timeout set to the supplied value r   r   r   r	   r
   r   r      r   r   r   Nr   r   r   r   r   r    test_read_custom_timeout      z/TestClientApiInternals.test_read_custom_timeoutc                 C   r"   )z Read timeout disabled r   r   r   r	   r
   r   r   r   r$   r   r   Nr   r%   r   r   r    test_read_no_timeout+   r'   z+TestClientApiInternals.test_read_no_timeoutc                 C   sV   ddddddd}|  d| | jjdddd	 | | jjjd
tddidf dS )za Calling `write` without a value argument will omit the `value` from
        the API call params set   Tz/newdir)createdIndexdirr   r   r   r   Nr,   )z/v2/keys/newdirPUTr,   true)params)r   r   writeassertEqualsr   r   dictr%   r   r   r    test_write_no_params9   s   	z+TestClientApiInternals.test_write_no_paramsN)__name__
__module____qualname__r!   r&   r(   r4   r   r   r   r    r      s
    r   c                   @   s   e Zd ZdZeddd Zejdejddd Zd	d
 Z	dd Z
dd Zejdejd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d4S )5TestClientApiInterfacez
    All tests defined in this class are executed also in TestClientRequest.

    If a test should be run only in this class, please override the method there.
    z&urllib3.request.RequestMethods.requestc                 C   s4   g d}d |}| d||_| || jj dS ) Can request machines )http://127.0.0.1:4001zhttp://127.0.0.1:4002zhttp://127.0.0.1:4003,r   N)join_prepare_responsereturn_valuer2   r   machines)r   mockerdatar   r   r   r    test_machinesR   s   
z$TestClientApiInterface.test_machineszetcd.Client.machines)new_callablec                 C   s~   g d|_ tjddddd}| |jdg | |jd | |j|j tjdddd	d}| d
|j | |j|j dS )z6Do not overwrite the machines cache when using proxies)zhttps://10.0.0.2:4001https://10.0.0.3:4001zhttps://10.0.0.4:4001)	localhost  )
localproxyrG   httpsT)hostprotocolallow_reconnectuse_proxieszhttps://localproxy:4001zhttps://localhost:4001)rE   )z10.0.0.2rG   FrD   N)	r>   etcdClientr2   _machines_cache	_base_uriassertNotInbase_uriassertIn)r   r@   cr   r   r    test_use_proxies[   s$   
z'TestClientApiInterface.test_use_proxiesc                 C   sB   dddddgdgdgi}|  d| | | jjd d	 d d
S )r9   membersce2a822cea30bfcadefaultzhttp://localhost:2380zhttp://localhost:7001r:   )idnamepeerURLs
clientURLsr   rZ   N)r   r2   r   rW   r   rA   r   r   r    test_membersu   s   z#TestClientApiInterface.test_membersc              
   C   sD   ddddddddd	d
ddd	}|  d| | | jjd d dS )z Request for stats eca0338f4ea315668a69d5f6b7814500z#2014-10-24T13:15:51.186620747-07:00z10m59.322358947s)leader	startTimeuptimenode3i8  gJ|Ձ@gl͆2"@r   z#2014-10-24T13:15:50.072007085-07:00StateFollower)	rZ   
leaderInfor[   recvAppendRequestCntrecvBandwidthRaterecvPkgRatesendAppendRequestCntrc   stater   r[   N)r   r2   r   statsr^   r   r   r    test_self_stats   s   z&TestClientApiInterface.test_self_statsc                 C   s.   di d}|  d| | | jjd d dS )z Request for leader stats 924e2e83e93f2560rb   	followersr   rb   N)r   r2   r   leader_statsr^   r   r   r    test_leader_stats   s   
z(TestClientApiInterface.test_leader_statszetcd.Client.membersc                 C   sB   ddddi}||_ | dddi di | | jj|d  dS )z Can request the leader rX   rY   )rZ   r[   r   rg   rp   N)r>   r   r2   r   rb   )r   r@   rW   r   r   r    test_leader   s   z"TestClientApiInterface.test_leaderc                 C   sL   dddddddd}|  d	| | jdd}| |tjdi | d
S )z Can set a value r)   #2013-09-14T00:56:59.316195568+02:00   r      r	   
expirationr   r   ttlr   r   r   Nr   r   r   r1   r2   rN   
EtcdResultr   r   r   r    test_set_plain   s   
z%TestClientApiInterface.test_set_plainc                 C   sj   dddddddd}|  d	| | jd}d
|_d
|d d< |  d	| | j|}| |jd
 dS )zCan update a result.r)   ru      r   rw   r	   rx   r   r   ciaor   r   N)r   r   r   r   updater2   )r   r   r   newresr   r   r    test_update   s   	z"TestClientApiInterface.test_updatec                 C   sX   dddddddd}|  d	| | jdd}d
|d d< | |tjdi | dS )z Can set a new value r)   ru   rv   r   rw   r	   rx   r      Tr   newKeyNr   r{   r   r   r   r    test_newkey   s   
z"TestClientApiInterface.test_newkeyc                 C   sN   dddddddd}|  d	| | jjddd
}| |tjdi | dS )z Can refresh a new value r   z2016-05-31T08:27:54.660337Zrv   r   iX  r	   rx   r   r   )rz   Nr   )r   r   refreshr2   rN   r|   r   r   r   r    test_refresh   s   z#TestClientApiInterface.test_refreshc                 C   s$   |  dd | tj| jjd dS )z& Can handle server not found response i  z	Not foundz/somebadkeyN)r   assertRaisesrN   EtcdExceptionr   r   r   r   r   r    test_not_found_response   s   z.TestClientApiInterface.test_not_found_responsec                 C   sP   dddddddd}|  d	| | jjddd
d}| |tjdi | dS )z" Can set compare-and-swap a value compareAndSwapru   rv   r   rw   r	   rx   r   r   test_old	prevValueNr   r{   r   r   r   r    test_compare_and_swap   s   
z,TestClientApiInterface.test_compare_and_swapc                 C   s(   |  td | jt| jjdddd dS )< Exception will be raised if prevValue != value in test_set zTest Failed : [ 1!=3 ]/testKeyr	   oldbogr   N)_mock_exception
ValueErrorr   r   r1   r   r   r   r    test_compare_and_swap_failure  s   
z4TestClientApiInterface.test_compare_and_swap_failurec                 C   s@   ddddddd}|  d| | jdd}| |jd d	S )
z Can append a new key creater   z/testdir/190r	   )r+   r   r   r   r   r   z/testdirN)r   r   r1   r2   r+   r   r   r   r    test_set_append  s   	z&TestClientApiInterface.test_set_appendc                 C   s   | j tj| jjdddd dS )z4 Creating a directory with a value raises an error. z/bar	testvalyeTr-   N)r   rN   r   r   r1   r   r   r   r    test_set_dir_with_value  s   
z.TestClientApiInterface.test_set_dir_with_valuec                 C   F   dddddd}|  d| | jd}| |tjd
i | d	S )z Can delete a value deleter         r   r   r+   r   r   r   Nr   )r   r   r   r2   rN   r|   r   r   r   r    test_delete!     z"TestClientApiInterface.test_deletec                    s   ddddddddd	ddddd
d}|  d| | j|d d  |  fddt D |d  |  j|d d  dS )z Can pop a value r   r   r   r   r   FNr   r	   )r   r+   r   r   ry   r   rz   r,   )r   r   prevNoder   r   r   c                    s$   i | ]}|t jjv r|t |qS r   )rN   r|   _node_propsgetattr).0attrr   r   r    
<dictcomp>?  s    
z3TestClientApiInterface.test_pop.<locals>.<dictcomp>r   r   )r   r   popr2   r,   r   r   r%   r   r   r    test_pop/  s    zTestClientApiInterface.test_popc                 C   r   )z Can get a value r   r   r   r	   r
   r   r   r   Nr   r   r   r   r2   rN   r|   r   r   r   r    	test_readC  r   z TestClientApiInterface.test_readc              	   C   s`   ddddddddd	dd
dgdd}|  d| | jjddd}| |tjdi | dS )zCan get values in dirsr   r   r   Tz/testDir/testKey   r	   )r   r   r   z/testDir/testKey2test2)r   r   r,   nodesr   r   z/testDir)	recursiveNr   r   r   r   r   r    test_get_dirQ  s$   z#TestClientApiInterface.test_get_dirc                 C   s"   |  tjd | d| jv dS )# Can check if key is not in client zKey not Found : /testKey/testeyN)r   rN   EtcdKeyNotFound
assertTruer   r   r   r   r    test_not_ink  s   z"TestClientApiInterface.test_not_inc                 C   s2   dddddd}|  d| | d| jv  d	S )
r   r   r   r   r	   r
   r   r   r   N)r   r   r   r%   r   r   r    test_inp  s   zTestClientApiInterface.test_inc                 C   sJ   dddddd}|  d| | jjddd	}| |tjdi | d
S )z Can watch a key r   r   r   r	   r
   r   r   T)waitNr   r   r   r   r   r    
test_watch}  s   z!TestClientApiInterface.test_watchc                 C   sL   dddddd}|  d| | jjdddd	}| |tjdi | d
S )z/ Can watch a key starting from the given Index r      r   testoldr
   r   r   T)r   	waitIndexNr   r   r   r   r   r    test_watch_index  s   z'TestClientApiInterface.test_watch_indexN)r5   r6   r7   __doc__r   patchrB   PropertyMockrV   r_   rn   rs   rt   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r8   L   s8    


r8   c                   @   st   e Zd Zdd ZdddZ		d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S )TestClientRequestc                 C   s   t jdd| _d S )N
abcdef1234)expected_cluster_id)rN   rO   r   r   r   r   r    setUp  s   zTestClientRequest.setUpNc                 C   s@   |  ||}|p	d|j_tj|d| jj_tj|d| jj_d S )Nr   r>   )	r=   	getheaderr>   r   	MagicMockr   httprequest_encode_bodyrequest)r   statusr   
cluster_idrespr   r   r    r     s   zTestClientRequest._mock_apir.   c                 C   sX   |  d|||d}|pd|j_tj| jjj|d| jj_tj| jjj|d| jj_d S )Ni  )	errorCodemessagecauser   r   )	r=   r   r>   r   create_autospecr   r   r   r   )r   
error_codemsgr   methodfieldsr   r   r   r   r    _mock_error  s   


zTestClientRequest._mock_errorc                 C   s2   | j dddddid | jt| jjdddd	 d
S )r   r   zTest Failedz[ 1!=3 ]r   r   )r   r   r	   r   N)r   r   r   r   r1   r   r   r   r    r     s   
z/TestClientRequest.test_compare_and_swap_failurec                 C   sB   t j| jjjtj| jjddd| jj_| t	j
| jjd dS )r   foozRead timed outside_effectr   N)r   r   r   r   r   urllib3
exceptionsReadTimeoutErrorr   rN   EtcdWatchTimedOutwatchr   r   r   r    test_watch_timeout  s   z$TestClientRequest.test_watch_timeoutc                 C   s   |  t| jjd| jj dS )zE Exception will be raised if a path without a trailing slash is used ztestpath/barN)r   r   r   r   _MPUTr   r   r   r     test_path_without_trailing_slash  s   z2TestClientRequest.test_path_without_trailing_slashc                 C   s   |  tj| jjdd dS )z@ Exception will be raised if an unsupported HTTP method is used z/testpath/barTRACEN)r   rN   r   r   r   r   r   r   r    test_api_method_not_supported  s   
z/TestClientRequest.test_api_method_not_supportedc                 C   sJ   dddddddd}| j d	|d
d | tj| jjd | jd dS )r   r)   ru   r~   r   rw   r	   rx   r   r   notabcd1234)r   N)r   r   rN   EtcdClusterIdChangedr   r   r%   r   r   r    test_read_cluster_id_changed  s   
z.TestClientRequest.test_read_cluster_id_changedc                 C   sL   t j| jjjt d| jj_| tj	| jj
d | tj	| jjdd d S )Nr   z
/somethingz/aGET)r   r   r   r   r   socketerrorr   rN   EtcdConnectionFailedr   r   r   r   r   r    test_read_connection_error  s   
z,TestClientRequest.test_read_connection_errorc                 C      d S Nr   r   r   r   r    r        zTestClientRequest.test_not_inc                 C   r   r   r   r   r   r   r    r     r   zTestClientRequest.test_inc                 C   s\   dddddddd}t jdi |}d	d
ddd}| d| d|_| t| jj| dS )z Non-atomic updates fail r)   ru   r~   r   rw   r	   rx   r   e   zCompare failedz[ != bar] [7 != 6])r   r   r   indexi  barNr   )rN   r|   r   r   r   r   r   r   )r   r   r   r   r   r   r    test_update_fails  s"   
z#TestClientRequest.test_update_failsr   )r.   NN)r5   r6   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r     s    

r   )r   r   rN   etcd.tests.unitr   r   ImportErrorunittestr   r8   r   r   r   r   r    <module>   s    ?  P