o
    5Îh”¡  ã                   @   sD  d Z ddlmZmZmZ ddlZe e¡Zddl	Z	ddl
Z
ddlmZmZmZ ddlmZmZmZ ddlmZ ddlmZmZmZmZ ddlmZmZmZ dd	lm Z  dd
l!m"Z"m#Z#m$Z$ ddl%m&Z& g d¢Z'eekZ(e(r•ddl)m*Z*m+Z+ e,e*e+ƒse-de*f ƒ‚e*j.sˆe* /¡  ddl0mZ e 1ddg¡ edkrŸe 2de¡ e3ƒ Z4dd„ Z5e(r¶ddl6m7Z7 G dd„ de7ƒZ8dd„ Z9dd„ Z:d1dd„Z;edkrÍe;ej<ƒZ=ned kr×e;ej>ƒZ=ne;ejƒZ=dd!l?m@Z@ eAd"e@jBe= Cd#¡d$ Dd"¡fd!ZEG d%d&„ d&e3ƒZFG d'd(„ d(e"eFƒZGd)ZHd*ZIG d+d,„ d,eGƒZJG d-d.„ d.eJƒZKG d/d0„ d0eGƒZLdS )2ztest passlib.ext.djangoé    )Úabsolute_importÚdivisionÚprint_functionN)ÚappsÚexcÚregistry)Údjango10_contextÚdjango14_contextÚdjango16_context)ÚCryptContext)ÚDJANGO_VERSIONÚMIN_DJANGO_VERSIONÚDjangoTranslatorÚquirks)Ú	iteritemsÚget_method_functionÚu)Úmemoized_property)ÚTestCaseÚ	TEST_MODEÚhandler_derived_from)Úget_handler_case)ÚDjangoBehaviorTestÚExtensionBehaviorTestÚDjangoExtensionTestÚ_ExtensionSupportÚ_ExtensionTest)ÚsettingsÚLazySettingsz4expected django.conf.settings to be LazySettings: %r)r   zdjango.contrib.contenttypeszdjango.contrib.auth)é   é   z1this release hasn't been tested against Django %rc                  K   s@   t | ƒD ]\}}|tu rtt|ƒrtt|ƒ qtt||ƒ qdS )z*helper to update django settings from kwdsN)r   ÚUNSETÚhasattrr   ÚdelattrÚsetattr)ÚkwdsÚkÚv© r(   úq/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/passlib/tests/test_ext_django.pyÚupdate_settingsN   s   

