§
    £”j¹T  ã                   ó–  — 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¦  «        Z G d„ de	¦  «        Zd„ Zd„ Z G d„ de¦  «        Z G d„ de	¦  «        Z  G d„ de	¦  «        Z! G d„ de	¦  «        Z" G d„ de	¦  «        Z#d„ Z$ G 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                   ó   — e Zd Zdd„ZdS )ÚMockUserFc                 ó"   — d| _         || _        d S )Né   )ÚpkÚis_authenticated)ÚselfÚauthenticateds     úe/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/django_ratelimit/tests.pyÚ__init__zMockUser.__init__   s   € ØˆŒØ -ˆÔÐÐó    N©F)Ú__name__Ú
__module__Ú__qualname__r   © r   r   r   r      s(   € € € € € ð.ð .ð .ð .ð .ð .r   r   c                   ó   — e Zd Zd„ ZdS )ÚRateParsingTestsc                 óD   — d}|D ]\  }}|t          |¦  «        k    sJ ‚Œ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   i€Q )r   )r   ÚtestsÚiÚos       r   Útest_simplezRateParsingTests.test_simple   sB   € ð
ˆð ð 	'ð 	'‰DˆAˆqØ� A™œÒ&Ð&Ð&Ð&Ð&ð	'ð 	'r   N)r   r    r!   r-   r"   r   r   r$   r$      s#   € € € € € ð'ð 'ð 'ð 'ð 'r   r$   c                 ó"   — |j         j        rd S dS )N)r   r   ©Úuserr   ©ÚgroupÚrequests     r   Úcallable_rater4   )   s   € Ø„|Ô$ð ØˆtØˆ6r   c                 ó.   — |j         d         d d d…         S )NÚREMOTE_ADDRéÿÿÿÿ©ÚMETAr1   s     r   Úmykeyr:   /   s   € ØŒ<˜Ô& t t¨ tÔ,Ð,r   c                   ó   — e Zd ZdS )ÚCustomRatelimitedExceptionN)r   r    r!   r"   r   r   r<   r<   3   s   € € € € € Ø€Dr   r<   c                   ó¶   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚRatelimitTestsc                 ó,   — t          j        ¦   «          d S ©N©r   Úclear©r   s    r   ÚsetUpzRatelimitTests.setUp8   ó   € ÝŒ‰Œˆˆˆr   c                 óè   — t          d¬¦  «        d„ ¦   «         }t                               d¦  «        }|                      t          ¦  «        5   ||¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nú1/m)Úratec                 ó   — dS ©NTr"   ©r3   s    r   Úviewz(RatelimitTests.test_no_key.<locals>.view<   ó   € à�4r   ú/)r   ÚrfÚgetÚassertRaisesr   ©r   rL   Úreqs      r   Útest_no_keyzRatelimitTests.test_no_key;   s¾   € Ý	˜Ð	Ñ	Ô	ð	ð 	ñ 
Ô	ð	õ �fŠf�S‰kŒkˆØ×ÒÕ3Ñ4Ô4ð 	ð 	ØˆD�‰IŒIˆIð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ÁA'Á'A+Á.A+c                 óð   — t          ddd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        r
J d¦   «         ‚ |t                               d¦  «        ¦  «        s
J d¦   «         ‚d S )	NÚiprG   F©ÚkeyrH   Úblockc                 ó   — | j         S r@   ©ÚlimitedrK   s    r   rL   z$RatelimitTests.test_ip.<locals>.viewE   ó
   € à”?Ð"r   rN   úFirst request works.zSecond request is limited©r   rO   rP   ©r   rL   s     r   Útest_ipzRatelimitTests.test_ipD   s…   € Ý	�t %¨uÐ	5Ñ	5Ô	5ð	#ð 	#ñ 
