o
    ul~iT                     @   s,  d dl mZ d dlmZmZ d dlmZ d dl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mZmZmZ e ZG dd dZG dd de	Zdd Zdd ZG dd deZG dd de	Z G dd de	Z!G dd de	Z"G dd de	Z#dd Z$G dd  d e	Z%d!S )"    )partial)cacheInvalidCacheBackendError)ImproperlyConfigured)RequestFactoryTestCase)override_settings)method_decorator)View	ratelimit)Ratelimited)	get_usageis_ratelimited_split_rate_get_ipc                   @   s   e Zd ZdddZdS )MockUserFc                 C   s   d| _ || _d S )N   )pkis_authenticated)selfauthenticated r   ]/var/www/newdalilibackend/backend/venv/lib/python3.10/site-packages/django_ratelimit/tests.py__init__   s   
zMockUser.__init__NF)__name__
__module____qualname__r   r   r   r   r   r      s    r   c                   @      e Zd Zdd ZdS )RateParsingTestsc                 C   s&   d}|D ]\}}|t |ksJ qd S )N))z100/s)d   r   )z100/10sr!   
   )z100/10r"   )z100/m)r!   <   )z400/10m)i  iX  )z1000/h)i  i  )z800/d)i   iQ )r   )r   testsior   r   r   test_simple   s   
zRateParsingTests.test_simpleN)r   r   r   r(   r   r   r   r   r           r    c                 C   s   |j jrd S dS )N)r   r   userr   grouprequestr   r   r   callable_rate)      r/   c                 C   s   |j d d d d S )NREMOTE_ADDRMETAr,   r   r   r   mykey/   s   r5   c                   @   s   e Zd ZdS )CustomRatelimitedExceptionN)r   r   r   r   r   r   r   r6   3   s    r6   c                   @   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d5d6 Zd7d8 Zd9S ):RatelimitTestsc                 C      t   d S Nr   clearr   r   r   r   setUp8      zRatelimitTests.setUpc                 C   sT   t dddd }td}| t || W d    d S 1 s#w   Y  d S )N1/m)ratec                 S      dS NTr   r.   r   r   r   view<      z(RatelimitTests.test_no_key.<locals>.view/)r   rfgetassertRaisesr   r   rD   reqr   r   r   test_no_key;   s   


"zRatelimitTests.test_no_keyc                 C   sF   t dddddd }|tdrJ d|tds!J d	d S )
Nipr?   Fkeyr@   blockc                 S      | j S r9   limitedrC   r   r   r   rD   E      z$RatelimitTests.test_ip.<locals>.viewrF   First request works.zSecond request is limitedr   rG   rH   r   rD   r   r   r   test_ipD   s   
zRatelimitTests.test_ipc                 C   sl   t ddddd }|tdrJ d| t |tddf W d    d S 1 s/w   Y  d S )	NrM   r?   rO   r@   c                 S   rQ   r9   rR   rC   r   r   r   blockedM   rT   z*RatelimitTests.test_block.<locals>.blockedrF   rU   zSecond request is blocked.)r   rG   rH   rI   r   )r   rZ   r   r   r   
test_blockL   s   

"zRatelimitTests.test_blockc              	   C   s   t ddddd }| jdd5 td}||rJ | t || W d    n1 s0w   Y  W d    d S W d    d S 1 sHw   Y  d S )	NrM   r?   rY   c                 S   rQ   r9   rR   rC   r   r   r   rD   V   rT   zIRatelimitTests.test_ratelimit_custom_string_exception_class.<locals>.viewz1django_ratelimit.tests.CustomRatelimitedExceptionRATELIMIT_EXCEPTION_CLASS )r   settingsrG   rH   rI   r6   rJ   r   r   r   ,test_ratelimit_custom_string_exception_classU   s   