€ûr*   )ÚUserc                   @   s<   e Zd ZdZG dd„ dƒZedd„ ƒZdd„ Zdd	d
„ZdS )ÚFakeUserz#mock user object for use in testingc                   @   s   e Zd Ze ZdS )zFakeUser.MetaN)Ú__name__Ú
__module__Ú__qualname__Ú	app_labelr(   r(   r(   r)   ÚMeta_   s    r1   c                 C   s   g S ©Nr(   ©Úselfr(   r(   r)   Úsaved_passwordsb   s   zFakeUser.saved_passwordsc              	   C   s,   z| j d d … W | j d d …= S | j d d …= w r2   )r5   r3   r(   r(   r)   Úpop_saved_passwordsf   s   zFakeUser.pop_saved_passwordsNc                 C   s   | j  | j¡ d S r2   )r5   ÚappendÚpassword)r4   Úupdate_fieldsr(   r(   r)   Úsavel   s   zFakeUser.saver2   )	r-   r.   r/   Ú__doc__r1   r   r5   r6   r:   r(   r(   r(   r)   r,   Z   s    
r,   c                     s&   g ‰ ‡ fdd„} ‡ fdd„}|| _ | S )Nc                    s   ˆ   | ¡ d S r2   )r7   )r8   ©Ústater(   r)   Úsetterr   s   z"create_mock_setter.<locals>.setterc                	      s&   zˆ d d … W ˆ d d …= S ˆ d d …= w r2   r(   r(   r<   r(   r)   Úpopstatet   s   z$create_mock_setter.<locals>.popstate)r?   )r>   r?   r(   r<   r)   Úcreate_mock_setterp   s
   r@   c              
   C   s`   | sJ ‚ddl m} z	|d| d W dS  ty/ } zt dt|ƒ¡r*W Y d}~dS ‚ d}~ww )	z|
    check whether django hasher is available;
    or if it should be skipped because django lacks third-party library.
    r   ©Úmake_passwordÚ ©ÚhasherTz3Couldn't load '.*?' algorithm .* No module named .*NF)Údjango.contrib.auth.hashersrB   Ú
ValueErrorÚreÚmatchÚstr)ÚnamerB   Úerrr(   r(   r)   Úcheck_django_hasher_has_backend}   s   €ýrM   c                 C   sR   t | dƒr	|  ¡ } | jdd |du rtrddlm} |j}|r'| j||d | S )zš
    helper to build django CryptContext config matching expected setup for stock django deploy.
    :param kwds:
    :param sha_rounds:
    :return:
    Úto_dictÚauto)Ú
deprecatedNr   )ÚPBKDF2PasswordHasher)Ú"django_pbkdf2_sha1__default_roundsÚ$django_pbkdf2_sha256__default_rounds)r"   rN   ÚupdateÚhas_min_djangorF   rQ   Ú
iterations)r%   Ú
sha_roundsrQ   r(   r(   r)   Ú_modify_django_config   s   
þþrX   )r    é   ©rY   é
   )Údjango_pbkdf2_sha256znot a passwordrS   ©Úroundsc                   @   sH   e Zd ZdZedd„ ƒZdd„ Zddd„Zg d	¢Zddd„Z	dd„ Z
dS )r   zx
    test support funcs for loading/unloading extension.
    this class is mixed in to various TestCase subclasses.
    c                 c   s¸    ddl m}m} ddg}ddg}g d¢}||f|j|f||fg}|D ]6\}}t|ƒD ]-}	|	 d¡r3q+|j |	t¡}
|
tu rC|	|vrCq+t	|
ƒ}
t
|
dd	ƒ}|rX||	||	|v fV  q+q#d	S )
zàhelper to scan for monkeypatches.

        returns tuple containing:
        * object (module or class)
        * attribute of object
        * value of attribute
        * whether it should or should not be patched
        r   )ÚmodelsÚhashersÚcheck_passwordÚset_passwordrB   )ra   rB   Ú
get_hasherÚidentify_hasherÚget_hashersÚ_r.   N)Údjango.contrib.authr_   r`   r+   ÚdirÚ
startswithÚ__dict__Úgetr!   r   Úgetattr)Úclsr_   r`   Ú
user_attrsÚmodel_attrsÚhasher_attrsÚobjsÚobjÚpatchedÚattrÚvalueÚsourcer(   r(   r)   Ú_iter_patch_candidatesØ   s.   €þ
€÷ÿz(_ExtensionSupport._iter_patch_candidatesc                 C   sx   t j d¡}|  |o|jjd¡ |  ¡ D ]%\}}}}|r+|  | d¡d|||f ¡ q|  | d¡d|||f ¡ qdS )z8
        test that django is in unpatched state
        úpasslib.ext.django.modelszpatch should not be enabledzdjango.contrib.auth.z#obj=%r attr=%r was not reverted: %rúpasslib.ú/obj=%r attr=%r should not have been patched: %rN)	ÚsysÚmodulesrk   ÚassertFalseÚadapterrs   rw   Ú
assertTrueri   )r4   Úmodrr   rt   rv   rs   r(   r(   r)   Úassert_unpatchedý   s   ÿÿÿÿúz"_ExtensionSupport.assert_unpatchedNc                 C   sª   t j d¡}|  |o|jjd¡ |  ¡ D ]$\}}}}|r*|  |dkd|||f ¡ q|  | d¡d|||f ¡ q|durSt	 
|¡}|  |jjdd	|jdd	¡ dS dS )
zY
        helper to ensure django HAS been patched, and is using specified config
        rx   zpatch should have been enabledzpasslib.ext.django.utilsz+obj=%r attr=%r should have been patched: %rry   rz   NT©Úresolve)r{   r|   rk   r   r~   rs   rw   r}   ri   r   Ú_norm_sourceÚassertEqualÚpassword_contextrN   )r4   Úcontextr€   rr   rt   rv   rs   r(   r(   r)   Úassert_patched  s(   
ÿÿÿÿ

ÿþz _ExtensionSupport.assert_patched)ÚPASSLIB_CONFIGÚPASSLIB_CONTEXTÚPASSLIB_GET_CATEGORYTc                 K   sf   |   ¡  |r| d¡p| d¡}| jD ]}| |t¡ qtdi |¤Ž ddl}|r1| j|d dS dS )zO
        helper to load extension with specified config & patch django
        r‰   rŠ   r   N©r‡   r(   )Úunload_extensionrk   Ú_config_keysÚ
setdefaultr!   r*   Úpasslib.ext.django.modelsrˆ   )r4   Úcheckr%   ÚconfigÚkeyÚpasslibr(   r(   r)   Úload_extension/  s   
ÿz _ExtensionSupport.load_extensionc                 C   sL   t j d¡}|r|j ¡  t jd= tdi tdd„ | jD ƒƒ¤Ž |  ¡  dS )z?
        helper to remove patches and unload extension
        rx   c                 s   s    | ]}|t fV  qd S r2   )r!   )Ú.0r“   r(   r(   r)   Ú	<genexpr>G  s   € z5_ExtensionSupport.unload_extension.<locals>.<genexpr>Nr(   )	r{   r|   rk   r~   Úremove_patchr*   ÚdictrŽ   r   )r4   r€   r(   r(   r)   r   =  s   
z"_ExtensionSupport.unload_extensionr2   )T)r-   r.   r/   r;   Úclassmethodrw   r   rˆ   rŽ   r•   r   r(   r(   r(   r)   r   Ï   s    
$

r   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )r   z€
    TestCase mixin which makes sure extension is unloaded before test;
    and make sure it's unloaded after test as well.
    c                    sL   t t| ƒ ¡  |  d¡ ts|  d¡‚ts|  d¡‚|  ¡  |  | j¡ d S )NÚdefaultzDjango not installedzDjango version too old)	Úsuperr   ÚsetUpÚrequire_TEST_MODEr   ÚskipTestrU   r   Ú
addCleanupr3   ©Ú	__class__r(   r)   r   ]  s   


z_ExtensionTest.setUp)r-   r.   r/   r;   r   Ú__classcell__r(   r(   r¡   r)   r   T  s    r   ÚtoomanysecretsÚletmeinc                   @   sŽ   e Zd ZdZdZdZeZedd„ ƒZ	dd„ Z
edf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S )r   a	  
    tests model to verify it matches django's behavior.

    running this class verifies the tests correctly assert what Django itself does.

    running the ExtensionBehaviorTest subclass below verifies "passlib.ext.django"
    matches what the tests assert.
    zverify django behaviorFc                 C   s   t  | j¡S )z?
        per-test CryptContext() created from .config.
        )r   r„   r’   r3   r(   r(   r)   r‡   š  s   zDjangoBehaviorTest.contextc                 C   s4   |   |j d¡¡ |  | ¡ ¡ |  | ¡ g ¡ dS )zO
        check that user object is set to 'unusable password' constant
        ú!N)r   r8   ri   r}   Úhas_usable_passwordr…   r6   )r4   Úuserr(   r(   r)   Úassert_unusable_password¡  s   z+DjangoBehaviorTest.assert_unusable_passwordNc                 C   st   |t u r|  |jd¡ |  |jd¡ n|  |j|¡ |  | ¡ d|jf ¡ |  | ¡ |du r4g ¡ dS |g¡ dS )zÚ
        check that user object has a usable password hash.
        :param hash: optionally check it has this exact hash
        :param saved: check that mock commit history for user.password matches this list
        r¦   Nzhash should be usable: %r)r!   ÚassertNotEqualr8   r…   r   r§   r6   )r4   r¨   ÚhashÚsavedr(   r(   r)   Úassert_valid_password©  s   

ÿ

ÿÿz(DjangoBehaviorTest.assert_valid_passwordc                 C   sf   | j s|  d¡‚| j}ddlm} ddlm} |  |jdd|jdd¡ ddl	m} |  ||¡ dS )z;
        test extension config is loaded correctly
        zextension not loadedr   )ra   )r†   Tr‚   N)
rs   rŸ   r‡   rF   ra   r   r†   r…   rN   Údjango.contrib.auth.models)r4   Úctxra   r†   Úcheck_password2r(   r(   r)   Útest_extension_configÎ  s   
z(DjangoBehaviorTest.test_extension_configc                 C   sf   | j }ddlm} tƒ }| t¡ |  | ¡  t|j	¡¡ |  
|¡ |tƒ}|  | ¡  t|¡¡ dS )z1
        test django's default algorithm
        r   rA   N)r‡   rF   rB   r,   rb   ÚPASS1r   ÚhandlerÚverifyr8   r­   )r4   r¯   rB   r¨   r«   r(   r(   r)   Útest_default_algorithmà  s   

z)DjangoBehaviorTest.test_default_algorithmc                 C   s†   | j }ddlm}m}m}m} tƒ }| d¡ |j}|  	| 
¡  d|¡¡ |  ||¡ |  	| d¡¡ |  ||¡ |  	|d|ƒ¡ dS )zB
        test how methods handle empty string as password
        r   ©ra   rB   Úis_password_usablerd   rC   N)r‡   rF   ra   rB   r·   rd   r,   rb   r8   r   r³   r´   r­   )r4   r¯   ra   rB   r·   rd   r¨   r«   r(   r(   r)   Útest_empty_password÷  s   
	z&DjangoBehaviorTest.test_empty_passwordc                 C   sì   ddl m}m}m}m} tƒ }| ¡  |  |¡ tƒ }| d¡ |  |¡ |  	| d¡¡ |  	| d¡¡ |  	| d¡¡ |  	| t
¡¡ |  	| t¡¡ |  |¡ |  |dƒ d¡¡ |  	|t
dƒ¡ |  	||jƒ¡ |  t||j¡ dS )zA
        test how methods handle 'unusable flag' in hash
        r   r¶   NÚNonerC   r¦   )rF   ra   rB   r·   rd   r,   Úset_unusable_passwordr©   rb   r}   r²   ÚWRONG1r   ri   r8   ÚassertRaisesrG   ©r4   ra   rB   r·   rd   r¨   r(   r(   r)   Útest_unusable_flag  s"   



z%DjangoBehaviorTest.test_unusable_flagc                 C   s¦   | j }ddlm}m}m}m} tƒ }d|_tj	r#|s#|  
t|jt¡ n|  | t¡¡ |  | ¡ tj¡ tj	rB|sB|  
t|td¡ n|  |tdƒ¡ |  
t|d¡ dS )z<
        test how methods handle None as hash value
        r   r¶   N)rs   rF   ra   rB   r·   rd   r,   r8   r   Ú none_causes_check_password_errorr¼   Ú	TypeErrorr²   r}   r…   r§   Úempty_is_usable_password)r4   rs   ra   rB   r·   rd   r¨   r(   r(   r)   Útest_none_hash_valueA  s   


ÿ
z'DjangoBehaviorTest.test_none_hash_valuec                 C   s†   ddl m}m}m}m} tƒ }d|_|  | t¡¡ |  	|jd¡ |  	| 
¡ g ¡ |  	| ¡ tj¡ |  |tdƒ¡ |  t|d¡ dS )zD
        test how methods handle empty string as hash value
        r   r¶   rC   N)rF   ra   rB   r·   rd   r,   r8   r}   r²   r…   r6   r§   r   rÁ   r¼   rG   r½   r(   r(   r)   Útest_empty_hash_valuej  s   z(DjangoBehaviorTest.test_empty_hash_valuec              	   C   sD   dD ]}| j |d |  |¡ W d  ƒ n1 sw   Y  qdS )z>
        test how methods handle invalid hash values.
        )z$789$foo)r«   N)ÚsubTestÚ_do_test_invalid_hash_value)r4   r«   r(   r(   r)   Útest_invalid_hash_values  s   ÿ€ýz+DjangoBehaviorTest.test_invalid_hash_valuesc                 C   s†   ddl m}m}m}m} tƒ }||_|  | t¡¡ |  	|j|¡ |  	| 
¡ g ¡ |  	| ¡ tj¡ |  |t|ƒ¡ |  t||¡ d S )Nr   r¶   )rF   ra   rB   r·   rd   r,   r8   r}   r²   r…   r6   r§   r   Úinvalid_is_usable_passwordr¼   rG   )r4   r«   ra   rB   r·   rd   r¨   r(   r(   r)   rÅ   ™  s   z.DjangoBehaviorTest._do_test_invalid_hash_valuec              	   C   sJ   | j  ¡ D ]}| j|d |  |¡ W d  ƒ n1 sw   Y  qdS )z
        run a bunch of subtests for each hasher available in the default django setup
        (as determined by reading self.context)
        )ÚschemeN)r‡   ÚschemesrÄ   Ú_do_test_available_scheme)r4   rÈ   r(   r(   r)   Útest_available_schemes¼  s   ÿ€ÿz)DjangoBehaviorTest.test_available_schemesc                 C   s’  |   ¡ }| j}| j}tƒ }ddlm}m}m}m}	 | 	|¡}
| 
d||
¡ | 	|¡j}|r5|| ¡ ks5J ‚zt|ƒ}W n tjyH   |  d¡‚w t|
|j	ƒsQJ ‚|
jrY|  d¡‚|sut|
jƒsu|dv sjJ d| ƒ‚| d|¡ |  d	¡‚zt| \}}W n ty•   |d
ƒj}	 |ƒ \}}|r’nqŠY nw d}tƒ }||_|  | d¡¡ |  | |¡¡ |  ||¡ |  | |¡¡ |}|rå|  |j|¡ |  |
 |j¡¡ |  | 	¡   ||j¡¡ | j||jd n|  ||¡ t!ddròdS t"ƒ  #|¡}|||d}|  |
  ||¡¡ |  ||||d¡ |  $| %¡ |r|gng ¡ |  ||||d¡ |  $| %¡ g ¡ |  ||ƒ¡ t"ƒ  &|	|ƒj'¡}|  $||¡ dS )z‹
        helper to test how specific hasher behaves.
        :param scheme: *passlib* name of hasher (e.g. "django_pbkdf2_sha256")
        r   r¶   ztesting scheme: %r => %rzbackend not availablezskip disabled hasher)Údjango_bcryptÚdjango_bcrypt_sha256Údjango_argon2z+%r scheme should always have active backendz3skipping scheme %r due to missing django dependencyzskip due to missing dependencyr   TÚdontletmeinN)r¬   r›   )ÚmaxrD   )r>   )(Ú	getLoggerr‡   rs   r@   rF   ra   rB   r·   rd   r³   ÚdebugrP   Údefault_schemer   r   ÚMissingBackendErrorrŸ   r   Úis_disabledrM   Údjango_nameÚwarningÚsample_hashesÚKeyErrorÚget_sample_hashr,   r8   r}   r­   r   rª   Úidentifyr´   r   r   Úpasslib_to_django_namer…   r?   Údjango_to_passlib_nameÚ	algorithm)r4   rÈ   Úlogr¯   rs   r>   ra   rB   r·   rd   r³   rP   ÚtestcaseÚsecretr«   rÚ   Úotherr¨   Úneeds_updateÚalgÚhash2rK   r(   r(   r)   rÊ   Å  sx   


ÿ

ÿ


ýû	
z,DjangoBehaviorTest._do_test_available_scheme)r-   r.   r/   r;   ÚdescriptionPrefixrs   Ústock_configr’   r   r‡   r©   r!   r­   r±   rµ   r¸   r¾   rÂ   rÃ   rÆ   rÅ   rË   rÊ   r(   r(   r(   r)   r   z  s&    
%"()%
#	r   c                       s0   e Zd ZdZdZedddZ‡ fdd„Z‡  ZS )r   z`
    test that "passlib.ext.django" conforms to behavioral assertions in DjangoBehaviorTest
    zverify extension behaviorz sha256_crypt,md5_crypt,des_cryptÚ	des_crypt)rÉ   rP   c                    s&   t t| ƒ ¡  | j| jd d| _d S )N©r‰   T)rœ   r   r   r•   r’   rs   r3   r¡   r(   r)   r   N  s   