6Ô	5ð	#ð �4�Ÿš˜s™œÑ$Ô$Ð<Ð<Ð&<Ñ<Ô<Ð<Øˆt•B—F’F˜3‘K”KÑ Ô Ð=Ð=Ð"=Ñ=Ô=Ð=Ð=Ð=r   c                 óD  — t          dd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        r
J d¦   «         ‚|                      t          ¦  «        5   |t                               d¦  «        ¦  «        df d d d ¦  «         d S # 1 swxY w Y   d S )NrV   rG   ©rX   rH   c                 ó   — | j         S r@   r[   rK   s    r   Úblockedz*RatelimitTests.test_block.<locals>.blockedM   r]   r   rN   r^   zSecond request is blocked.)r   rO   rP   rQ   r   )r   re   s     r   Ú
test_blockzRatelimitTests.test_blockL   sì   € Ý	�t %Ð	(Ñ	(Ô	(ð	#ð 	#ñ 
)Ô	(ð	#ð �7�2Ÿ6š6 #™;œ;Ñ'Ô'Ð?Ð?Ð)?Ñ?Ô?Ð?Ø×Ò�{Ñ+Ô+ð 	?ð 	?ØˆG•B—F’F˜3‘K”KÑ Ô Ð">Ð>Ð>ð	?ð 	?ð 	?ñ 	?ô 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?øøøð 	?ð 	?ð 	?ð 	?ð 	?ð 	?s   Á"&BÂBÂBc                 ó`  — t          dd¬¦  «        d„ ¦   «         }|                      d¬¦  «        5  t                               d¦  «        } ||¦  «        rJ ‚|                      t
          ¦  «        5   ||¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )NrV   rG   rc   c                 ó   — | j         S r@   r[   rK   s    r   rL   zIRatelimitTests.test_ratelimit_custom_string_exception_class.<locals>.viewV   r]   r   z1django_ratelimit.tests.CustomRatelimitedException©ÚRATELIMIT_EXCEPTION_CLASSÚ )r   ÚsettingsrO   rP   rQ   r<   rR   s      r   Ú,test_ratelimit_custom_string_exception_classz;RatelimitTests.test_ratelimit_custom_string_exception_classU   sG  € Ý	�t %Ð	(Ñ	(Ô	(ð	#ð 	#ñ 
)Ô	(ð	#ð �]Š]àCð ñ 
ô 
ð 	ð 	õ
 —&’&˜‘*”*ˆCØ�t˜C‘y”yÐ Ð Ð Ø×"Ò"Õ#=Ñ>Ô>ð ð Ø��S‘	”	�	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s6   ±AB#Á3BÁ?B#ÂB	ÂB#ÂB	ÂB#Â#B'Â*B'c                 ój  — t          dd¬¦  «        d„ ¦   «         }|                      t          ¬¦  «        5  t                               d¦  «        } ||¦  «        rJ ‚|                      t          ¦  «        5   ||¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )NrV   rG   rc   c                 ó   — | j         S r@   r[   rK   s    r   rL   zBRatelimitTests.test_ratelimit_custom_exception_class.<locals>.viewe   r]   r   ri   rk   )r   rl   r<   rO   rP   rQ   rR   s      r   Ú%test_ratelimit_custom_exception_classz4RatelimitTests.test_ratelimit_custom_exception_classd   sG  € Ý	�t %Ð	(Ñ	(Ô	(ð	#ð 	#ñ 
)Ô	(ð	#ð �]Š]Ý&@ð ñ 
ô 
ð 	ð 	õ —&’&˜‘*”*ˆCØ�t˜C‘y”yÐ Ð Ð Ø×"Ò"Õ#=Ñ>Ô>ð ð Ø��S‘	”	�	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s6   ¶AB(Á8BÂB(ÂB	ÂB(ÂB	ÂB(Â(B,Â/B,c                 óN  — t          ddddd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        r
J d	¦   «         ‚ |t                               d¦  «        ¦  «        s
J d
¦   «         ‚ |t                               d¦  «        ¦  «        r
J d¦   «         ‚d S )NrV   ÚPOSTrG   ÚaF)rX   ÚmethodrH   r2   rY   c                 ó   — | j         S r@   r[   rK   s    r   Ú
limit_postz.RatelimitTests.test_method.<locals>.limit_postr   r]   r   rN   zDo not limit first POST.zLimit second POST.zDo not limit GET.)r   rO   ÚpostrP   )r   rv   s     r   Útest_methodzRatelimitTests.test_methodq   s³   € Ý	�t F°¸cÈÐ	OÑ	OÔ	Oð	#ð 	#ñ 
PÔ	Oð	#ð �:�bŸgšg c™lœlÑ+Ô+ÐGÐGÐ-GÑGÔGÐGØˆz�"Ÿ'š' #™,œ,Ñ'Ô'Ð=Ð=Ð)=Ñ=Ô=Ð=Ø�:�bŸfšf S™kœkÑ*Ô*Ð?Ð?Ð,?Ñ?Ô?Ð?Ð?Ð?r   c                 óX  — t          dt           j        dd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        sJ ‚ |t                               d¦  «        ¦  «        sJ ‚ |t                               d¦  «        ¦  «        sJ ‚ |t           	                    d¦  «        ¦  «        sJ ‚d S )NrV   ú0/mF)rX   rt   rH   rY   c                 ó   — | j         S r@   r[   rK   s    r   Úlimit_unsafez8RatelimitTests.test_unsafe_methods.<locals>.limit_unsafe{   r]   r   rN   )
r   ÚUNSAFErO   rP   ÚheadÚoptionsÚdeleterw   ÚputÚpatch)r   r|   s     r   Útest_unsafe_methodsz"RatelimitTests.test_unsafe_methodsz   s  € Ý	�t¥IÔ$4¸5ÈÐ	NÑ	NÔ	Nð	#ð 	#ñ 
OÔ	Nð	#ð  �<¥§¢ s¡¤Ñ,Ô,Ð,Ð,Ð,Ø�<¥§¢¨¡¤Ñ-Ô-Ð-Ð-Ð-Ø�<¥§
¢
¨3¡¤Ñ0Ô0Ð0Ð0Ð0Øˆ|�BŸIšI c™NœNÑ+Ô+Ð+Ð+Ð+Øˆ|�BŸGšG C™LœLÑ)Ô)Ð)Ð)Ð)Øˆ|�BŸFšF 3™KœKÑ(Ô(Ð(Ð(Ð(Øˆ|�BŸHšH S™MœMÑ*Ô*Ð*Ð*Ð*Ð*Ð*r   c                 ó~  — t          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get:foorG   ÚGETF©rX   rH   rt   rY   c                 ó   — | j         S r@   r[   rK   s    r   rL   z)RatelimitTests.test_key_get.<locals>.viewˆ   r]   r   rN   Úfoors   Úbr_   r`   s     r   Útest_key_getzRatelimitTests.test_key_get‡   sÖ   € Ý	�y u°UÀ%Ð	HÑ	HÔ	Hð	#ð 	#ñ 
IÔ	Hð	#ð �4�Ÿš˜s U¨C LÑ1Ô1Ñ2Ô2Ð2Ð2Ð2Øˆt•B—F’F˜3 ¨ Ñ-Ô-Ñ.Ô.Ð.Ð.Ð.Ø�4�Ÿš˜s U¨C LÑ1Ô1Ñ2Ô2Ð2Ð2Ð2Øˆt•B—F’F˜3 ¨ Ñ-Ô-Ñ.Ô.Ð.Ð.Ð.Ð.Ð.r   c                 ó|  — t          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:foorG   FrW   c                 ó   — | j         S r@   r[   rK   s    r   rL   z*RatelimitTests.test_key_post.<locals>.view’   r]   r   rN   rˆ   rs   r‰   ©r   rO   rw   r`   s     r   Útest_key_postzRatelimitTests.test_key_post‘   sÓ   € Ý	�z¨°UÐ	;Ñ	;Ô	;ð	#ð 	#ñ 
<Ô	;ð	#ð �4�Ÿš  e¨S \Ñ2Ô2Ñ3Ô3Ð3Ð3Ð3Øˆt•B—G’G˜C %¨ Ñ.Ô.Ñ/Ô/Ð/Ð/Ð/Ø�4�Ÿš  e¨S \Ñ2Ô2Ñ3Ô3Ð3Ð3Ð3Øˆt•B—G’G˜C %¨ Ñ.Ô.Ñ/Ô/Ð/Ð/Ð/Ð/Ð/r   c                 óÆ   — d„ }t          ddd¬¦  «        t          ddd¬¦  «        d„ ¦   «         ¦   «         } | |¦   «         ¦  «        rJ ‚ | |¦   «         ¦  «        sJ ‚d S )Nc                  óN   — t                                d¦  «        } d| j        d<   | S )NrN   ú1.2.3.4ÚHTTP_X_REAL_IP)rO   rw   r9   ©rS   s    r   Ú_reqz,RatelimitTests.test_key_header.<locals>._reqœ   s#   € Ý—'’'˜#‘,”,ˆCØ)2ˆCŒHÐ%Ñ&ØˆJr   zheader:x-real-iprG   FrW   zheader:x-missing-headerc                 ó   — | j         S r@   r[   rK   s    r   rL   z,RatelimitTests.test_key_header.<locals>.view¡   ó   € ð ”?Ð"r   r   ©r   r”   rL   s      r   Útest_key_headerzRatelimitTests.test_key_header›   s–   € ð	ð 	ð 	õ
 
Ð)°¸UÐ	CÑ	CÔ	CÝ	Ð0°uÀEÐ	JÑ	JÔ	Jð	#ð 	#ñ 
KÔ	Jñ 
DÔ	Cð	#ð �4˜˜™œ‘<”<ÐÐÐØˆt�D�D‘F”F‰|Œ|ÐÐÐÐÐr   c                 óJ  — t          ddd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        r
J d¦   «         ‚ |t                               d¦  «        ¦  «        r
J d¦   «         ‚ |t                               d¦  «        ¦  «        s
J d	¦   «         ‚d S )
NrV   z2/mFrW   c                 ó   — | j         S r@   r[   rK   s    r   Útwicez'RatelimitTests.test_rate.<locals>.twiceª   r]   r   rN   zFirst request is not limited.zSecond request is not limited.zThird request is limited.r�   )r   r›   s     r   Ú	test_ratezRatelimitTests.test_rate©   s®   € Ý	�t %¨uÐ	5Ñ	5Ô	5ð	#ð 	#ñ 
6Ô	5ð	#ð �5�Ÿš ™œÑ&Ô&ÐGÐGÐ(GÑGÔGÐGØ�5�Ÿš ™œÑ&Ô&ÐHÐHÐ(HÑHÔHÐHØˆu•R—W’W˜S‘\”\Ñ"Ô"Ð?Ð?Ð$?Ñ?Ô?Ð?Ð?Ð?r   c                 ó†   — t          ddd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        sJ ‚d S )NrV   rz   FrW   c                 ó   — | j         S r@   r[   rK   s    r   Úneverz,RatelimitTests.test_zero_rate.<locals>.never³   r]   r   rN   r�   )r   rŸ   s     r   Útest_zero_ratezRatelimitTests.test_zero_rate²   sS   € Ý	�t %¨uÐ	5Ñ	5Ô	5ð	#ð 	#ñ 
6Ô	5ð	#ð ˆu•R—W’W˜S‘\”\Ñ"Ô"Ð"Ð"Ð"Ð"Ð"r   c                 óB  — t          dd d¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚d S )NrV   FrW   c                 ó   — | j         S r@   r[   rK   s    r   Úalwaysz-RatelimitTests.test_none_rate.<locals>.alwaysº   r]   r   rN   r�   )r   r£   s     r   Útest_none_ratezRatelimitTests.test_none_rate¹   s  € Ý	�t $¨eÐ	4Ñ	4Ô	4ð	#ð 	#ñ 
5Ô	4ð	#ð �6�"Ÿ'š' #™,œ,Ñ'Ô'Ð'Ð'Ð'Ø�6�"Ÿ'š' #™,œ,Ñ'Ô'Ð'Ð'Ð'Ø�6�"Ÿ'š' #™,œ,Ñ'Ô'Ð'Ð'Ð'Ø�6�"Ÿ'š' #™,œ,Ñ'Ô'Ð'Ð'Ð'Ø�6�"Ÿ'š' #™,œ,Ñ'Ô'Ð'Ð'Ð'Ø�6�"Ÿ'š' #™,œ,Ñ'Ô'Ð'Ð'Ð'Ø�6�"Ÿ'š' #™,œ,Ñ'Ô'Ð'Ð'Ð'Ð'Ð'r   c                 ó.  — d„ }d„ }t          d|d¬¦  «        d„ ¦   «         } | |d¬¦  «        ¦  «        rJ ‚ | |d¬¦  «        ¦  «        sJ ‚ | |d¬¦  «        ¦  «        rJ ‚ | |d¬¦  «        ¦  «        rJ ‚ | |d¬¦  «        ¦  «        sJ ‚d S )	Nc                 ód   — t                                d¦  «        }t          | ¬¦  «        |_        |S ©NrN   ©r   ©rO   rw   r   r0   ©ÚauthrS   s     r   r”   z/RatelimitTests.test_callable_rate.<locals>._reqÇ   ó(   € Ý—'’'˜#‘,”,ˆCÝ¨dÐ3Ñ3Ô3ˆCŒHØˆJr   c                 ó"   — |j         j        rdS dS )N)é   r)   )r   r)   r/   r1   s     r   Úget_ratez3RatelimitTests.test_callable_rate.<locals>.get_rateÌ   s   € ØŒ|Ô,ð Ø�wØ�7r   Ú
user_or_ipFrW   c                 ó   — | j         S r@   r[   rK   s    r   rL   z/RatelimitTests.test_callable_rate.<locals>.viewÑ   r]   r   ©r«   Tr   ©r   r”   r¯   rL   s       r   Útest_callable_ratez!RatelimitTests.test_callable_rateÆ   sú   € ð	ð 	ð 	ð
	ð 	ð 	õ
 
�|¨(¸%Ð	@Ñ	@Ô	@ð	#ð 	#ñ 
AÔ	@ð	#ð �4˜˜ %Ð(Ñ(Ô(Ñ)Ô)Ð)Ð)Ð)Øˆt�D�D˜eÐ$Ñ$Ô$Ñ%Ô%Ð%Ð%Ð%Ø�4˜˜ $˜™œÑ(Ô(Ð(Ð(Ð(Ø�4˜˜ $˜™œÑ(Ô(Ð(Ð(Ð(Øˆt�D�D˜d�O‘O”OÑ$Ô$Ð$Ð$Ð$Ð$Ð$r   c                 óú   — d	d„}d„ }t          d|d¬¦  «        d„ ¦   «         } | |¦   «         ¦  «        rJ ‚ | |¦   «         ¦  «        sJ ‚ | |d¬¦  «        ¦  «        rJ ‚ | |d¬¦  «        ¦  «        rJ ‚d S )
NFc                 óH   — t                                d¦  «        }| |_        |S )NrN   )rO   rw   Únever_limit)r·   rS   s     r   r”   z4RatelimitTests.test_callable_rate_none.<locals>._reqÜ   s   € Ý—'’'˜#‘,”,ˆCØ)ˆCŒOØˆJr   c                 ó   — |j         rd ndS )NrG   ©r·   )ÚgÚrs     r   ú<lambda>z8RatelimitTests.test_callable_rate_none.<locals>.<lambda>á   s   € ¨¬Ð @  ¸5€ r   rV   rW   c                 ó   — | j         S r@   r[   rK   s    r   rL   z4RatelimitTests.test_callable_rate_none.<locals>.viewã   r]   r   Tr¹   r   r   r³   s       r   Útest_callable_rate_nonez&RatelimitTests.test_callable_rate_noneÛ   sÌ   € ð	ð 	ð 	ð 	ð
 AÐ@ˆå	�t (°%Ð	8Ñ	8Ô	8ð	#ð 	#ñ 
9Ô	8ð	#ð �4˜˜™œ‘<”<ÐÐÐØˆt�D�D‘F”F‰|Œ|ÐÐÐØ�4˜˜¨Ð.Ñ.Ô.Ñ/Ô/Ð/Ð/Ð/Ø�4˜˜¨Ð.Ñ.Ô.Ñ/Ô/Ð/Ð/Ð/Ð/Ð/r   c                 óÒ   — d„ }d„ }t          d|d¬¦  «        d„ ¦   «         } | |d¬¦  «        ¦  «        sJ ‚ | |d¬¦  «        ¦  «        rJ ‚ | |d¬¦  «        ¦  «        sJ ‚d S )	Nc                 ód   — t                                d¦  «        }t          | ¬¦  «        |_        |S r§   r©   rª   s     r   r”   z4RatelimitTests.test_callable_rate_zero.<locals>._reqí   r¬   r   c                 ó"   — |j         j        rdS dS )NrG   rz   r/   r1   s     r   r¯   z8RatelimitTests.test_callable_rate_zero.<locals>.get_rateò   s   € ØŒ|Ô,ð Ø�uØ�5r   rV   FrW   c                 ó   — | j         S r@   r[   rK   s    r   rL   z4RatelimitTests.test_callable_rate_zero.<locals>.view÷   r]   r   r²   Tr   r³   s       r   Útest_callable_rate_zeroz&RatelimitTests.test_callable_rate_zeroì   s¶   € ð	ð 	ð 	ð
	ð 	ð 	õ
 
�t (°%Ð	8Ñ	8Ô	8ð	#ð 	#ñ 
9Ô	8ð	#ð ˆt�D�D˜eÐ$Ñ$Ô$Ñ%Ô%Ð%Ð%Ð%Ø�4˜˜ $˜™œÑ(Ô(Ð(Ð(Ð(Øˆt�D�D˜d�O‘O”OÑ$Ô$Ð$Ð$Ð$Ð$Ð$r   c                 óž   — d„ }t          ddd¬¦  «        d„ ¦   «         } | |d¬¦  «        ¦  «        sJ ‚ | |d¬¦  «        ¦  «        rJ ‚d S )	Nc                 ód   — t                                d¦  «        }t          | ¬¦  «        |_        |S r§   r©   rª   s     r   r”   z6RatelimitTests.test_callable_rate_import.<locals>._req   r¬   r   r°   z$django_ratelimit.tests.callable_rateFrW   c                 ó   — | j         S r@   r[   rK   s    r   rL   z6RatelimitTests.test_callable_rate_import.<locals>.view  s   € ð ”?Ð"r   r²   Tr   r—   s      r   Útest_callable_rate_importz(RatelimitTests.test_callable_rate_importÿ   s‘   € ð	ð 	ð 	õ
 
�|Ø>Øð
 ñ 
 ô 
 ð	#ð 	#ñ
 ô 
 ð	#ð ˆt�D�D˜eÐ$Ñ$Ô$Ñ%Ô%Ð%Ð%Ð%Ø�4˜˜ $˜™œÑ(Ô(Ð(Ð(Ð(Ð(Ð(r   c                 óX  — d„ }t          ddd¬¦  «        d„ ¦   «         } | |d¬¦  «        ¦  «        rJ ‚ | |d¬¦  «        ¦  «        sJ ‚t                               d¦  «        }t          d	¬
¦  «        |_         | |d	¬¦  «        ¦  «        rJ ‚ | |d	¬¦  «        ¦  «        sJ ‚dS )z)Allow custom functions to set cache keys.c                 ód   — t                                d¦  «        }t          | ¬¦  «        |_        |S r§   r©   rª   s     r   r”   z,RatelimitTests.test_user_or_ip.<locals>._req  r¬   r   r°   rG   FrW   c                 ó   — | j         S r@   r[   rK   s    r   rL   z,RatelimitTests.test_user_or_ip.<locals>.view  r]   r   r²   rN   Tr¨   N)r   rO   rw   r   r0   )r   r”   rL   r«   s       r   Útest_user_or_ipzRatelimitTests.test_user_or_ip  së   € ð	ð 	ð 	õ
 