"z;RatelimitTests.test_ratelimit_custom_string_exception_classc              	   C   s   t ddddd }| jtd5 td}||rJ | t || W d    n1 s0w   Y  W d    d S W d    d S 1 sHw   Y  d S )NrM   r?   rY   c                 S   rQ   r9   rR   rC   r   r   r   rD   e   rT   zBRatelimitTests.test_ratelimit_custom_exception_class.<locals>.viewr\   r^   )r   r_   r6   rG   rH   rI   rJ   r   r   r   %test_ratelimit_custom_exception_classd   s   



"z4RatelimitTests.test_ratelimit_custom_exception_classc                 C   s`   t dddddddd }|td	rJ d
|td	s#J d|td	r.J dd S )NrM   POSTr?   aF)rO   methodr@   r-   rP   c                 S   rQ   r9   rR   rC   r   r   r   
limit_postr   rT   z.RatelimitTests.test_method.<locals>.limit_postrF   zDo not limit first POST.zLimit second POST.zDo not limit GET.)r   rG   postrH   )r   re   r   r   r   test_methodq   s
   
zRatelimitTests.test_methodc                 C   s   t dt jddddd }|tdrJ |tdrJ |tdr(J |tds1J |tds:J |tdsCJ |t	dsLJ d S )NrM   0/mF)rO   rd   r@   rP   c                 S   rQ   r9   rR   rC   r   r   r   limit_unsafe{   rT   z8RatelimitTests.test_unsafe_methods.<locals>.limit_unsaferF   )
r   UNSAFErG   rH   headoptionsdeleterf   putpatch)r   ri   r   r   r   test_unsafe_methodsz   s   
z"RatelimitTests.test_unsafe_methodsc                 C   s|   t ddddddd }|tdd	d
irJ |tdd	d
is$J |tdd	dir0J |tdd	dis<J d S )Nzget:foor?   GETFrO   r@   rd   rP   c                 S   rQ   r9   rR   rC   r   r   r   rD      rT   z)RatelimitTests.test_key_get.<locals>.viewrF   foorc   brV   rW   r   r   r   test_key_get   s   
zRatelimitTests.test_key_getc                 C   sz   t dddddd }|tddd	irJ |tddd	is#J |tddd
ir/J |tddd
is;J d S )Nzpost:foor?   FrN   c                 S   rQ   r9   rR   rC   r   r   r   rD      rT   z*RatelimitTests.test_key_post.<locals>.viewrF   rs   rc   rt   r   rG   rf   rW   r   r   r   test_key_post   s   
zRatelimitTests.test_key_postc                 C   sL   dd }t ddddt dddddd	 }|| rJ || s$J d S )
Nc                  S   s   t d} d| jd< | S )NrF   1.2.3.4HTTP_X_REAL_IP)rG   rf   r4   rK   r   r   r   _req   s   

z,RatelimitTests.test_key_header.<locals>._reqzheader:x-real-ipr?   FrN   zheader:x-missing-headerc                 S   rQ   r9   rR   rC   r   r   r   rD         z,RatelimitTests.test_key_header.<locals>.viewr   r   r{   rD   r   r   r   test_key_header   s   zRatelimitTests.test_key_headerc                 C   s\   t dddddd }|tdrJ d|tdr!J d	|tds,J d
d S )NrM   z2/mFrN   c                 S   rQ   r9   rR   rC   r   r   r   twice   rT   z'RatelimitTests.test_rate.<locals>.twicerF   zFirst request is not limited.zSecond request is not limited.zThird request is limited.rv   )r   r   r   r   r   	test_rate   s
   
