
    g_                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlZd dl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  ed       G d de             Zd Z d Z!d Z"y)    N)BytesIO)callpatch)Image)
LogCapture)
management)ImproperlyConfigured)TestCaseoverride_settings)reverse)timezone)gettext_lazy)settings)CaptchaStorezcaptcha.tests.urls)ROOT_URLCONFc                       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 ed      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&y%)&CaptchaCasec                    i | _         t        j                  | _        t        j                  | _        g d}t        j                  j                  d      r8dt        _        dt        _        |j                  d       |j                  d       |D ]s  } t        j                  |             \  }}t        j                  j                  ||      \  | j                   |j                  dd      d	   j                  d
d      <   }u  t        j                                 \  }}t        j                  j                  ||      \  | j                   d<   }| j                   d   | _        y )N)captcha.helpers.math_challengez%captcha.helpers.random_char_challengez!captcha.helpers.unicode_challengez/usr/share/dict/wordsz;-,.zcaptcha.helpers.word_challengez4captcha.helpers.huge_words_and_punctuation_challenge	challengeresponse.   
_challenge_storedefault_store)storesr   CAPTCHA_WORDS_DICTIONARY)_CaptchaCase__current_settings_dictionaryCAPTCHA_PUNCTUATION*_CaptchaCase__current_settings_punctuationospathexistsappend_callable_from_stringr   objectsget_or_creatersplitreplaceget_challenger   )selftested_helpershelperr   r   _s         V/var/www/html/brdwt/brdwt/brdwtenv/lib/python3.12/site-packages/captcha/tests/tests.pysetUpzCaptchaCase.setUp   sG   -5-N-N*.6.J.J+

 77>>120GH-+1H(!!"BC!!F % 	F"H("@"@"H"JIx $$22#h 3 FMM#q1"5==lHUV		 7h4468	8*6*>*>*L*L( +M +
'O$a "[[9    c                 X    | j                   t        _        | j                  t        _        y N)r!   r   r    r#   r"   r.   s    r2   tearDownzCaptchaCase.tearDown8   s    ,0,N,N)'+'J'J$r4   c                 b     | j                   |j                  j                  |      g|i | y r6   )assertFormErrorcontextget)r.   r   	form_nameargskwargss        r2   _assertFormErrorzCaptchaCase._assertFormError<   s-    X--11)<NtNvNr4   c                     t        j                  dt        |j                              d   }t        j
                  j                  |      j                  }||fS )Nvalue="([0-9a-f]+)"r   hashkey)refindallstrcontentr   r)   r<   r   r.   rhash_r   s       r2   __extract_hash_and_responsez'CaptchaCase.__extract_hash_and_response?   sI    

13qyy>B1E''++E+:CChr4   c           	      ~   | j                   j                         D cg c]  }|j                   c}D ]  }| j                  j	                  t        dt        |                  }| j                  |j                  d       | j                  |j                  d             | j                  |d   d        y c c}w )Ncaptcha-imagekeyr?      content-type	image/png)r   valuesrD   clientr<   r   dictassertEqualstatus_code
assertTrue
has_headerr.   storerP   r   s       r2   
test_imagezCaptchaCase.test_imageD   s    /3{{/A/A/CDeEMMD 	DC{{wtPS}'UVHX1137OOH//?@Xn5{C		DDs   B:c           	      @   t         j                  sy | j                  j                  d      j                  | j                  j                  d      j                  | j
                  j                  fD ]  }| j                  j                  t        dt        |                  }| j                  |j                  d       | j                  |j                  j                  dkD         | j                  |j                  d             | j                  |d   d        y )	N