zExtensionBehaviorTest.setUp)	r-   r.   r/   r;   ræ   r™   r’   r   r£   r(   r(   r¡   r)   r   C  s    þr   c                   @   sT   e Zd Zd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S )r   z0
    test the ``passlib.ext.django`` plugin
    zpasslib.ext.django pluginc                 C   sž   | j ddd |  ¡  |  d¡ | j ddd W d  ƒ n1 s"w   Y  |  ¡  | j ddd | jtd |  ¡  | j ddd | jtd |  ¡  dS )	z.test set_django_password_context patch/unpatchÚdisabledF©r‰   r‘   ú!PASSLIB_CONFIG=None is deprecatedNú
django-1.0rŒ   ú
django-1.4)r•   r   ÚassertWarningListrˆ   r   r   r	   r3   r(   r(   r)   Útest_00_patch_controlg  s   ÿz)DjangoExtensionTest.test_00_patch_controlc                 C   sÒ   d}| j |d ddlm  m  m} ddlm} dd„ }|jj}||j_|  	d¡ |j
 ¡  W d  ƒ n1 s;w   Y  ||j_|j}||_|  	d	¡ |j
 ¡  W d  ƒ n1 s_w   Y  ||_dS )
z(test detection of foreign monkeypatchingz[passlib]
schemes=des_crypt
ré   r   N)r~   c                   S   ó   d S r2   r(   r(   r(   r(   r)   ÚdummyŽ  ó   z>DjangoExtensionTest.test_01_overwrite_detection.<locals>.dummyz/another library has patched.*User\.set_passwordz2another library has patched.*models:check_password)r•   r®   ÚcontribÚauthr_   r   r~   r+   rb   rï   Ú_managerÚ	check_allra   )r4   r’   r_   r~   rò   Úorigr(   r(   r)   Útest_01_overwrite_detection  s"   ÿÿ
z/DjangoExtensionTest.test_01_overwrite_detectionc                 C   s  ddl m} tƒ j}tdkr|  t|d¡ n|dƒ}|  ||j¡ |dƒ}|  ||j	¡ ddl
m} |dƒ}|  |jd¡ | d	¡}|  | d	|¡¡ |  | d	|¡¡ |  | d
|¡¡ |jd	ddd}|  |d¡ |  | |¡dtdƒdtdƒdœ¡ |  t|d¡ dS )z'test Hasher-compatible handler wrappersr   )r`   rZ   Úhex_md5rÌ   ©Úsha256_cryptrü   Úpasslib_sha256_cryptÚstubÚxxxxÚabcdabcdabcdabcdiÒ  r]   zK$5$rounds=1234$abcdabcdabcdabcd$v2RWkZQzctPdejyRqmmTDQpZN6wTh7.RUy9zF2LftT6zabcdab**********z+v2RWkZ*************************************)rÞ   Úsaltr^   r«   Údoes_not_existN)rg   r`   r   Úpasslib_to_djangor   r¼   rG   ÚassertIsInstanceÚUnsaltedMD5PasswordHasherÚBCryptPasswordHasherÚpasslib.hashrü   r…   rÞ   Úencoder   r´   r}   Úsafe_summaryr   rÙ   )r4   r`   r  rE   rü   Úencodedr(   r(   r)   Útest_02_handler_wrapperŸ  s2   
ýÿ	z+DjangoExtensionTest.test_02_handler_wrapperc                 C   sZ   |   d¡ | jddd W d  ƒ n1 sw   Y  |  ¡  | jddd |  ¡  dS )ztest PASSLIB_CONFIG='disabled'rì   NFrë   rê   )rï   r•   r   r3   r(   r(   r)   Útest_11_config_disabledÏ  s   ÿz+DjangoExtensionTest.test_11_config_disabledc                 C   sP   | j ddd t}|  |¡ | j ddd |  t¡ | j ddd |  t¡ dS )ztest PASSLIB_CONFIG='<preset>'zdjango-defaultF©rŠ   r‘   rí   rë   rî   N)r•   r
   rˆ   r   r	   )r4   r¯   r(   r(   r)   Útest_12_config_presetsÚ  s   

z*DjangoExtensionTest.test_12_config_presetsc                 C   s\   ddl m} t |¡}|  ¡  |  |¡ | jddd |  |¡ | j|dd |  |¡ dS )z$test PASSLIB_CONFIG default behaviorr   )ÚPASSLIB_DEFAULTzpasslib-defaultFr  N)Úpasslib.ext.django.utilsr  r   Úfrom_stringr•   rˆ   )r4   r  r›   r(   r(   r)   Útest_13_config_defaultsç  s   


z+DjangoExtensionTest.test_13_config_defaultsc                 C   s@   t dtd |  ttd¡ |  ¡  t dtd |  ttd¡ dS )ztest PASSLIB_CONFIG type checksé{   )rŠ   r‰   rx   zmissing-preset)r‰   rŠ   N)r*   r!   r¼   rÀ   Ú
__import__r   rG   r3   r(   r(   r)   Útest_14_config_invalid÷  s
   z*DjangoExtensionTest.test_14_config_invalidc                    s8  t dgdddd}ddlm‰  ‡ fdd	„}| j|d
 |  |ƒ d¡ |  |ddd¡ |  |ddd¡ dd„ }| j||d |  |ƒ d¡ |  |ddd¡ |  |ddd¡ |  |ddd¡ dd„ }| j||d |  |ƒ d¡ |  |ddd¡ |  |dddd¡ |  |dddd¡ | jt| j|dd dS )z#test PASSLIB_GET_CATEGORY parameterrü   iè  iÐ  i¸  )rÉ   Úsha256_crypt__default_roundsÚ#staff__sha256_crypt__default_roundsÚ'superuser__sha256_crypt__default_roundsr   rû   c                     s&   t di | ¤Ž}| d¡ ˆ  |j¡jS )z;helper to take in user opts, return rounds used in passwordrþ   Nr(   )r,   rb   r  r8   r^   )r%   r¨   rû   r(   r)   Úrun  s   