zRatelimitTests.test_ratec                 C   ,   t dddddd }|tdsJ d S )NrM   rh   FrN   c                 S   rQ   r9   rR   rC   r   r   r   never   rT   z,RatelimitTests.test_zero_rate.<locals>.neverrF   rv   )r   r   r   r   r   test_zero_rate   s   
zRatelimitTests.test_zero_ratec                 C   s   t dd dddd }|tdrJ |tdrJ |tdr&J |tdr/J |tdr8J |tdrAJ |tdrJJ d S )NrM   FrN   c                 S   rQ   r9   rR   rC   r   r   r   always   rT   z-RatelimitTests.test_none_rate.<locals>.alwaysrF   rv   )r   r   r   r   r   test_none_rate   s   
zRatelimitTests.test_none_ratec                 C   s   dd }dd }t d|dddd	 }||dd
rJ ||dd
s%J ||dd
r.J ||dd
r7J ||dd
s@J d S )Nc                 S      t d}t| d|_|S NrF   r   rG   rf   r   r+   authrK   r   r   r   r{         
z/RatelimitTests.test_callable_rate.<locals>._reqc                 S      |j jrdS dS )N)   r$   )r   r$   r*   r,   r   r   r   get_rate   r0   z3RatelimitTests.test_callable_rate.<locals>.get_rate
user_or_ipFrN   c                 S   rQ   r9   rR   rC   r   r   r   rD      rT   z/RatelimitTests.test_callable_rate.<locals>.viewr   Tr   r   r{   r   rD   r   r   r   test_callable_rate   s   
z!RatelimitTests.test_callable_ratec                 C   sl   ddd}dd }t d|dddd	 }|| rJ || s"J ||d
dr+J ||d
dr4J d S )NFc                 S   s   t d}| |_|S )NrF   )rG   rf   never_limit)r   rK   r   r   r   r{      s   
z4RatelimitTests.test_callable_rate_none.<locals>._reqc                 S   s   |j rd S dS )Nr?   r   )grr   r   r   <lambda>   s    z8RatelimitTests.test_callable_rate_none.<locals>.<lambda>rM   rN   c                 S   rQ   r9   rR   rC   r   r   r   rD      rT   z4RatelimitTests.test_callable_rate_none.<locals>.viewTr   r   r   r   r   r   r   test_callable_rate_none   s   