math_storezcaptcha-audiorO   rQ   rR   i   rS   z	audio/wav)r   CAPTCHA_FLITE_PATHr   r<   rD   r   rV   r   rW   rX   rY   rZ   ranged_filesizer[   )r.   rP   r   s      r2   
test_audiozCaptchaCase.test_audioK   s    **KKOOL)11KKOOL)11&&
 		DC
 {{wtPS}'UVHX1137OOH0055<=OOH//?@Xn5{C		Dr4   c           	         | j                   j                  t        d            }| j                  |j                  d       | j                  |      \  }}| j                   j                  t        d      t        ||dd            }| j                  |j                  d       | j                  t        |j                        j                  d      dkD         | j                   j                  t        d      t        ||dd            }| j                  |j                  d       | j                  t        |j                        j                  d      dkD         y )Ncaptcha-testrR   xxxasasd@asdasd.com	captcha_0	captcha_1subjectsenderForm validatedr   rV   r<   r   rX   rY   '_CaptchaCase__extract_hash_and_responsepostrW   rZ   rG   rH   findassertFalserI   s       r2   test_form_submitzCaptchaCase.test_form_submitY   s   KKOOGN34,::1=xKKN#")	
 	,AII++,<=ABKKN#")	
 	,QYY,,-=>BCr4   c           	         | j                   j                  t        d            }| j                  |j                  d       | j                  |      \  }}| j                   j                  t        d      t        ||dd            }| j                  |j                  d       | j                  t        |j                        j                  d      dkD         | j                   j                  t        d      t        ||dd            }| j                  |j                  d       | j                  t        |j                        j                  d      dkD         y )Ncaptcha-test-model-formrR   rg   rh   ri   rn   r   ro   rI   s       r2   test_modelformzCaptchaCase.test_modelformv   s   KKOOG$=>?,::1=xKK-.")	
 	,AII++,<=ABKK-.")	
 	,QYY,,-=>BCr4   c           
      0   dD ]  }| j                   j                  t        |            }| j                  |j                  d       | j                   j                  t        |      t        dddd            }| j                  |dd	t        d
              y )Nrf   rv   rR   abcwrong responserg   rh   ri   formcaptchaInvalid CAPTCHA	rV   r<   r   rX   rY   rq   rW   r@   r   )r.   urlnamerJ   s      r2   test_wrong_submitzCaptchaCase.test_wrong_submit   s    B 	YG 01AQ]]C0   #.!-	A !!!VYEV8WX	Yr4   c           	      h   t        j                         t        j                  d      z
  | j                  _        | j                  j                          | j                  j                  }| j                  j                  t        d      t        || j                  j                  dd            }| j                  |j                  d       | j                  dt!        |j"                        v        	 t$        j&                  j)                  |	       | j+                          y # t,        $ r Y y w xY w)
N   )minutesrf   rg   rh   ri   rR   rn   rC   )r   nowdatetime	timedeltar   
expirationsaverD   rV   rq   r   rW   r   rX   rY   rs   rG   rH   r   r)   r<   fail	Exception)r.   rK   rJ   s      r2   test_deleted_expiredz CaptchaCase.test_deleted_expired   s    (09K9KTU9V(V%!""**KKN#,,55)	
 	,)S^;<	  $$U$3IIK 		s   40D% %	D10D1c                    | j                   j                  t        d            }| j                  |j                  d       | j                   j                  t        d      t        dd            }| j                  |ddd       | j                   j                  t        d      t        dd	            }| j                  |ddt        d
             y )Nz!captcha-test-custom-error-messagerR   rz   r{   )rj   rk   r|   r}   zTEST CUSTOM ERROR MESSAGE zThis field is required.r   r.   rJ   s     r2   test_custom_error_messagez%CaptchaCase.test_custom_error_message   s    KKOOG$GHI,KK785,<=
 	a4OPKK785B/
 	vy,/H"I	
r4   c                     t         j                  j                  dd       	 t         j                  j                  dd       y # t        $ r | j	                          Y y w xY w)Nrg   r   )r   r)   creater   r   r7   s    r2   test_repeated_challengez#CaptchaCase.test_repeated_challenge   sQ    ##ee#D	  ''%%'H 	IIK	s   !A A! A!*captcha.tests.tests.random_color_challengec                 &   d|_         t        j                  }dt        _        dt        _         t        j                                \  }}t
        j                  j                  ||      \  }}| j                  j                  t        dt        |j                                    }|j                  dk(  sJ g }t        |      D ]   \  }	}