�|¨%°uÐ	=Ñ	=Ô	=ð	#ð 	#ñ 
>Ô	=ð	#ð �4˜˜ %Ð(Ñ(Ô(Ñ)Ô)Ð)Ð)Ð)Øˆt�D�D˜eÐ$Ñ$Ô$Ñ%Ô%Ð%Ð%Ð%å�wŠw�s‰|Œ|ˆÝ¨4Ð0Ñ0Ô0ˆŒ	à�4˜˜ $˜™œÑ(Ô(Ð(Ð(Ð(Øˆt�D�D˜d�O‘O”OÑ$Ô$Ð$Ð$Ð$Ð$Ð$r   c                 óÐ   — t          ddd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        sJ ‚d S )Nzdjango_ratelimit.tests.mykeyrG   FrW   c                 ó   — | j         S r@   r[   rK   s    r   rL   z3RatelimitTests.test_callable_key_path.<locals>.view$  r]   r   rN   r�   r`   s     r   Útest_callable_key_pathz%RatelimitTests.test_callable_key_path#  su   € Ý	Ð5¸EÈÐ	OÑ	OÔ	Oð	#ð 	#ñ 
PÔ	Oð	#ð �4�Ÿš ™œÑ%Ô%Ð%Ð%Ð%Øˆt•B—G’G˜C‘L”LÑ!Ô!Ð!Ð!Ð!Ð!Ð!r   c                 óÚ   — t          t          dd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        sJ ‚d S )NrG   FrW   c                 ó   — | j         S r@   r[   rK   s    r   rL   z.RatelimitTests.test_callable_key.<locals>.view,  r]   r   rN   )r   r:   rO   rw   r`   s     r   Útest_callable_keyz RatelimitTests.test_callable_key+  ss   € Ý	•u 5°Ð	6Ñ	6Ô	6ð	#ð 	#ñ 
7Ô	6ð	#ð �4�Ÿš ™œÑ%Ô%Ð%Ð%Ð%Øˆt•B—G’G˜C‘L”LÑ!Ô!Ð!Ð!Ð!Ð!Ð!r   c                 ó  — t          ddd„ ¬¦  «        t          ddd„ ¬¦  «        d„ ¦   «         ¦   «         } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        sJ ‚d	S )
zAllow @ratelimit to be stacked.rG   Fc                 ó   — dS )NÚminr"   ©ÚxÚys     r   r¼   z7RatelimitTests.test_stacked_decorator.<locals>.<lambda>7  s   € ¸U€ r   )rH   rY   rX   z10/dc                 ó   — dS )NÚdayr"   rÕ   s     r   r¼   z7RatelimitTests.test_stacked_decorator.<locals>.<lambda>8  s   € ¸e€ r   c                 ó   — | j         S r@   r[   rK   s    r   rL   z3RatelimitTests.test_stacked_decorator.<locals>.view7  r–   r   rN   Nr�   r`   s     r   Útest_stacked_decoratorz%RatelimitTests.test_stacked_decorator3  s™   € õ 
˜ UÐ0BÐ0BÐ	CÑ	CÔ	CÝ	˜ eÐ1CÐ1CÐ	DÑ	DÔ	Dð	#ð 	#ñ 
EÔ	Dñ 
DÔ	Cð	#ð �4�Ÿš ™œÑ%Ô%Ð%Ð%Ð%Øˆt•B—G’G˜C‘L”LÑ!Ô!Ð!Ð!Ð!Ð!Ð!r   c                 ó˜  — t          dddd¬¦  «        t          dddd¬¦  «        d„ ¦   «         ¦   «         } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        sJ ‚ |t                               d¦  «        ¦  «        sJ ‚d	S )
z4Different methods should result in different counts.rG   rV   r…   F)rH   rX   rt   rY   rr   c                 ó   — | j         S r@   r[   rK   s    r   rL   z1RatelimitTests.test_stacked_methods.<locals>.viewA  r–   r   rN   N)r   rO   rP   rw   r`   s     r   Útest_stacked_methodsz#RatelimitTests.test_stacked_methods?  sÓ   € å	˜ 4°¸UÐ	CÑ	CÔ	CÝ	˜ 4°¸eÐ	DÑ	DÔ	Dð	#ð 	#ñ 
EÔ	Dñ 
DÔ	Cð	#ð �4�Ÿš˜s™œÑ$Ô$Ð$Ð$Ð$Ø�4�Ÿš ™œÑ%Ô%Ð%Ð%Ð%Øˆt•B—F’F˜3‘K”KÑ Ô Ð Ð Ð Øˆt•B—G’G˜C‘L”LÑ!Ô!Ð!Ð!Ð!Ð!Ð!r   c                 ó  — t          ddddgdd¬¦  «        d„ ¦   «         }t          ddddgdd¬¦  «        d	„ ¦   «         } |t                               d
¦  «        ¦  «        rJ ‚ |t                               d
¦  «        ¦  «        sJ ‚dS )z&Order of the methods shouldn't matter.rG   rV   r…   rr   rs   F)rH   rX   rt   r2   rY   c                 ó   — | j         S r@   r[   rK   s    r   Úget_postz4RatelimitTests.test_sorted_methods.<locals>.get_postM  r–   r   c                 ó   — | j         S r@   r[   rK   s    r   Úpost_getz4RatelimitTests.test_sorted_methods.<locals>.post_getR  r–   r   rN   Nr_   )r   rá   rã   s      r   Útest_sorted_methodsz"RatelimitTests.test_sorted_methodsK  sÀ   € å	˜ 4°¸°Ø Eð
+ñ 
+ô 
+ð	#ð 	#ñ
+ô 
+ð	#õ 
˜ 4°¸°Ø Eð
+ñ 
+ô 
+ð	#ð 	#ñ
+ô 
+ð	#ð �8�BŸFšF 3™KœKÑ(Ô(Ð(Ð(Ð(Øˆx�Ÿš˜s™œÑ$Ô$Ð$Ð$Ð$Ð$Ð$r   c                 óz  — t          ddd¬¦  «        d„ ¦   «         }|                      d¬¦  «        5  t                               d¦  «        }d	|j        d
<    ||¦  «        rJ ‚ ||¦  «        sJ ‚t                               d¦  «        }d|j        d
<    ||¦  «        rJ ‚	 d d d ¦  «         d S # 1 swxY w Y   d S )NrG   rV   F©rH   rX   rY   c                 ó   — | j         S r@   r[   rK   s    r   rL   z8RatelimitTests.test_ratelimit_full_mask_v4.<locals>.view[  r]   r   é    ©ÚRATELIMIT_IPV4_MASKrN   ú10.1.1.1r6   z10.1.1.2©r   rl   rO   rP   r9   rR   s      r   Útest_ratelimit_full_mask_v4z*RatelimitTests.test_ratelimit_full_mask_v4Z  s  € Ý	˜ 4¨uÐ	5Ñ	5Ô	5ð	#ð 	#ñ 
6Ô	5ð	#ð �]Š]¨rˆ]Ñ2Ô2ð 	!ð 	!Ý—&’&˜‘+”+ˆCØ&0ˆCŒH�]Ñ#Ø�t˜C‘y”yÐ Ð Ð Ø�4˜‘9”9ÐÐÐå—&’&˜‘+”+ˆCØ&0ˆCŒH�]Ñ#Ø�t˜C‘y”yÐ Ð Ð Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ó   ²A0B0Â0B4Â7B4c                 óz  — t          ddd¬¦  «        d„ ¦   «         }|                      d¬¦  «        5  t                               d¦  «        }d	|j        d
<    ||¦  «        rJ ‚ ||¦  «        sJ ‚t                               d¦  «        }d|j        d
<    ||¦  «        rJ ‚	 d d d ¦  «         d S # 1 swxY w Y   d S )NrG   rV   Fræ   c                 ó   — | j         S r@   r[   rK   s    r   rL   z8RatelimitTests.test_ratelimit_full_mask_v6.<locals>.viewj  r]   r   é€   ©ÚRATELIMIT_IPV6_MASKrN   ú2001:db8::1000r6   ú2001:db8::1001rì   rR   s      r   Útest_ratelimit_full_mask_v6z*RatelimitTests.test_ratelimit_full_mask_v6i  s  € Ý	˜ 4¨uÐ	5Ñ	5Ô	5ð	#ð 	#ñ 
6Ô	5ð	#ð �]Š]¨sˆ]Ñ3Ô3ð 	!ð 	!Ý—&’&˜‘+”+ˆCØ&6ˆCŒH�]Ñ#Ø�t˜C‘y”yÐ Ð Ð Ø�4˜‘9”9ÐÐÐå—&’&˜‘+”+ˆCØ&6ˆCŒH�]Ñ#Ø�t˜C‘y”yÐ Ð Ð Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!rî   c                 óÜ  — t          ddd¬¦  «        d„ ¦   «         }|                      d¬¦  «        5  t                               d¦  «        }d	|j        d
<    ||¦  «        rJ ‚ ||¦  «        sJ ‚t                               d¦  «        }d|j        d
<    ||¦  «        sJ ‚t                               d¦  «        }d|j        d
<    ||¦  «        rJ ‚	 d d d ¦  «         d S # 1 swxY w Y   d S )NrG   rV   Fræ   c                 ó   — | j         S r@   r[   rK   s    r   rL   z3RatelimitTests.test_ratelimit_mask_v4.<locals>.viewy  r]   r   é   ré   rN   rë   r6   z10.1.0.1z192.168.1.1rì   rR   s      r   Útest_ratelimit_mask_v4z%RatelimitTests.test_ratelimit_mask_v4x  sI  € Ý	˜ 4¨uÐ	5Ñ	5Ô	5ð	#ð 	#ñ 
6Ô	5ð	#ð �]Š]¨rˆ]Ñ2Ô2ð 	!ð 	!Ý—&’&˜‘+”+ˆCØ&0ˆCŒH�]Ñ#Ø�t˜C‘y”yÐ Ð Ð Ø�4˜‘9”9ÐÐÐå—&’&˜‘+”+ˆCØ&0ˆCŒH�]Ñ#Ø�4˜‘9”9ÐÐÐå—&’&˜‘+”+ˆCØ&3ˆCŒH�]Ñ#Ø�t˜C‘y”yÐ Ð Ð Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ó   ²B!C!Ã!C%Ã(C%c                 óÜ  — t          ddd¬¦  «        d„ ¦   «         }|                      d¬¦  «        5  t                               d¦  «        }d	|j        d
<    ||¦  «        rJ ‚ ||¦  «        sJ ‚t                               d¦  «        }d|j        d
<    ||¦  «        sJ ‚t                               d¦  «        }d|j        d
<    ||¦  «        rJ ‚	 d d d ¦  «         d S # 1 swxY w Y   d S )NrG   rV   Fræ   c                 ó   — | j         S r@   r[   rK   s    r   rL   z3RatelimitTests.test_ratelimit_mask_v6.<locals>.viewŒ  r]   r   é@   rò   rN   rô   r6   rõ   z2001:db9::1000rì   rR   s      r   Útest_ratelimit_mask_v6z%RatelimitTests.test_ratelimit_mask_v6‹  sI  € Ý	˜ 4¨uÐ	5Ñ	5Ô	5ð	#ð 	#ñ 
6Ô	5ð	#ð �]Š]¨rˆ]Ñ2Ô2ð 	!ð 	!Ý—&’&˜‘+”+ˆCØ&6ˆCŒH�]Ñ#Ø�t˜C‘y”yÐ Ð Ð Ø�4˜‘9”9ÐÐÐå—&’&˜‘+”+ˆCØ&6ˆCŒH�]Ñ#Ø�4˜‘9”9ÐÐÐå—&’&˜‘+”+ˆCØ&6ˆCŒH�]Ñ#Ø�t˜C‘y”yÐ Ð Ð Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!rû   N)r   r    r!   rD   rT   ra   rf   rm   rp   rx   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>   7   s¾  € € € € € ðð ð ðð ð ð>ð >ð >ð?ð ?ð ?ðð ð ðð ð ð@ð @ð @ð+ð +ð +ð/ð /ð /ð0ð 0ð 0ðð ð ð@ð @ð @ð#ð #ð #ð(ð (ð (ð%ð %ð %ð*0ð 0ð 0ð"%ð %ð %ð&)ð )ð )ð%ð %ð %ð*"ð "ð "ð"ð "ð "ð
"ð 
"ð 
"ð
"ð 
"ð 
"ð%ð %ð %ð!ð !ð !ð!ð !ð !ð!ð !ð !ð&!ð !ð !ð !ð !r   r>   c                   ó8   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚFunctionsTestsc                 ó,   — t          j        ¦   «          d S r@   rA   rC   s    r   rD   zFunctionsTests.setUp   rE   r   c                 óâ   — t          t          ddt          j        dd¬¦  «        } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚d S )NFrG   rV   rs   ©Ú	incrementrH   rt   rX   r2   rN   ©r   r   ÚALLrO   rP   ©r   Únot_increments     r   Útest_is_ratelimitedz"FunctionsTests.test_is_ratelimited£  ss   € Ý¥¸%ÀeÝ'5Ô'9¸tÈ3ðPñ Pô Pˆð
 !�=¥§¢¨¡¤Ñ-Ô-Ð-Ð-Ð-ð !�=¥§¢¨¡¤Ñ-Ô-Ð-Ð-Ð-Ð-Ð-r   c                 óâ   — t          t          ddt          j        dd¬¦  «        } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        sJ ‚d S )NTrG   rV   rs   r  rN   r  ©r   Údo_increments     r   Útest_is_ratelimited_incrementz,FunctionsTests.test_is_ratelimited_increment¯  ss   € Ý�~¸ÀEÝ&4Ô&8¸dÈ#ðOñ Oô Oˆð  �<¥§¢ s¡¤Ñ,Ô,Ð,Ð,Ð,ð ˆ|�BŸFšF 3™KœKÑ(Ô(Ð(Ð(Ð(Ð(Ð(r   c                 óp  — t          t          t          j        ddd¬¦  «        } |t                               d¦  «        ¦  «        }|                      |d         d¦  «         |                      |d         d	¦  «         |                      |d
         d¦  «         |                      |d         ¦  «         d S )NrV   rG   rs   ©rt   rX   rH   r2   rN   Úcountr   Úlimitr   Ú	time_leftr)   Úshould_limit)r   r   r  rO   rP   ÚassertEqualÚassertLessEqualÚassertFalse©r   Ú