z&RatelimitTests.test_callable_rate_nonec                 C   s`   dd }dd }t d|dddd	 }||dd
sJ ||dd
r%J ||dd
s.J d S )Nc                 S   r   r   r   r   r   r   r   r{      r   z4RatelimitTests.test_callable_rate_zero.<locals>._reqc                 S   r   )Nr?   rh   r*   r,   r   r   r   r      r0   z8RatelimitTests.test_callable_rate_zero.<locals>.get_raterM   FrN   c                 S   rQ   r9   rR   rC   r   r   r   rD      rT   z4RatelimitTests.test_callable_rate_zero.<locals>.viewr   Tr   r   r   r   r   test_callable_rate_zero   s   
z&RatelimitTests.test_callable_rate_zeroc                 C   sF   dd }t dddddd }||dd	sJ ||d
d	r!J d S )Nc                 S   r   r   r   r   r   r   r   r{      r   z6RatelimitTests.test_callable_rate_import.<locals>._reqr   z$django_ratelimit.tests.callable_rateFrN   c                 S   rQ   r9   rR   rC   r   r   r   rD     s   z6RatelimitTests.test_callable_rate_import.<locals>.viewr   Tr   r}   r   r   r   test_callable_rate_import   s   
z(RatelimitTests.test_callable_rate_importc                 C   s   dd }t dddddd }||dd	rJ ||dd	s!J td
}tdd|_||dd	r5J ||dd	s>J dS )z)Allow custom functions to set cache keys.c                 S   r   r   r   r   r   r   r   r{     r   z,RatelimitTests.test_user_or_ip.<locals>._reqr   r?   FrN   c                 S   rQ   r9   rR   rC   r   r   r   rD     rT   z,RatelimitTests.test_user_or_ip.<locals>.viewr   rF   Tr   N)r   rG   rf   r   r+   )r   r{   rD   r   r   r   r   test_user_or_ip  s   

zRatelimitTests.test_user_or_ipc                 C   s>   t dddddd }|tdrJ |tdsJ d S )Nzdjango_ratelimit.tests.mykeyr?   FrN   c                 S   rQ   r9   rR   rC   r   r   r   rD   $  rT   z3RatelimitTests.test_callable_key_path.<locals>.viewrF   rv   rW   r   r   r   test_callable_key_path#     
z%RatelimitTests.test_callable_key_pathc                 C   s>   t tddddd }|tdrJ |tdsJ d S )Nr?   FrN   c                 S   rQ   r9   rR   rC   r   r   r   rD   ,  rT   z.RatelimitTests.test_callable_key.<locals>.viewrF   )r   r5   rG   rf   rW   r   r   r   test_callable_key+  r   z RatelimitTests.test_callable_keyc                 C   sT   t dddd dt dddd ddd	 }|td
rJ |td
s(J dS )zAllow @ratelimit to be stacked.r?   Fc                 S   rA   )Nminr   xyr   r   r   r   7      z7RatelimitTests.test_stacked_decorator.<locals>.<lambda>)r@   rP   rO   z10/dc                 S   rA   )Ndayr   r   r   r   r   r   8  r   c                 S   rQ   r9   rR   rC   r   r   r   rD   7  r|   z3RatelimitTests.test_stacked_decorator.<locals>.viewrF   Nrv   rW   r   r   r   test_stacked_decorator3  s
   z%RatelimitTests.test_stacked_decoratorc                 C   st   t dddddt ddddddd }|td	rJ |td	r&J |td	s/J |td	s8J d
S )z4Different methods should result in different counts.r?   rM   rq   F)r@   rO   rd   rP   rb   c                 S   rQ   r9   rR   rC   r   r   r   rD   A  r|   z1RatelimitTests.test_stacked_methods.<locals>.viewrF   N)r   rG   rH   rf   rW   r   r   r   test_stacked_methods?  s   z#RatelimitTests.test_stacked_methodsc                 C   sd   t ddddgddddd	 }t ddddgdddd
d }|tdr'J |tds0J dS )z&Order of the methods shouldn't matter.r?   rM   rq   rb   rc   F)r@   rO   rd   r-   rP   c                 S   rQ   r9   rR   rC   r   r   r   get_postM  r|   z4RatelimitTests.test_sorted_methods.<locals>.get_postc                 S   rQ   r9   rR   rC   r   r   r   post_getR  r|   z4RatelimitTests.test_sorted_methods.<locals>.post_getrF   NrV   )r   r   r   r   r   r   test_sorted_methodsK  s   

z"RatelimitTests.test_sorted_methodsc                 C      t dddddd }| jdd/ td	}d
|jd< ||r"J ||s(J td	}d|jd< ||r8J W d    d S 1 sCw   Y  d S )Nr?   rM   Fr@   rO   rP   c                 S   rQ   r9   rR   rC   r   r   r   rD   [  rT   z8RatelimitTests.test_ratelimit_full_mask_v4.<locals>.view    RATELIMIT_IPV4_MASKrF   10.1.1.1r1   z10.1.1.2r   r_   rG   rH   r4   rJ   r   r   r   test_ratelimit_full_mask_v4Z     




"z*RatelimitTests.test_ratelimit_full_mask_v4c                 C   r   )Nr?   rM   Fr   c                 S   rQ   r9   rR   rC   r   r   r   rD   j  rT   z8RatelimitTests.test_ratelimit_full_mask_v6.<locals>.view   RATELIMIT_IPV6_MASKrF   2001:db8::1000r1   2001:db8::1001r   rJ   r   r   r   test_ratelimit_full_mask_v6i  r   z*RatelimitTests.test_ratelimit_full_mask_v6c                 C      t dddddd }| jdd? td	}d
|jd< ||r"J ||s(J td	}d|jd< ||s8J td	}d|jd< ||rHJ W d    d S 1 sSw   Y  d S )Nr?   rM   Fr   c                 S   rQ   r9   rR   rC   r   r   r   rD   y  rT   z3RatelimitTests.test_ratelimit_mask_v4.<locals>.view   r   rF   r   r1   z10.1.0.1z192.168.1.1r   rJ   r   r   r   test_ratelimit_mask_v4x     






"z%RatelimitTests.test_ratelimit_mask_v4c                 C   r   )Nr?   rM   Fr   c                 S   rQ   r9   rR   rC   r   r   r   rD     rT   z3RatelimitTests.test_ratelimit_mask_v6.<locals>.view@   r   rF   r   r1   r   z2001:db9::1000r   rJ   r   r   r   test_ratelimit_mask_v6  r   z%RatelimitTests.test_ratelimit_mask_v6N)r   r   r   r=   rL   rX   r[   r`   ra   rg   rp   ru   rw   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   7   s:    			

	r7   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )FunctionsTestsc                 C   r8   r9   r:   r<   r   r   r   r=     r>   zFunctionsTests.setUpc                 C   s>   t tddtjddd}|tdrJ |tdrJ d S )NFr?   rM   rc   	incrementr@   rd   rO   r-   rF   r   r   ALLrG   rH   r   not_incrementr   r   r   test_is_ratelimited  s
   z"FunctionsTests.test_is_ratelimitedc                 C   s>   t tddtjddd}|tdrJ |tdsJ d S )NTr?   rM   rc   r   rF   r   r   do_incrementr   r   r   test_is_ratelimited_increment  s
   z,FunctionsTests.test_is_ratelimited_incrementc                 C   sd   t ttjdddd}|td}| |d d | |d d	 | |d
 d | |d  d S )NrM   r?   rc   rd   rO   r@   r-   rF   countr   limitr   	time_leftr$   should_limit)r   r   r   rG   rH   assertEqualassertLessEqualassertFalser   