|j                  t!        |	|             " |j#                  |d	
       d t        _        |t        _        y )N#ffffffr   z)captcha.tests.tests.random_char_challenger   rN   rO   rQ   rR   T)	any_order)return_valuer   CAPTCHA_CHALLENGE_FUNCTCAPTCHA_LETTER_COLOR_FUNCTr-   r   r)   r*   rV   r<   r   rW   rD   rY   	enumerater'   r   assert_has_calls)r.   color_challenge_func_mock_current_captcha_challenge_funcr   r   r   r1   	_response_callsindexchars              r2   test_custom_letters_colorz%CaptchaCase.test_custom_letters_color   s    1:!.*2*J*J' 9 	+ ,W(6h4468	8 ((66( 7 
	 KKOOODV^^,DE
	 $$+++$Y/ 	2KE4MM$ui01	2!226T2J.2++J(r4   c           
      <   t         j                  }dD ]<  }dt         _        | j                  j                  t	        |            }| j                  j                  t	        |            }| j                  |j                  d       | j                  |j                  d       t        j                  dt        |j                              r-t        j                  dt        |j                              d   }n| j                          t        j                  dt        |j                              r-t        j                  dt        |j                              d   }n| j                          	 t        j                  j                        }t        j                  j                        }| j                  j                   j                   k7         | j                  |j"                  |j"                  k(         | j                  k7         | j                  j%                  t	        |      t'        ||j"                  dd	            }| j                  |j                  d       | j                  t        |j                        j)                  d
      dkD         	 t        j                  j                  |      }| j                  j%                  t	        |      t'        ||j"                  dd	            }| j                  |j                  d       | j                  t        |j                        j)                  d
      dkD         ? |t         _        y # t        $ r | j                          Y w xY w# t        $ r | j                          Y w xY w)Nry   zcaptcha.tests.trivial_challengerR   rB   r   rC   rg   rh   ri   rn   )r   r   rV   r<   r   rX   rY   rE   rF   rG   rH   r   r   r)   r   rZ   pkr   rq   rW   rr   )	r.   (_CaptchaCase__current_challange_functionr   r1r2hash_1hash_2store_1store_2s	            r2   #test_repeated_challenge_form_submitz/CaptchaCase.test_repeated_challenge_form_submit   s   '/'G'G$B 5	HG/PH,!12B!12BR^^S1R^^S1zz0#bjj/B$:C

OLQO		zz0#bjj/B$:C

OLQO		&..2262B&..2262B OOGJJ'**45OOG,,0@0@@AOOFf,-!! $%..!-	B R^^S1OOC

O001ABQFG&..2262B !! $%..!-	B R^^S1OOC

O001ABQFGk5	Hl ,H(G  		*  		s%   /A M" M?M<;M<?NNc                     | j                   j                  t        d            }| j                  |      \  }}| j	                  |d       y )Ntest_custom_generator111111)rV   r<   r   rp   rX   rI   s       r2   r   z!CaptchaCase.test_custom_generator)  s>    KKOOG$;<=::1=x8,r4   c                 0   | j                   j                  t        d      d      }	 t        j                  t        |j                  d            }| j                  d|v        | j                  d|v        y # t        $ r | j                          Y y w xY w)Nzcaptcha-refreshXMLHttpRequest)HTTP_X_REQUESTED_WITHascii)encoding	image_url	audio_url)
rV   r<   r   jsonloadsrG   rH   rZ   r   r   )r.   rJ   new_datas      r2   test_refresh_viewzCaptchaCase.test_refresh_view.  s}    KKOO%&>N  
	zz#aii'"BCHOOK834OOK834 	IIK	s   AA9 9BBc           	         | j                   j                         D cg c]  }|j                   c}D ]  }| j                  j	                  t        dt        |                  }| j                  |j                  d             | j                  |d   j                                | j                  t        |d                 y c c}w )NrN   rO   rQ   zcontent-length)r   rU   rD   rV   r<   r   rW   rZ   r[   isdigitintr\   s       r2   test_content_lengthzCaptchaCase.test_content_length9  s    /3{{/A/A/CDeEMMD 	=C{{wtPS}'UVHOOH//0@ABOOH%56>>@AOOC)9 :;<		=Ds   Cc           	         t         j                  }dt         _        | j                  j                  t	        d            }| j                  |j                  d       | j                  j                  t	        d      t        dddd            }| j                  |d	d