z9DjangoExtensionTest.test_21_category_setting.<locals>.runré   T)Úis_staff)Úis_superuserc                 S   s
   | j pd S r2   ©Ú
first_name©r¨   r(   r(   r)   Úget_category  s   
zBDjangoExtensionTest.test_21_category_setting.<locals>.get_category)rŠ   r‹   râ   r  ÚstaffÚ	superuserc                 S   rñ   r2   r(   r  r(   r(   r)   r  %  ró   )r  r  )r  r  ÚxN)r™   r  rü   r•   r…   r¼   rÀ   )r4   r’   r  r  r(   rû   r)   Útest_21_category_setting  s>   üÿÿ
ÿz,DjangoExtensionTest.test_21_category_settingN)r-   r.   r/   r;   ræ   rð   rù   r  r  r  r  r  r#  r(   r(   r(   r)   r   Y  s    0r   r2   )Mr;   Ú
__future__r   r   r   ÚloggingrÑ   r-   rß   r{   rH   r”   r   Ú_appsr   r   Úpasslib.appsr   r	   r
   Úpasslib.contextr   r  r   r   r   r   Úpasslib.utils.compatr   r   r   Úpasslib.utils.decorr   Úpasslib.tests.utilsr   r   r   Úpasslib.tests.test_handlersr   Ú__all__rU   Údjango.confr   r   Ú
isinstanceÚRuntimeErrorÚ
configuredÚ	configureÚdjango.appsÚpopulateÚinfoÚobjectr!   r*   r®   r+   r,   r@   rM   rX   Údjango21_contextrç   Údjango110_contextr  r\   r™   Úusingrk   r«   rØ   r   r   r²   r»   r   r   r   r(   r(   r(   r)   Ú<module>   sr    
	
)

ÿþÿ
 "   L