_get_usageusager   r   r   test_get_usage  s   
zFunctionsTests.test_get_usagec                 C   st   t ttjddddd}|td |td}| |d d | |d	 d
 | |d d | |d  d S )NrM   r?   rc   T)rd   rO   r@   r-   r   rF   r   r   r   r   r   r$   r   r   r   r   rG   rH   r   r   
assertTruer   r   r   r   test_get_usage_increment  s   
z'FunctionsTests.test_get_usage_incrementc                 C   s   t ttjdddd}|tddd |tddd |td}| |d d	 | |d
 d | |d d | |d  d S )NrM   r?   rc   r   rF   T)r   r   r   r   r   r   r$   r   r   r   r   r   r   "test_not_increment_after_increment  s   
z1FunctionsTests.test_not_increment_after_incrementc                 C   sB   |  t ttddd W d    d S 1 sw   Y  d S )NrF   rM   )rO   )rI   r   r   rG   rH   r<   r   r   r   )test_get_usage_called_without_group_or_fn  s   "z8FunctionsTests.test_get_usage_called_without_group_or_fnN)
r   r   r   r=   r   r   r   r   r   r   r   r   r   r   r     s    

r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )RatelimitCBVTestsc                 C   r8   r9   r:   r<   r   r   r   r=     r>   zRatelimitCBVTests.setUpc                 C   s@   G dd dt }| }|tdrJ |tdsJ d S )Nc                   @   s&   e Zd Zeedddddd ZdS )z9RatelimitCBVTests.test_method_decorator.<locals>.TestViewrM   r?   FrN   c                 S      |j S r9   rR   r   r.   r   r   r   rf     rT   z>RatelimitCBVTests.test_method_decorator.<locals>.TestView.postN)r   r   r   r	   r   rf   r   r   r   r   TestView  s    r   rF   )r
   as_viewrG   rf   r   r   rD   r   r   r   test_method_decorator  s   z'RatelimitCBVTests.test_method_decoratorc                 C   sV   t tddddddG dd dt}| }|td	r J |td	s)J d S )