t        d             dt         _        | j                  j                  t	        d            }| j                  |j                  d       | j                  j                  t	        d      t        dddd            }| j                  |d	d
t        d             | j                  j                  t	        d            }| j                  |j                  d       | j                  j                  t	        d      t        dddd            }| j                  t        |j                        j                  d      dkD         |t         _        y )NFrf   rR   rz   r{   rg   rh   ri   r|   r}   r~   Tpassedrn   r   )r   CAPTCHA_TEST_MODErV   r<   r   rX   rY   rq   rW   r@   r   rZ   rG   rH   rr   )r.   '_CaptchaCase__current_test_mode_settingrJ   s      r2   test_test_mode_issue15z"CaptchaCase.test_test_mode_issue15@  s   &.&@&@#%*"KKOOGN34,KKN#*)	
 	aLAR4ST%)"KKOOGN34,KKN#*)	
 	aLAR4STKKOOGN34,KKN#")	
 	AII++,<=AB%@"r4   c                 ,    dd l }|j                          y )Nr   )r}   get_version)r.   r}   s     r2   test_get_versionzCaptchaCase.test_get_versionm  s    r4   c           	      `   | j                   j                  t        d            }| j                  |j                  d       | j                  |      \  }}| j                   j                  t        d      t        dd            }| j                  |j                  d       | j                  t        |j                        j                  d      dkD         | j                   j                  t        d            }| j                  |j                  d       | j                  |      \  }}| j                   j                  t        d      t        ||dd            }| j                  |j                  d       | j                  t        |j                        j                  d      dkD         y )	Nzcaptcha-test-non-requiredrR   rg   rh   )rl   rm   rn   r   ri   )rV   r<   r   rX   rY   rp   rq   rW   rZ   rG   rH   rr   rI   s       r2   test_missing_valuezCaptchaCase.test_missing_valuer  sU   KKOOG$?@A,::1=x KK/0'9:
 	,AII++,<=AB KKOOG$?@A,::1=xKK/0")	
 	,AII++,<=ABr4   c                     | j                   j                  t        d            }d}t        j                  dk\  rd}| j                  ||d       y )Nrf   z<input type="text" name="captcha_1" autocomplete="off" spellcheck="false" autocorrect="off" autocapitalize="off" id="id_captcha_1" required />r   r   T)html)rV   r<   r   djangoVERSIONassertContains)r.   rJ   captcha_inputs      r2   test_autocomplete_offz!CaptchaCase.test_autocomplete_off  sS    KKOOGN34A 	
 >>V#  	A}48r4   c                 x   | j                   j                  t        d            }|j                  d   d   j                  j
                  j                  }t        j                  dk\  r*| j                  d| dt        |j                               y | j                  d| dt        |j                               y )Nrf   r|   r}   r   z-<input type="hidden" name="captcha_0" value="z2" id="id_captcha_0" autocomplete="off" required />)rV   r<   r   r;   fieldwidget_keyr   r   assertInHTMLrG   rH   )r.   rJ   rP   s      r2   -test_issue201_autocomplete_off_on_hiddeninputz9CaptchaCase.test_issue201_autocomplete_off_on_hiddeninput  s    KKOOGN34 ii	*0077<< >>V#CC5 I" " AII CC5 IG G AIIr4   c           	         t         j                  }dt         _        | j                  j                         D cg c]  }|j                   c}D ]  }| j
                  j                  t        dt        |                  }| j                  |j                  d       | j                  |j                  d             | j                  |d   d        |t         _        y c c}w )NtransparentrN   rO   rQ   rR   rS   rT   )r   CAPTCHA_BACKGROUND_COLORr   rU   rD   rV   r<   r   rW   rX   rY   rZ   r[   r.   r   r]   rP   r   s        r2   test_transparent_backgroundz'CaptchaCase.test_transparent_background  s    &.&G&G#,9)/3{{/A/A/CDeEMMD 	DC{{wtPS}'UVHX1137OOH//?@Xn5{C		D -H) Es   C c           	         | j                   j                         D cg c]  }|j                   c}D ]  }| j                  j	                  t        dt        |                  }| j                  |j                  d       t        j                  j                  |      j                          | j                  j	                  t        dt        |                  }| j                  |j                  d        y c c}w )NrN   rO   rQ   rR   rC   i  )r   rU   rD   rV   r<   r   rW   rX   rY   r   r)   filterdeleter\   s       r2    test_expired_captcha_returns_410z,CaptchaCase.test_expired_captcha_returns_410  s    /3{{/A/A/CDeEMMD 	8C{{wtPS}'UVHX1137  '''4;;={{wtPS}'UVHX1137	8Ds   C?c                 |   | j                   j                  t        d            }| j                  dt	        |j
                        v        | j                  dt	        |j
                        v        | j                  dt	        |j
                        v        | j                  dt	        |j
                        v        y )Nzcaptcha-test-id-prefixz2<label for="form1_id_captcha1_1">Captcha1:</label>zid="form1_id_captcha1_1"z2<label for="form2_id_captcha2_1">Captcha2:</label>zid="form2_id_captcha2_1")rV   r<   r   rZ   rG   rH   r   s     r2   test_id_prefixzCaptchaCase.test_id_prefix  s    KKOOG$<=>@C		NR	
 	2c!))nDE@C		NR	
 	2c!))nDEr4   c           	      N   t         j                  }| j                  j                         D cg c]  }|j                   c}D ]  }dt         _        | j
                  j                  t        dt        |                  }| j                  |j                  d       | j                  |j                  d             | j                  |d   d       | j                  t        j                  t        |j                               j"                  d        |t         _        y c c}w )N)   a   rN   rO   rQ   rR   rS   rT   )r   CAPTCHA_IMAGE_SIZEr   rU   rD   rV   r<   r   rW   rX   rY   rZ   r[   r   openr   rH   rc   r   s        r2   test_image_sizezCaptchaCase.test_image_size  s    &.&A&A#/3{{/A/A/CDeEMMD 	TC*3H'{{wtPS}'UVHX1137OOH//?@Xn5{CUZZ0@0@(ABGGS	T 'B# Es   D"c           	         t         j                  j                  t         j                  j                  t              ddd      }t
        j                  }|t
        _        | j                  j                         D cg c]  }|j                   c}D ]c  }| j                  j                  t        dt        |                  }| j                  |j                  d       | j                  |d   d	       e |||gt
        _        | j                  j                         D cg c]  }|j                   c}D ]c  }| j                  j                  t        dt        |                  }| j                  |j                  d       | j                  |d   d	       e d