_get_usageÚusages      r   Útest_get_usagezFunctionsTests.test_get_usage¹  sª   € Ý�Y­y¬}À$Ø"'¨sð4ñ 4ô 4ˆ
à�
�2Ÿ6š6 #™;œ;Ñ'Ô'ˆà×Ò˜˜wœ¨Ñ+Ô+Ð+Ø×Ò˜˜wœ¨Ñ+Ô+Ð+Ø×Ò˜U ;Ô/°Ñ4Ô4Ð4Ø×Ò˜˜~Ô.Ñ/Ô/Ð/Ð/Ð/r   c                 ó¸  — t          t          t          j        dddd¬¦  «        } |t                               d¦  «        ¦  «          |t                               d¦  «        ¦  «        }|                      |d         d¦  «         |                      |d	         d
¦  «         |                      |d         d¦  «         |                      |d         ¦  «         d S )NrV   rG   rs   T)rt   rX   rH   r2   r  rN   r  r®   r  r   r  r)   r  ©r   r   r  rO   rP   r  r  Ú
assertTruer  s      r   Útest_get_usage_incrementz'FunctionsTests.test_get_usage_incrementÃ  sÇ   € Ý�Y­y¬}À$Ø"'¨s¸dðDñ Dô Dˆ
àˆ
•2—6’6˜#‘;”;ÑÔÐØ�
�2Ÿ6š6 #™;œ;Ñ'Ô'ˆà×Ò˜˜wœ¨Ñ+Ô+Ð+Ø×Ò˜˜wœ¨Ñ+Ô+Ð+Ø×Ò˜U ;Ô/°Ñ4Ô4Ð4Ø�Š˜˜nÔ-Ñ.Ô.Ð.Ð.Ð.r   c                 ó  — t          t          t          j        ddd¬¦  «        } |t                               d¦  «        d¬¦  «          |t                               d¦  «        d¬¦  «          |t                               d¦  «        ¦  «        }|                      |d         d	¦  «         |                      |d
         d¦  «         |                      |d         d¦  «         |                      |d         ¦  «         d S )NrV   rG   rs   r  rN   T)r  r  r®   r  r   r  r)   r  r  r  s      r   Ú"test_not_increment_after_incrementz1FunctionsTests.test_not_increment_after_incrementÎ  sæ   € Ý�Y­y¬}À$Ø"'¨sð4ñ 4ô 4ˆ