NrM   r?   FrN   rH   )namec                   @   r   )z8RatelimitCBVTests.test_class_decorator.<locals>.TestViewc                 S   r   r9   rR   r   r   r   r   rH        z<RatelimitCBVTests.test_class_decorator.<locals>.TestView.getNr   r   r   rH   r   r   r   r   r     s    r   rF   )r	   r   r
   r   rG   rH   r   r   r   r   test_class_decorator  s   z&RatelimitCBVTests.test_class_decoratorc                 C   sR   G dd dt }| }tdddd|}|tdrJ |tds'J d S )Nc                   @   r   )z2RatelimitCBVTests.test_wrap_view.<locals>.TestViewc                 S   r   r9   rR   r   r   r   r   rH     r   z6RatelimitCBVTests.test_wrap_view.<locals>.TestView.getNr   r   r   r   r   r     r)   r   rM   r?   FrN   rF   )r
   r   r   rG   rH   )r   r   rD   wrappedr   r   r   test_wrap_view  s
   z RatelimitCBVTests.test_wrap_viewc                 C   sR   G dd dt }| }|tdrJ |tdsJ |tdr'J d S )Nc                   @   sD   e Zd Zeeddddddd Zeedddddd	d
 ZdS )zCRatelimitCBVTests.test_methods_counted_separately.<locals>.TestViewrM   r?   rq   Frr   c                 S   r   r9   rR   r   r   r   r   rH     r|   zGRatelimitCBVTests.test_methods_counted_separately.<locals>.TestView.getrb   c                 S   r   r9   rR   r   r   r   r   rf     r|   zHRatelimitCBVTests.test_methods_counted_separately.<locals>.TestView.postN)r   r   r   r	   r   rH   rf   r   r   r   r   r     s    
r   rF   )r
   r   rG   rH   rf   r   r   r   r   test_methods_counted_separately  s
   z1RatelimitCBVTests.test_methods_counted_separatelyc                 C   sj   G dd dt }G dd dt }| }| }|tdr!J |tds*J |tdr3J d S )Nc                   @   (   e Zd Zeeddddddd ZdS )	zARatelimitCBVTests.test_views_counted_separately.<locals>.TestViewrM   r?   rq   Frr   c                 S   r   r9   rR   r   r   r   r   rH     r|   zERatelimitCBVTests.test_views_counted_separately.<locals>.TestView.getNr   r   r   r	   r   rH   r   r   r   r   r     
    r   c                   @   r   )	zHRatelimitCBVTests.test_views_counted_separately.<locals>.AnotherTestViewrM   r?   rq   Frr   c                 S   r   r9   rR   r   r   r   r   rH     r|   zLRatelimitCBVTests.test_views_counted_separately.<locals>.AnotherTestView.getNr   r   r   r   r   AnotherTestView  r   r   rF   )r
   r   rG   rH   )r   r   r   	test_viewanother_viewr   r   r   test_views_counted_separately  s   z/RatelimitCBVTests.test_views_counted_separatelyN)	r   r   r   r=   r   r   r   r   r   r   r   r   r   r     s    r   c                   @   s   e Zd Zedddd Zedddd Zeddd	d
d Zedddd Zedddd Zedddd Z	edddd Z
dS )CacheFailTestsz
fake-cache)RATELIMIT_USE_CACHEc                 C   sT   t dddddd }| t |td W d    d S 1 s#w   Y  d S )NrM   r?   FrN   c                 S   rQ   r9   rR   rC   r   r   r   rD   /  rT   z+CacheFailTests.test_bad_cache.<locals>.viewrF   )r   rI   r   rG   rf   rW   r   r   r   test_bad_cache-  s
   