t
        _        | j                  j                         D cg c]  }|j                   c}D ]C  }	 | j                  j                  t        dt        |                  }| j!                          E |t
        _        y c c}w c c}w c c}w # t"        $ r Y lw xY w)Nz..fontszVera.ttfrN   rO   rQ   rR   rS   rT   F)r$   r%   joindirname__file__r   CAPTCHA_FONT_PATHr   rU   rD   rV   r<   r   rW   rX   rY   r   r	   )r.   verar   r]   rP   r   s         r2   test_multiple_fontszCaptchaCase.test_multiple_fonts  s   ww||BGGOOH5tWjQ&.&@&@#%)"/3{{/A/A/CDeEMMD 	DC{{wtPS}'UVHX1137Xn5{C	D
 '+D$%7"/3{{/A/A/CDeEMMD 	DC{{wtPS}'UVHX1137Xn5{C	D
 &+"/3{{/A/A/CDeEMMD 	C;;??ODSMB 			 &A"+ E E E ( s%   ;H,!H1H6A H;;	IIc                    t         j                  }dt         _        d} t        j                  |             \  }}t         j                  |vr0 t        j                  |             \  }}t         j                  |vr0| j                  |t	        t        |j                  t         j                  d      d d                    |t         _        y )N~r   *r   )r   CAPTCHA_MATH_CHALLENGE_OPERATORr(   rX   rG   evalr,   )r.   r   r0   r   r   s        r2   test_math_challengezCaptchaCase.test_math_challenge   s    &.&N&N#3601Dh<<VDF	866iG"H("@"@"H"JIx 66iG 	%%h&N&NPST		
 4O0r4   c                    t         j                  }t         j                  }t         j                  }dt         _        dt         _        dt         _        t        j
                  j                         j                          d}t	        j                  |       | j                  t        j
                  j                         |       t        j
                  j                  dd      }t	        j                         }| j                  ||       | j                  t        j
                  j                         |       |t         _        |t         _        |t         _        y )NTr   Z   
   )countrD   )flat)r   CAPTCHA_GET_FROM_POOLCAPTCHA_GET_FROM_POOL_TIMEOUTCAPTCHA_TIMEOUTr   r)   allr   create_poolrX   r   values_listpickassertIn)r.   0_CaptchaCase__current_test_get_from_pool_setting8_CaptchaCase__current_test_get_from_pool_timeout_setting*_CaptchaCase__current_test_timeout_setting	POOL_SIZEpoolrandom_picks          r2   test_get_from_poolzCaptchaCase.test_get_from_pool  s   /7/M/M,22 	5 *2)A)A&)-&12.#%   "))+	  y1--335yA##//	/E"'')k4(--335yA)M&8 	. $B r4   c                     t         j                  j                         j                          d}t	        j
                  d|d       | j                  t         j                  j                         |       y )Nr   captcha_create_poolr   )	pool_size	verbosity)r   r)   r   r   r   call_commandrX   r   )r.   r  s     r2   test_captcha_create_poolz$CaptchaCase.test_captcha_create_pool-  sU      "))+	 5VWX--335yAr4   c                    t         j                  }dt         _        t        j                  j	                         j                          t               5 }t        j                          d d d        j                  d       | j                  t        j                  j                         d       |t         _        y # 1 sw Y   TxY w)NT)zcaptcha.modelsERRORz,Couldn't get a captcha from pool, generatingr   )r   r   r   r)   r   r   r   r  checkrX   r   )r.   r  logs      r2   test_empty_pool_fallbackz$CaptchaCase.test_empty_pool_fallback3  s    /7/M/M,)-&  "))+\ 	 S	 		W	
 	--335q9)M&	  	 s   B::Cc                     | j                   j                  t        d      t        | j                  j
                  | j                  j                              }| j                  |j                  d       y )Ncaptcha-test-serializercaptcha_codecaptcha_hashkeyrR   	rV   rq   r   rW   r   r   rD   rX   rY   r   s     r2   test_serializerzCaptchaCase.test_serializer?  s[    KK-.!//88 $ 2 2 : :
 	,r4   c                     | j                   j                  t        d      t        dd            }| j	                  |j
                  d       | j	                  t        j                  |j                        ddi       y )Nr  rg   