àˆ
•2—6’6˜#‘;”;¨$Ð/Ñ/Ô/Ð/Øˆ
•2—6’6˜#‘;”;¨$Ð/Ñ/Ô/Ð/Ø�
�2Ÿ6š6 #™;œ;Ñ'Ô'ˆà×Ò˜˜wœ¨Ñ+Ô+Ð+Ø×Ò˜˜wœ¨Ñ+Ô+Ð+Ø×Ò˜U ;Ô/°Ñ4Ô4Ð4Ø�Š˜˜nÔ-Ñ.Ô.Ð.Ð.Ð.r   c                 ó¾   — |                       t          ¦  «        5  t          t                               d¦  «        d¬¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NrN   rV   )rX   )rQ   r   r   rO   rP   rC   s    r   Ú)test_get_usage_called_without_group_or_fnz8FunctionsTests.test_get_usage_called_without_group_or_fnÚ  s˜   € Ø×ÒÕ3Ñ4Ô4ð 	-ð 	-Ý•b—f’f˜S‘k”k tÐ,Ñ,Ô,Ð,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-s   ›*AÁAÁAN)
r   r    r!   rD   r
  r  r  r  r!  r#  r"   r   r   r  r  Ÿ  s}   € € € € € ðð ð ð
.ð 
.ð 
.ð)ð )ð )ð0ð 0ð 0ð	/ð 	/ð 	/ð
/ð 
/ð 
/ð-ð -ð -ð -ð -r   r  c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚRatelimitCBVTestsc                 ó,   — t          j        ¦   «          d S r@   rA   rC   s    r   rD   zRatelimitCBVTests.setUpà  rE   r   c                 óè   —  G d„ dt           ¦  «        }|                     ¦   «         } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        sJ ‚d S )Nc                   óN   — e Zd Z e eddd¬¦  «        ¦  «        d„ ¦   «         ZdS )ú9RatelimitCBVTests.test_method_decorator.<locals>.TestViewrV   rG   FrW   c                 ó   — |j         S r@   r[   ©r   r3   s     r   rw   z>RatelimitCBVTests.test_method_decorator.<locals>.TestView.postå  s
   € à”Ð&r   N)r   r    r!   r
   r   rw   r"   r   r   ÚTestViewr)  ä  sK   € € € € € ØÐ˜i˜i¨D°uÀEÐJÑJÔJÑKÔKð'ð 'ñ LÔKð'ð 'ð 'r   r,  rN   )r   Úas_viewrO   rw   ©r   r,  rL   s      r   Útest_method_decoratorz'RatelimitCBVTests.test_method_decoratorã  s…   € ð	'ð 	'ð 	'ð 	'ð 	'•tñ 	'ô 	'ð 	'ð
 ×ÒÑ!Ô!ˆà�4�Ÿš ™œÑ%Ô%Ð%Ð%Ð%Øˆt•B—G’G˜C‘L”LÑ!Ô!Ð!Ð!Ð!Ð!Ð!r   c                 ó6  — t          t          ddd¬¦  «        d¬¦  «         G d„ dt          ¦  «        ¦   «         }|                     ¦   «         } |t                               d	¦  «        ¦  «        rJ ‚ |t                               d	¦  «        ¦  «        sJ ‚d S )