"zCacheFailTests.test_bad_cachezconnection-errorsc                 C   r   )NrM   z10/mFrN   c                 S   rQ   r9   rR   rC   r   r   r   rD   8  rT   zACacheFailTests.test_limit_on_cache_connection_error.<locals>.viewrF   rv   rW   r   r   r   $test_limit_on_cache_connection_error6  s   
z3CacheFailTests.test_limit_on_cache_connection_errorT)r   RATELIMIT_FAIL_OPENc                 C   s>   t dddddd }|tdrJ |tdrJ d S )NrM   r?   FrN   c                 S   rQ   r9   rR   rC   r   r   r   rD   A  rT   z3CacheFailTests.test_fail_open_setting.<locals>.viewrF   rV   rW   r   r   r   test_fail_open_setting>  s   
z%CacheFailTests.test_fail_open_settingc                 C   s0   dd }|t drJ |t drJ d S )Nc                 S      t | dt jddddS )NFrM   r?   rc   r   rd   rO   r@   r-   r   r   rC   r   r   r   r   J     zbCacheFailTests.test_is_ratelimited_cache_connection_error_without_increment.<locals>.not_incrementrF   rG   rH   r   r   r   r   <test_is_ratelimited_cache_connection_error_without_incrementH     zKCacheFailTests.test_is_ratelimited_cache_connection_error_without_incrementc                 C   0   dd }|t dsJ |t dsJ d S )Nc                 S   r   NTrM   r?   rc   r   r   rC   r   r   r   r   T  r   z^CacheFailTests.test_is_ratelimited_cache_connection_error_with_increment.<locals>.do_incrementrF   r   r   r   r   r   9test_is_ratelimited_cache_connection_error_with_incrementR  r   zHCacheFailTests.test_is_ratelimited_cache_connection_error_with_incrementzconnection-errors-redisc                 C   r   )Nc                 S   r   r   r   rC   r   r   r   r   ^  r   zdCacheFailTests.test_is_ratelimited_cache_connection_error_with_increment_redis.<locals>.do_incrementrF   r   r   r   r   r   ?test_is_ratelimited_cache_connection_error_with_increment_redis\  r   zNCacheFailTests.test_is_ratelimited_cache_connection_error_with_increment_rediszinstant-expirationc                 C   s<   t ddddd }|tdsJ |tdsJ d S )NrM   r?   rY   c                 S   rA   rB   r   rC   r   r   r   rD   h  rE   z/CacheFailTests.test_cache_timeout.<locals>.viewrF   rV   rW   r   r   r   test_cache_timeoutf  s   

z!CacheFailTests.test_cache_timeoutN)r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   r   ,  s"    



	
	
	r   c                 C   s
   | j d S )NMY_THINGr3   rz   r   r   r   my_ipp  s   
r  c                   @   sd   e Zd Zdd Zedddd Zedddd	 Zed
ddd Zeeddd Z	dd Z
dS )IpMetaTestsc                 C   s(   t d}d|jd< dt|ksJ d S NrF   rx   r1   rG   rH   r4   r   r   rK   r   r   r   test_defaultu  s   

zIpMetaTests.test_defaultfake)RATELIMIT_IP_META_KEYc                 C   L   t d}d|jd< | t t| W d    d S 1 sw   Y  d S r  rG   rH   r4   rI   r   r   r  r   r   r   test_bad_config{  s
   


"zIpMetaTests.test_bad_configHTTP_X_CLIENT_IPc                 C   2   t d}d|jd< d|jd< dt|ksJ d S )NrF   rx   r1   5.6.7.8r  r  r  r   r   r   test_alternate_header     


z!IpMetaTests.test_alternate_headerzdjango_ratelimit.tests.my_ipc                 C   r  NrF   rx   r1   r  r  r  r  r   r   r   test_path_to_ip_key_callable  r  z(IpMetaTests.test_path_to_ip_key_callablec                 C   r  r  r  r  r   r   r   test_callable_ip_key  r  z IpMetaTests.test_callable_ip_keyc                 C   r  )NrF   r^   r1   r  r  r   r   r   test_empty_ip  s
   


"zIpMetaTests.test_empty_ipN)r   r   r   r	  r   r  r  r  r  r  r  r   r   r   r   r  t  s    



r  N)&	functoolsr   django.core.cacher   r   django.core.exceptionsr   django.testr   r   django.test.utilsr   django.utils.decoratorsr	   django.views.genericr
   django_ratelimit.decoratorsr   django_ratelimit.exceptionsr   django_ratelimit.corer   r   r   r   rG   r   r    r/   r5   	Exceptionr6   r7   r   r   r   r  r  r   r   r   r   <module>   s0      j@MD