wrong hashr    errorr~   	rV   rq   r   rW   rX   rY   r   r   rH   r   s     r2   test_wrong_serializerz!CaptchaCase.test_wrong_serializerI  sf    KK-." ,
 	,AII.:K0LMr4   c           	          | j                   j                  t        d      t        | j                  j
                  | j                  j                  dd            }| j                  |j                  d       y )Ncaptcha-test-model-serializerrg   rh   r  r  rl   rm   rR   r  r   s     r2   test_model_serializerz!CaptchaCase.test_model_serializerT  sa    KK34!//88 $ 2 2 : :)	
 	,r4   c           	         | j                   j                  t        d      t        dddd            }| j	                  |j
                  d       | j	                  t        j                  |j                        ddi       y )	Nr$  rg   r  rh   r%  r  r   r~   r!  r   s     r2   test_wrong_model_serializerz'CaptchaCase.test_wrong_model_serializer`  sl    KK34" ,)	
 	,AII.:K0LMr4   N)'__name__
__module____qualname__r3   r8   r@   rp   r^   rd   rt   rw   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(   r4   r2   r   r      s    :>KO
DDD:D:Y0
$ 78K 9K68Ht-
	=+AZ
C<9 4	H8	F
BA8O*B0B
N-	N
-Nr4   r   c                       y)N)trivialr.  r,  r,  r4   r2   trivial_challenger/  n  s    r4   c                      y)Nr   r,  )r   strings     r2   random_color_challenger2  r  s    r4   c                  P    d} | d t         j                   }|j                         |fS )Nabcdefghijklmnopqrstuvwxyz)r   CAPTCHA_LENGTHupper)charsrets     r2   random_char_challenger9  v  s+    (E
)())
*C99;r4   )#r   r   r$   rE   ior   unittest.mockr   r   PILr   testfixturesr   r   django.corer   django.core.exceptionsr	   django.testr
   r   django.urlsr   django.utilsr   django.utils.translationr   captcha.confr   captcha.modelsr   r   r/  r2  r9  r,  r4   r2   <module>rF     so      	 	  %  #  " 7 3  ! 1 ! '  45S	N( S	N 6S	Nl r4   