NrV   rG   FrW   rP   )Únamec                   ó   — e Zd Zd„ ZdS )ú8RatelimitCBVTests.test_class_decorator.<locals>.TestViewc                 ó   — |j         S r@   r[   r+  s     r   rP   z<RatelimitCBVTests.test_class_decorator.<locals>.TestView.getò  ó
   € Ø”Ð&r   N©r   r    r!   rP   r"   r   r   r,  r3  ï  s#   € € € € € ð'ð 'ð 'ð 'ð 'r   r,  rN   )r
   r   r   r-  rO   rP   r.  s      r   Útest_class_decoratorz&RatelimitCBVTests.test_class_decoratorî  sµ   € Ý	�)¨°5ÀÐFÑFÔFØ$ð
&ñ 
&ô 
&ð	'ð 	'ð 	'ð 	'ð 	'•tñ 	'ô 	'ñ
&ô 
&ð	'ð ×ÒÑ!Ô!ˆà�4�Ÿš˜s™œÑ$Ô$Ð$Ð$Ð$Øˆt•B—F’F˜3‘K”KÑ Ô Ð Ð Ð Ð Ð r   c                 ó  —  G d„ dt           ¦  «        }|                     ¦   «         } t          ddd¬¦  «        |¦  «        } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        sJ ‚d S )Nc                   ó   — e Zd Zd„ ZdS )ú2RatelimitCBVTests.test_wrap_view.<locals>.TestViewc                 ó   — |j         S r@   r[   r+  s     r   rP   z6RatelimitCBVTests.test_wrap_view.<locals>.TestView.getü  r5  r   Nr6  r"   r   r   r,  r:  û  s#   € € € € € ð'ð 'ð 'ð 'ð 'r   r,  rV   rG   FrW   rN   )r   r-  r   rO   rP   )r   r,  rL   Úwrappeds       r   Útest_wrap_viewz RatelimitCBVTests.test_wrap_viewú  s£   € ð	'ð 	'ð 	'ð 	'ð 	'•tñ 	'ô 	'ð 	'ð ×ÒÑ!Ô!ˆØ>•) ¨5¸Ð>Ñ>Ô>¸tÑDÔDˆà�7�2Ÿ6š6 #™;œ;Ñ'Ô'Ð'Ð'Ð'Øˆw•r—v’v˜c‘{”{Ñ#Ô#Ð#Ð#Ð#Ð#Ð#r   c                 ó2  —  G d„ dt           ¦  «        }|                     ¦   «         } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        sJ ‚ |t                               d¦  «        ¦  «        rJ ‚d S )Nc                   ó’   — e Zd Z e edddd¬¦  «        ¦  «        d„ ¦   «         Z e edddd¬¦  «        ¦  «        d„ ¦   «         Zd	S )
úCRatelimitCBVTests.test_methods_counted_separately.<locals>.TestViewrV   rG   r…   Fr†   c                 ó   — |j         S r@   r[   r+  s     r   rP   zGRatelimitCBVTests.test_methods_counted_separately.<locals>.TestView.get  ó   € ð ”Ð&r   rr   c                 ó   — |j         S r@   r[   r+  s     r   rw   zHRatelimitCBVTests.test_methods_counted_separately.<locals>.TestView.post  rB  r   N)r   r    r!   r
   r   rP   rw   r"   r   r   r,  r@    s®   € € € € € ØÐ˜i˜i¨D°uØ/4¸EðCñ Cô Cñ Dô Dð'ð 'ñDô Dð'ð Ð˜i˜i¨D°uØ/5¸UðDñ Dô Dñ Eô Eð'ð 'ñEô Eð'ð 'ð 'r   r,  rN   )r   r-  rO   rP   rw   r.  s      r   Útest_methods_counted_separatelyz1RatelimitCBVTests.test_methods_counted_separately  s¥   € ð		'ð 		'ð 		'ð 		'ð 		'•tñ 		'ô 		'ð 		'ð ×ÒÑ!Ô!ˆà�4�Ÿš˜s™œÑ$Ô$Ð$Ð$Ð$Øˆt•B—F’F˜3‘K”KÑ Ô Ð Ð Ð Ø�4�Ÿš ™œÑ%Ô%Ð%Ð%Ð%Ð%Ð%r   c                 ó€  —  G d„ dt           ¦  «        } G d„ dt           ¦  «        }|                     ¦   «         }|                     ¦   «         } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        sJ ‚ |t                               d¦  «        ¦  «        rJ ‚d S )Nc                   óP   — e Zd Z e edddd¬¦  «        ¦  «        d„ ¦   «         ZdS )úARatelimitCBVTests.test_views_counted_separately.<locals>.TestViewrV   rG   r…   Fr†   c                 ó   — |j         S r@   r[   r+  s     r   rP   zERatelimitCBVTests.test_views_counted_separately.<locals>.TestView.get  rB  r   N©r   r    r!   r
   r   rP   r"   r   r   r,  rG    ó`   € € € € € ØÐ˜i˜i¨D°uØ/4¸EðCñ Cô Cñ Dô Dð'ð 'ñDô Dð'ð 'ð 'r   r,  c                   óP   — e Zd Z e edddd¬¦  «        ¦  «        d„ ¦   «         ZdS )úHRatelimitCBVTests.test_views_counted_separately.<locals>.AnotherTestViewrV   rG   r…   Fr†   c                 ó   — |j         S r@   r[   r+  s     r   rP   zLRatelimitCBVTests.test_views_counted_separately.<locals>.AnotherTestView.get  rB  r   NrI  r"   r   r   ÚAnotherTestViewrL    rJ  r   rN  rN   )r   r-  rO   rP   )r   r,  rN  Ú	test_viewÚanother_views        r   Útest_views_counted_separatelyz/RatelimitCBVTests.test_views_counted_separately  sà   € ð	'ð 	'ð 	'ð 	'ð 	'•tñ 	'ô 	'ð 	'ð	'ð 	'ð 	'ð 	'ð 	'�dñ 	'ô 	'ð 	'ð ×$Ò$Ñ&Ô&ˆ	Ø&×.Ò.Ñ0Ô0ˆà�9�RŸVšV C™[œ[Ñ)Ô)Ð)Ð)Ð)Øˆy�Ÿš ™œÑ%Ô%Ð%Ð%Ð%Ø�<¥§¢ s¡¤Ñ,Ô,Ð,Ð,Ð,Ð,Ð,r   N)	r   r    r!   rD   r/  r7  r=  rD  rQ  r"   r   r   r%  r%  ß  sn   € € € € € ðð ð ð	"ð 	"ð 	"ð
!ð 
!ð 
!ð	$ð 	$ð 	$ð&ð &ð &ð$-ð -ð -ð -ð -r   r%  c                   ó6  — e Zd Z ed¬¦  «        d„ ¦   «         Z ed¬¦  «        d„ ¦   «         Z edd¬¦  «        d„ ¦   «         Z ed¬¦  «        d	„ ¦   «         Z ed¬¦  «        d
„ ¦   «         Z ed¬¦  «        d„ ¦   «         Z	 ed¬¦  «        d„ ¦   «         Z
dS )ÚCacheFailTestsz
fake-cache)ÚRATELIMIT_USE_CACHEc                 óè   — t          ddd¬¦  «        d„ ¦   «         }|                      t          ¦  «        5   |t                               d¦  «        ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NrV   rG   FrW   c                 ó   — | j         S r@   r[   rK   s    r   rL   z+CacheFailTests.test_bad_cache.<locals>.view/  r]   r   rN   )r   rQ   r   rO   rw   r`   s     r   Útest_bad_cachezCacheFailTests.test_bad_cache-  sÀ   € å	�t %¨uÐ	5Ñ	5Ô	5ð	#ð 	#ñ 
6Ô	5ð	#ð ×ÒÕ7Ñ8Ô8ð 	ð 	ØˆD•—’˜‘”ÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ¶$A'Á'A+Á.A+zconnection-errorsc                 ó†   — t          ddd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        sJ ‚d S )NrV   z10/mFrW   c                 ó   — | j         S r@   r[   rK   s    r   rL   zACacheFailTests.test_limit_on_cache_connection_error.<locals>.view8  r]   r   rN   r�   r`   s     r   Ú$test_limit_on_cache_connection_errorz3CacheFailTests.test_limit_on_cache_connection_error6  sS   € å	�t &°Ð	6Ñ	6Ô	6ð	#ð 	#ñ 
7Ô	6ð	#ð ˆt•B—G’G˜C‘L”LÑ!Ô!Ð!Ð!Ð!Ð!Ð!r   T)rT  ÚRATELIMIT_FAIL_OPENc                 óÐ   — t          ddd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        rJ ‚ |t                               d¦  «        ¦  «        rJ ‚d S )NrV   rG   FrW   c                 ó   — | j         S r@   r[   rK   s    r   rL   z3CacheFailTests.test_fail_open_setting.<locals>.viewA  r]   r   rN   r_   r`   s     r   Útest_fail_open_settingz%CacheFailTests.test_fail_open_setting>  su   € õ 
�t %¨uÐ	5Ñ	5Ô	5ð	#ð 	#ñ 
6Ô	5ð	#ð �4�Ÿš˜s™œÑ$Ô$Ð$Ð$Ð$Ø�4�Ÿš˜s™œÑ$Ô$Ð$Ð$Ð$Ð$Ð$r   c                 ó    — d„ } |t                                d¦  «        ¦  «        rJ ‚ |t                                d¦  «        ¦  «        rJ ‚d S )Nc                 ó@   — t          | dt           j        ddd¬¦  «        S )NFrV   rG   rs   ©r  rt   rX   rH   r2   ©r   r  rK   s    r   r	  zbCacheFailTests.test_is_ratelimited_cache_connection_error_without_increment.<locals>.not_incrementJ  s*   € Ý! '°UÝ)7Ô);ÀØ',°Cð9ñ 9ô 9ð 9r   rN   ©rO   rP   r  s     r   Ú<test_is_ratelimited_cache_connection_error_without_incrementzKCacheFailTests.test_is_ratelimited_cache_connection_error_without_incrementH  sY   € ð	9ð 	9ð 	9ð
 !�=¥§¢¨¡¤Ñ-Ô-Ð-Ð-Ð-Ø �=¥§¢¨¡¤Ñ-Ô-Ð-Ð-Ð-Ð-Ð-r   c                 ó    — d„ } |t                                d¦  «        ¦  «        sJ ‚ |t                                d¦  «        ¦  «        sJ ‚d S )Nc                 ó@   — t          | dt           j        ddd¬¦  «        S ©NTrV   rG   rs   ra  rb  rK   s    r   r  z^CacheFailTests.test_is_ratelimited_cache_connection_error_with_increment.<locals>.do_incrementT  ó*   € Ý! '°TÝ)7Ô);ÀØ',°Cð9ñ 9ô 9ð 9r   rN   rc  r  s     r   Ú9test_is_ratelimited_cache_connection_error_with_incrementzHCacheFailTests.test_is_ratelimited_cache_connection_error_with_incrementR  óY   € ð	9ð 	9ð 	9ð
 ˆ|�BŸFšF 3™KœKÑ(Ô(Ð(Ð(Ð(Øˆ|�BŸFšF 3™KœKÑ(Ô(Ð(Ð(Ð(Ð(Ð(r   zconnection-errors-redisc                 ó    — d„ } |t                                d¦  «        ¦  «        sJ ‚ |t                                d¦  «        ¦  «        sJ ‚d S )Nc                 ó@   — t          | dt           j        ddd¬¦  «        S rg  rb  rK   s    r   r  zdCacheFailTests.test_is_ratelimited_cache_connection_error_with_increment_redis.<locals>.do_increment^  rh  r   rN   rc  r  s     r   Ú?test_is_ratelimited_cache_connection_error_with_increment_rediszNCacheFailTests.test_is_ratelimited_cache_connection_error_with_increment_redis\  rj  r   zinstant-expirationc                 óÎ   — t          dd¬¦  «        d„ ¦   «         } |t                               d¦  «        ¦  «        sJ ‚ |t                               d¦  «        ¦  «        sJ ‚d S )NrV   rG   rc   c                 ó   — dS rJ   r"   rK   s    r   rL   z/CacheFailTests.test_cache_timeout.<locals>.viewh  rM   r   rN   r_   r`   s     r   Útest_cache_timeoutz!CacheFailTests.test_cache_timeoutf  sq   € å	�t %Ð	(Ñ	(Ô	(ð	ð 	ñ 
)Ô	(ð	ð ˆt•B—F’F˜3‘K”KÑ Ô Ð Ð Ð Øˆt•B—F’F˜3‘K”KÑ Ô Ð Ð Ð Ð Ð r   N)r   r    r!   r	   rW  rZ  r^  rd  ri  rm  rp  r"   r   r   rS  rS  ,  sN  € € € € € ØÐ¨<Ð8Ñ8Ô8ðð ñ 9Ô8ðð ÐÐ+>Ð?Ñ?Ô?ð"ð "ñ @Ô?ð"ð ÐÐ+>Ø+/ð1ñ 1ô 1ð%ð %ñ1ô 1ð%ð ÐÐ+>Ð?Ñ?Ô?ð.ð .ñ @Ô?ð.ð ÐÐ+>Ð?Ñ?Ô?ð)ð )ñ @Ô?ð)ð ÐÐ+DÐEÑEÔEð)ð )ñ FÔEð)ð ÐÐ+?Ð@Ñ@Ô@ð!ð !ñ AÔ@ð!ð !ð !r   rS  c                 ó   — | j         d         S )NÚMY_THINGr8   r“   s    r   Úmy_iprs  p  s   € ØŒ8�JÔÐr   c                   óÂ   — e Zd Zd„ Z ed¬¦  «        d„ ¦   «         Z ed¬¦  «        d„ ¦   «         Z ed¬¦  «        d„ ¦   «         Z ee¬¦  «        d	„ ¦   «         Z	d
„ Z
dS )ÚIpMetaTestsc                 óx   — t                                d¦  «        }d|j        d<   dt          |¦  «        k    sJ ‚d S ©NrN   r‘   r6   ©rO   rP   r9   r   ©r   rS   s     r   Útest_defaultzIpMetaTests.test_defaultu  s:   € Ý�fŠf�S‰kŒkˆØ"+ˆŒ�Ñà�G C™LœLÒ(Ð(Ð(Ð(Ð(Ð(r   Úfake)ÚRATELIMIT_IP_META_KEYc                 óÒ   — t                                d¦  «        }d|j        d<   |                      t          ¦  «        5  t          |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S rw  ©rO   rP   r9   rQ   r   r   ry  s     r   Útest_bad_configzIpMetaTests.test_bad_config{  s¡   € å�fŠf�S‰kŒkˆØ"+ˆŒ�Ñà×ÒÕ3Ñ4Ô4ð 	ð 	Ý�C‰LŒLˆLð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ó   ¿AÁA Á#A ÚHTTP_X_CLIENT_IPc                 óŒ   — t                                d¦  «        }d|j        d<   d|j        d<   dt          |¦  «        k    sJ ‚d S )NrN   r‘   r6   ú5.6.7.8r�  rx  ry  s     r   Útest_alternate_headerz!IpMetaTests.test_alternate_headerƒ  sG   € å�fŠf�S‰kŒkˆØ"+ˆŒ�ÑØ'0ˆŒÐ#Ñ$à�G C™LœLÒ(Ð(Ð(Ð(Ð(Ð(r   zdjango_ratelimit.tests.my_ipc                 óŒ   — t                                d¦  «        }d|j        d<   d|j        d<   dt          |¦  «        k    sJ ‚d S ©NrN   r‘   r6   rƒ  rr  rx  ry  s     r   Útest_path_to_ip_key_callablez(IpMetaTests.test_path_to_ip_key_callable‹  óF   € å�fŠf�S‰kŒkˆØ"+ˆŒ�ÑØ(ˆŒ�Ñà�G C™LœLÒ(Ð(Ð(Ð(Ð(Ð(r   c                 óŒ   — t                                d¦  «        }d|j        d<   d|j        d<   dt          |¦  «        k    sJ ‚d S r†  rx  ry  s     r   Útest_callable_ip_keyz IpMetaTests.test_callable_ip_key“  rˆ  r   c                 óÒ   — t                                d¦  «        }d|j        d<   |                      t          ¦  «        5  t          |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NrN   rk   r6   r~  ry  s     r   Útest_empty_ipzIpMetaTests.test_empty_ip›  s¡   € Ý�fŠf�S‰kŒkˆØ"$ˆŒ�Ñà×ÒÕ3Ñ4Ô4ð 	ð 	Ý�C‰LŒLˆLð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	r€  N)r   r    r!   rz  r	   r  r„  r‡  rs  rŠ  rŒ  r"   r   r   ru  ru  t  sÞ   € € € € € ð)ð )ð )ð Ð¨VÐ4Ñ4Ô4ðð ñ 5Ô4ðð ÐÐ-?Ð@Ñ@Ô@ð)ð )ñ AÔ@ð)ð ÐÐ-KÐLÑLÔLð)ð )ñ MÔLð)ð Ð¨UÐ3Ñ3Ô3ð)ð )ñ 4Ô3ð)ðð ð ð ð r   ru  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   rO   r   r$   r4   r:   Ú	Exceptionr<   r>   r  r%  rS  rs  ru  r"   r   r   ú<module>r˜     sŸ  ðØ Ð Ð Ð Ð Ð à =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø /Ð /Ð /Ð /Ð /Ð /Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø %Ð %Ð %Ð %Ð %Ð %à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ð9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð €^ÑÔ€ð.ð .ð .ð .ð .ñ .ô .ð .ð'ð 'ð 'ð 'ð '�xñ 'ô 'ð 'ð ð ð ð-ð -ð -ð	ð 	ð 	ð 	ð 	 ñ 	ô 	ð 	ðe!ð e!ð e!ð e!ð e!�Xñ e!ô e!ð e!ðP=-ð =-ð =-ð =-ð =-�Xñ =-ô =-ð =-ð@J-ð J-ð J-ð J-ð J-˜ñ J-ô J-ð J-ðZA!ð A!ð A!ð A!ð A!�Xñ A!ô A!ð A!ðH ð  ð  ð,ð ,ð ,ð ,ð ,�(ñ ,ô ,ð ,ð ,ð ,r   