U
    |®ÞhdÔ ã                   @   s<  d dl 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 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 d dlmZ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+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZAmBZBmCZC d dlDmEZE d dlFmGZH d d lImJZJ d d!lKmLZLmMZMmNZN d d"lOmPZP d d#lQmRZR d d$lSmTZT d%e2 U¡ › ZVd&e2 U¡ › ZWd'e2 U¡ › ZXeƒ ZYdgd)d*„ZZG d+d,„ d,eAƒZ[G d-d.„ d.eBƒZ\G d/d0„ d0eCƒZ]G d1d2„ d2eJƒZ^G d3d4„ d4eLƒZ_G d5d6„ d6eƒZ`G d7d8„ d8e?e=eƒZaG d9d:„ d:e?e=eƒZbG d;d<„ d<e?e=eƒZcG d=d>„ d>e?e=eƒZdG d?d@„ d@e?e=eƒZeG dAdB„ dBe?e=eƒZfG dCdD„ dDe?e=eƒZgG dEdF„ dFe=eƒZhG dGdH„ dHe=eƒZiG dIdJ„ dJe=eƒZjG dKdL„ dLe=eƒZkG dMdN„ dNe?e=eƒZlG dOdP„ dPe?e=eƒZmG dQdR„ dRe?e=eƒZnG dSdT„ dTe?e=eƒZoG dUdV„ dVe=eƒZpG dWdX„ dXeƒZqG dYdZ„ dZeqƒZrG d[d\„ d\e=eƒZsG d]d^„ d^e=eƒZtG d_d`„ d`e=eƒZuG dadb„ dbe=eƒZvG dcdd„ dde=eƒZwG dedf„ dfe=eƒZxdS )hé    N)Úforms)Úapps)Úsettings)Úquote)Úget_user_model)ÚGroupÚ
Permission)ÚContentType)ÚImproperlyConfigured)ÚSimpleUploadedFile)ÚQ)ÚHttpRequestÚHttpResponse)ÚRequestContextÚTemplate)ÚTestCaseÚoverride_settings)Úreverse)Útimezone)Úcapfirst)Úhooks)ÚAdminURLFinder)ÚAdmin)Úversioned_static)ÚButtonWithDropdown)ÚAUTH_USER_APP_LABELÚAUTH_USER_MODEL_NAME)Úget_dummy_request)Úlog)Ú
CollectionÚGroupCollectionPermissionÚGroupPagePermissionÚPage)ÚWagtailTestUtils)ÚAdminTemplateTestUtils)Ú	GroupFormÚUserCreationFormÚUserEditForm)ÚUserProfile)Úregister)ÚGroupViewSet)ÚUserViewSetÚget_user_creation_formÚget_user_edit_form)Úget_viewset_cls)ÚUserListingButton)ÚRemovedInWagtail70WarningÚadd_Údelete_Úchange_é2   c                 C   s   dS )Nz/nonexistent/path/to/avatar.png© )ÚuserÚdefaultÚsizer5   r5   úl/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/users/tests/test_admin_views.pyÚtest_avatar_provider8   s    r:   c                   @   s   e Zd ZdS )ÚCustomGroupFormN)Ú__name__Ú
__module__Ú__qualname__r5   r5   r5   r9   r;   <   s   r;   c                   @   s(   e Zd ZejdddZejdddZdS )ÚCustomUserCreationFormTÚCountry©ÚrequiredÚlabelÚ
AttachmentN©r<   r=   r>   r   Z	CharFieldÚcountryZ	FileFieldÚ
attachmentr5   r5   r5   r9   r?   @   s   r?   c                   @   s(   e Zd ZejdddZejdddZdS )ÚCustomUserEditFormTr@   rA   rD   NrE   r5   r5   r5   r9   rH   E   s   rH   c                   @   s   e Zd ZdZddd„ZdS )ÚCustomGroupViewSetúcustom-iconFc                 C   s   t S ©N)r;   ©ÚselfÚ
for_updater5   r5   r9   Úget_form_classM   s    z!CustomGroupViewSet.get_form_classN)F©r<   r=   r>   ÚiconrO   r5   r5   r5   r9   rI   J   s   rI   c                   @   s   e Zd ZdZddd„ZdS )ÚCustomUserViewSetrJ   Fc                 C   s   |rt S tS rK   )rH   r?   rL   r5   r5   r9   rO   T   s    z CustomUserViewSet.get_form_classN)FrP   r5   r5   r5   r9   rR   Q   s   rR   c                   @   sd   e Zd Zdd„ Zdd„ Zedddd„ ƒZed	d
dd„ ƒZedddd„ ƒZedd
dd„ ƒZ	dS )ÚTestUserFormHelpersc                 C   s   t ƒ }|  |t¡ d S rK   )r-   ÚassertIsr'   ©rM   Z	user_formr5   r5   r9   Ú)test_get_user_edit_form_with_default_form[   s    z=TestUserFormHelpers.test_get_user_edit_form_with_default_formc                 C   s   t ƒ }|  |t¡ d S rK   )r,   rT   r&   rU   r5   r5   r9   Ú-test_get_user_creation_form_with_default_form_   s    zATestUserFormHelpers.test_get_user_creation_form_with_default_formú*wagtail.users.tests.CustomUserCreationForm©ZWAGTAIL_USER_CREATION_FORMc              	   C   s.   |   td¡ tƒ }W 5 Q R X |  |t¡ d S ©Nz„The `WAGTAIL_USER_CREATION_FORM` setting is deprecated. Use a custom `UserViewSet` subclass and override `get_form_class()` instead.)ÚassertWarnsMessager0   r,   rT   r?   rU   r5   r5   r9   Ú,test_get_user_creation_form_with_custom_formc   s    þz@TestUserFormHelpers.test_get_user_creation_form_with_custom_formú&wagtail.users.tests.CustomUserEditForm©ZWAGTAIL_USER_EDIT_FORMc              	   C   s.   |   td¡ tƒ }W 5 Q R X |  |t¡ d S ©Nz€The `WAGTAIL_USER_EDIT_FORM` setting is deprecated. Use a custom `UserViewSet` subclass and override `get_form_class()` instead.)r[   r0   r-   rT   rH   rU   r5   r5   r9   Ú(test_get_user_edit_form_with_custom_formo   s    þz<TestUserFormHelpers.test_get_user_edit_form_with_custom_formz6wagtail.users.tests.CustomUserCreationFormDoesNotExistc              	   C   s(   |   td¡ |  tt¡ W 5 Q R X d S rZ   )r[   r0   ÚassertRaisesr
   r,   ©rM   r5   r5   r9   Ú-test_get_user_creation_form_with_invalid_formy   s
    þzATestUserFormHelpers.test_get_user_creation_form_with_invalid_formz2wagtail.users.tests.CustomUserEditFormDoesNotExistc              	   C   s(   |   td¡ |  tt¡ W 5 Q R X d S r_   )r[   r0   ra   r
   r-   rb   r5   r5   r9   Ú)test_get_user_edit_form_with_invalid_form„   s
    þz=TestUserFormHelpers.test_get_user_edit_form_with_invalid_formN)
r<   r=   r>   rV   rW   r   r\   r`   rc   rd   r5   r5   r5   r9   rS   Z   s    ÿ
	
	ÿ
ÿrS   c                   @   s2   e Zd Zdd„ Zi dfdd„Zdd„ Zdd	„ ZdS )
ÚTestGroupUsersViewc                 C   sB   | j dddddd| _tjjdd| _| jj | j¡ |  ¡  d S )	NÚtestuserútestuser@email.comÚpasswordú
First Nameú	Last Name©ÚusernameÚemailrh   Ú
first_nameÚ	last_namez
Test Group©Úname)	Úcreate_userÚ	test_userr   ÚobjectsÚcreateÚ
test_groupÚgroupsÚaddÚloginrb   r5   r5   r9   ÚsetUp‘   s    ûzTestGroupUsersView.setUpNc                 C   s    | j  td|p| jjfd|¡S )Nzwagtailusers_groups:users©Úargs©ÚclientÚgetr   rv   Úpk©rM   ÚparamsÚgroup_idr5   r5   r9   r   ž   s     ÿüzTestGroupUsersView.getc              	   C   sX   |   td| jj› d| jj› d¡ |  ¡ }W 5 Q R X |  |tdƒd| jj›  ¡ d S )Nz9Accessing the list of users in a group via /admin/groups/z//users/ is deprecated, use /admin/users/?group=z	 instead.úwagtailusers_users:indexz?group=)r[   r0   rv   r€   r   ÚassertRedirectsr   ©rM   Úresponser5   r5   r9   Útest_simple¦   s    þþzTestGroupUsersView.test_simplec                 C   s   | j dd}|  |jd¡ d S )Né'  ©rƒ   é”  ©r   ÚassertEqualÚstatus_coder†   r5   r5   r9   Útest_inexisting_group´   s    z(TestGroupUsersView.test_inexisting_group)r<   r=   r>   rz   r   rˆ   r   r5   r5   r5   r9   re      s   re   c                   @   sŠ   e Zd Zdd„ Zi fdd„Zdd„ Ze ej	dkd¡d	d
„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestUserIndexViewc                 C   s$   | j dddddd| _|  ¡ | _d S ©Nrf   rg   rh   ri   rj   rk   )rr   rs   ry   r6   rb   r5   r5   r9   rz   º   s    ûzTestUserIndexView.setUpc                 C   s   | j  tdƒ|¡S ©Nr„   ©r~   r   r   ©rM   r‚   r5   r5   r9   r   Å   s    zTestUserIndexView.getc                 C   s\   |   ¡ }|  |jd¡ |  |d¡ |  |d¡ |  |d¡ |  dttjj	ƒdœg|j
¡ d S )NéÈ   úwagtailusers/users/index.htmlrf   z
Add a userÚ ©ÚurlrC   )r   r   rŽ   ÚassertTemplateUsedÚassertContainsÚassertBreadcrumbsItemsRenderedr   ÚUserÚ_metaÚverbose_name_pluralÚcontentr†   r5   r5   r9   rˆ   È   s    þzTestUserIndexView.test_simpleúemailuser.EmailUserzNegative UUID not possiblec                 C   sD   | j ddddd |  ¡ }|  |jd¡ |  |d¡ |  |d¡ d S )NZguardianzguardian@example.comúgu@rd14néÿÿÿÿ©r€   r•   rf   )rr   r   r   rŽ   r›   r†   r5   r5   r9   Útest_allows_negative_idsÔ   s
    z*TestUserIndexView.test_allows_negative_idsc                 C   sj   |   ddi¡}|  |jd¡ |  |jd d¡ |  |j¡}| d¡}|  dtdƒd fd	d
„ |D ƒ¡ d S )NÚqÚHellor•   Zquery_stringz.filter-options aZUsersr„   z?q=Helloc                 S   s    g | ]}|j  ¡ | d ¡f‘qS ©Úhref)ÚtextÚstripr   )Ú.0Úar5   r5   r9   Ú
<listcomp>ç   s     z1TestUserIndexView.test_search.<locals>.<listcomp>)	r   r   rŽ   ÚcontextÚget_soupr    ÚselectÚassertInr   )rM   r‡   ÚsoupZfilter_optionsr5   r5   r9   Útest_searchß   s    
þzTestUserIndexView.test_searchc                 C   s8   |   ddi¡}|  |jd¡ |jd }|  | j|¡ d S )Nr¦   z
first namer•   Úusers©r   r   rŽ   r¯   r²   rs   ©rM   r‡   Úresultsr5   r5   r9   Útest_search_query_one_fieldê   s    
z-TestUserIndexView.test_search_query_one_fieldc                 C   s8   |   ddi¡}|  |jd¡ |jd }|  | j|¡ d S )Nr¦   zfirst name last namer•   rµ   r¶   r·   r5   r5   r9   Ú!test_search_query_multiple_fieldsð   s    
z3TestUserIndexView.test_search_query_multiple_fieldsc                 C   s<   |   ddi¡}|  |jd¡ |   ddi¡}|  |jd¡ d S )NÚpé   r•   r‰   r‹   rŒ   r†   r5   r5   r9   Útest_paginationö   s    z!TestUserIndexView.test_paginationc                 C   s–   ddddt jt jfdt j› dt j› fdddd	d
dddddddi
}| ¡ D ]D\}}| j|d* |  d|i¡}|  |jd jj|¡ W 5 Q R X qLd S )Nrq   )ro   rn   z-name)z
-last_namez-first_nameú-Úis_superuser)r¿   ú-is_superuser)rÀ   Ú	is_active)rÁ   ú
-is_active)rÂ   Ú
last_login)rÃ   ú-last_login)rÄ   )ÚparamZorderingÚobject_list)	r   ZUSERNAME_FIELDÚitemsZsubTestr   r   Úcontext_dataÚqueryÚorder_by)rM   ZcasesrÅ   rÊ   r‡   r5   r5   r9   Útest_orderingþ   s8    	   
       öþzTestUserIndexView.test_orderingc                 C   sÔ  |   ¡ }|  |jd¡ |  |jd | j| jg¡ |   ddi¡}|  |jd¡ |  |jd | jg¡ |   ddi¡}|  |jd¡ |  |jd | jg¡ d| j_| j ¡  |   ddi¡}|  |jd¡ |  |jd | jg¡ |   ddi¡}|  |jd¡ |  |jd | jg¡ t	 
¡ }t	 |¡r.t	 |¡ ¡ }n| ¡ }|t	jdd }|t	jdd }|   d	t|ƒi¡}|  |jd¡ |  |jd | jg¡ |   d	t|ƒi¡}|  |jd¡ |  |jd g ¡ |   d
t|ƒi¡}|  |jd¡ |  |jd | jg¡ |   d
t|ƒi¡}|  |jd¡ |  |jd g ¡ tjjdd}tjjdd}| jj |¡ | jj |¡ |   d|ji¡}|  |jd¡ |  |jd | jg¡ |   d|j|jgi¡}|  |jd¡ |  |jd | j| jg¡ d S )Nr•   rÆ   r¿   TFrÁ   r¼   )ÚdaysZlast_login_fromZlast_login_toZ	Musiciansrp   ZSongwritersÚgroup)r   r   rŽ   ÚassertCountEqualr¯   rs   r6   rÁ   Úsaver   ÚnowZis_awareÚ	localtimeÚdateÚ	timedeltaÚstrr   rt   ru   rw   rx   r€   )rM   r‡   rÐ   ÚtodayZtomorrowZ	yesterdayZ	musiciansZsongwritersr5   r5   r9   Útest_filters  sf    
þ

þzTestUserIndexView.test_filtersc              	   C   sZ   |   ¡  d}|  |¡ |   ¡  W 5 Q R X |  ddd¡ |  |¡ |   ¡  W 5 Q R X d S )Né
   Útestztest@example.comr¢   )r   ÚassertNumQueriesrr   )rM   Znum_queriesr5   r5   r9   Útest_num_queries]  s    z"TestUserIndexView.test_num_queriesc                 C   s   |   ¡ }|  |j¡}| d¡}td| jjfdtd| jjfdtd| jjfdtd| jjfdtd| jjfdg}dd„ |D ƒ}|  ||¡ d S )Nz#li [data-controller='w-dropdown'] aúwagtailusers_users:editr{   úwagtailusers_users:copyúwagtailusers_users:deletec                 S   s   g | ]}|j  d ¡‘qS r¨   )Úattrsr   )r¬   Úbuttonr5   r5   r9   r®   v  s     z:TestUserIndexView.test_default_buttons.<locals>.<listcomp>)	r   r°   r    r±   r   r6   r€   rs   ZassertSequenceEqual)rM   r‡   r³   Údropdown_buttonsZexpected_urlsÚurlsr5   r5   r9   Útest_default_buttonsj  s    
úz&TestUserIndexView.test_default_buttonsc              	      sz  ‡ fdd„}ˆ   d|¡ ˆ  ¡ }W 5 Q R X ˆ  |jd¡ ˆ  |d¡ ˆ  |j¡}| dˆ jj	› d¡}ˆ  
|¡ dˆ jj	› }| d	¡}| d
|› d¡}ˆ  |¡ | d|› d¡}ˆ  
|¡ ˆ  |j ¡ d¡ | d¡}	ˆ  |	¡ | d¡}
ˆ  t|
ƒd¡ d }|
D ]}d|j ¡ kr
|}q
ˆ  
|¡ ˆ  | d¡j ¡ d¡ |jdddid}ˆ  
|¡ ˆ  |j ¡ d¡ d S )Nc                 3   sD   ˆ   |ˆ j¡ tdd| j› ddV  tdtddddgd	V  d S )
NúShow profileú/goes/to/a/url/é   ©Úpriorityú	Moar pls!ÚAlrightyú/cheersr×   )rC   Zbuttons)r   r6   r/   r€   r   ©r6   Zrequest_userrb   r5   r9   Úhookz  s    
ýþz1TestUserIndexView.test_buttons_hook.<locals>.hookÚregister_user_listing_buttonsr•   z wagtailadmin/shared/buttons.htmlztbody tr:has([data-object-id='z'])rä   ztd ul.actionsúli > a[href='ú']z*li [data-controller='w-dropdown'] a[href='rã   z@li [data-controller='w-dropdown'] [data-controller='w-dropdown']z#li > [data-controller='w-dropdown']é   rè   rß   r­   r©   rê   ©rÞ   ré   )Úregister_hookr   r   rŽ   rš   r°   r    Ú
select_oners   r€   ÚassertIsNotNoneÚassertIsNonerª   r«   r±   ÚlenÚfind)rM   rì   r‡   r³   ÚrowÚprofile_urlÚactionsÚtop_level_custom_buttonZcustom_buttonZnested_dropdownrà   Zcustom_dropdownrß   r5   rb   r9   Útest_buttons_hooky  sF    



ÿ
þÿ



z#TestUserIndexView.test_buttons_hookN)r<   r=   r>   rz   r   rˆ   ÚunittestÚskipIfr   ÚAUTH_USER_MODELr¥   r´   r¹   rº   r½   rË   rÖ   rÚ   râ   rü   r5   r5   r5   r9   r   ¹   s"    ÿ
Cr   c                   @   s(   e Zd Zdd„ Zi fdd„Zdd„ ZdS )ÚTestUserIndexResultsViewc                 C   s"   | j dddddd| _|  ¡  d S r‘   )rr   rs   ry   rb   r5   r5   r9   rz   ±  s    ûzTestUserIndexResultsView.setUpc                 C   s   | j  tdƒ|¡S )Nz wagtailusers_users:index_resultsr“   r”   r5   r5   r9   r   ¼  s    zTestUserIndexResultsView.getc                 C   s>   |   ¡ }|  |jd¡ |  |d¡ |  |d¡ |  |j¡ d S )Nr•   z%wagtailusers/users/index_results.htmlrf   )r   r   rŽ   rš   r›   ÚassertBreadcrumbsNotRenderedr    r†   r5   r5   r9   rˆ   ¿  s
    z$TestUserIndexResultsView.test_simpleN)r<   r=   r>   rz   r   rˆ   r5   r5   r5   r9   r   °  s   r   c                   @   s  e Zd Zdd„ Zi fdd„Zi dfdd„Zdd	„ Zd
d„ Ze 	e
jdkd¡edddd„ ƒƒZdd„ Zdd„ Zeddigddd„ ƒZdd„ Zedddd„ ƒZeddd d!„ ƒZeddd"d#„ ƒZeddd$d%„ ƒZedd&d'd(„ ƒZedd&d)d*„ ƒZd+d,„ Zd-d.„ Zd/d0„ Zd1S )2ÚTestUserCreateViewc                 C   s   |   ¡  d S rK   ©ry   rb   r5   r5   r9   rz   É  s    zTestUserCreateView.setUpc                 C   s   | j  tdƒ|¡S ©Núwagtailusers_users:addr“   r”   r5   r5   r9   r   Ì  s    zTestUserCreateView.getFc                 C   s   | j jtdƒ||dS )Nr  ©Úfollow©r~   Úpostr   ©rM   Ú	post_datar  r5   r5   r9   r	  Ï  s
      ÿzTestUserCreateView.postc                 C   sr   |   ¡ }|  |jd¡ |  |d¡ |  |d¡ |  |d¡ |  dttjj	ƒdœddttjj
ƒ› dœg|j¡ d S )	Nr•   úwagtailusers/users/create.htmlÚPasswordúPassword confirmationú/admin/users/r˜   r—   zNew: )r   r   rŽ   rš   r›   rœ   r   r   rž   rŸ   Zverbose_namer    r†   r5   r5   r9   rˆ   Ô  s    
þûøzTestUserCreateView.test_simplec                 C   st   | j dddddddœdd}|  |td	ƒ¡ tƒ jjdd
}|  | ¡ d¡ tj	dkrd|  
|d¡ n|  
|d¡ d S )Nrf   útest@user.comÚTestr   rh   ©rl   rm   rn   ro   Ú	password1Ú	password2Tr  r„   ©rm   r¼   r¡   z'User &#x27;test@user.com&#x27; created.z"User &#x27;testuser&#x27; created.©r	  r…   r   r   rt   Úfilterr   Úcountr   rÿ   r›   ©rM   r‡   rµ   r5   r5   r9   Útest_createå  s     ú÷
zTestUserCreateView.test_createúcustomuser.CustomUserúOnly applicable to CustomUserrX   rY   c                 C   s~   |   dddddddtddƒd	œ¡}|  |td
ƒ¡ tƒ jjdd}|  | ¡ d¡ |  | 	¡ j
d¡ |  | 	¡ j ¡ d¡ d S )Nrf   r  r  r   rh   Útestcountryútest.txtó   Uploaded file©rl   rm   rn   ro   r  r  rF   rG   r„   r  r¼   )r	  r   r…   r   r   rt   r  r   r  ÚfirstrF   rG   Úreadr  r5   r5   r9   Útest_create_with_custom_formý  s     øÿz/TestUserCreateView.test_create_with_custom_formc                 C   sJ   | j dddddddœdd | j ¡  d}tjd	kr8d}| j|dd
 dS )zPassword should not be strippedZ	testuser2ztest@user2.comr  r   z  whitespaced_password  r  Tr  r¡   ©rl   rh   N)r	  r~   Zlogoutr   rÿ   ry   )rM   rl   r5   r5   r9   Ú%test_create_with_whitespaced_password  s    ú÷

z8TestUserCreateView.test_create_with_whitespaced_passwordc              	   C   sl   |   dddddddœ¡}|  |jd¡ |  |d	¡ |  |jd
 jd ¡ tƒ jj	dd}|  | 
¡ d¡ d S )Nrf   r  r  r   r  r  r  r•   r  Úformr  r   ©r	  r   rŽ   rš   Ú
assertTruer¯   Úerrorsr   rt   r  r  r  r5   r5   r9   Ú"test_create_with_password_mismatch/  s    úÿz5TestUserCreateView.test_create_with_password_mismatchÚNAMEúHdjango.contrib.auth.password_validation.UserAttributeSimilarityValidator©ZAUTH_PASSWORD_VALIDATORSc              	   C   sˆ   |   dddddddœ¡}|  |jd¡ |  |d¡ |jd	 j ¡ }|  d
|¡ |  |d
 d jd¡ t	ƒ j
jdd}|  | ¡ d¡ dS )zó
        Test that the Django password validators are run when creating a user.
        Specifically test that the UserAttributeSimilarityValidator works,
        which requires a full-populated user model before the validation works.
        rf   r  ZExampleÚNamezexample namer  r•   r  r&  r  r   Úpassword_too_similarr  N)r	  r   rŽ   rš   r¯   r)  Úas_datar²   Úcoder   rt   r  r  )rM   r‡   r)  rµ   r5   r5   r9   Ú$test_create_with_password_validationE  s     úÿz7TestUserCreateView.test_create_with_password_validationc              	   C   sl   |   dddddddœ¡}|  |jd¡ |  |d¡ |  |jd	 jd
 ¡ tƒ jj	dd}|  | 
¡ d¡ dS )z&Password should be required by defaultrf   r  r  r   r—   r  r•   r  r&  r  r  r   Nr'  r  r5   r5   r9   Ú!test_create_with_missing_passwordk  s    úÿz4TestUserCreateView.test_create_with_missing_password)ZWAGTAILUSERS_PASSWORD_REQUIREDc                 C   s>   |   ¡ }|  |jd¡ |  |d¡ |  |d¡ |  |d¡ dS )zPPassword fields should still be shown if WAGTAILUSERS_PASSWORD_REQUIRED is Falser•   r  r  r  N)r   r   rŽ   rš   r›   r†   r5   r5   r9   Ú,test_password_fields_exist_when_not_required‚  s
    z?TestUserCreateView.test_password_fields_exist_when_not_requiredc              	   C   s^   |   dddddddœ¡}|  |tdƒ¡ tƒ jjdd}|  | ¡ d	¡ |  | ¡ j	d¡ d
S )zJPassword should not be required if WAGTAILUSERS_PASSWORD_REQUIRED is Falserf   r  r  r   r—   r  r„   r  r¼   N©
r	  r…   r   r   rt   r  r   r  r!  rh   r  r5   r5   r9   Ú&test_create_with_password_not_required‹  s    úÿz9TestUserCreateView.test_create_with_password_not_requiredc              	   C   sl   |   dddddddœ¡}|  |jd¡ |  |d	¡ |  |jd
 jd ¡ tƒ jj	dd}|  | 
¡ d¡ dS )zpWhen WAGTAILUSERS_PASSWORD_REQUIRED is False, password validation should still apply if a password _is_ suppliedrf   r  r  r   ÚbananaÚkumquatr  r•   r  r&  r  r  r   Nr'  r  r5   r5   r9   Ú)test_optional_password_is_still_validated¡  s    úÿz<TestUserCreateView.test_optional_password_is_still_validatedc              	   C   s`   |   dddddddœ¡}|  |tdƒ¡ tƒ jjdd}|  | ¡ d	¡ |  | 	¡  
d¡¡ d
S )zXWhen WAGTAILUSERS_PASSWORD_REQUIRED is False, we should still allow a password to be setrf   r  r  r   r7  r  r„   r  r¼   N)r	  r…   r   r   rt   r  r   r  r(  r!  Úcheck_passwordr  r5   r5   r9   Ú*test_password_still_accepted_when_optional¹  s    úÿz=TestUserCreateView.test_password_still_accepted_when_optional©ZWAGTAILUSERS_PASSWORD_ENABLEDc                 C   s>   |   ¡ }|  |jd¡ |  |d¡ |  |d¡ |  |d¡ dS )úNWAGTAILUSERS_PASSWORD_ENABLED=False should cause password fields to be removedr•   r  r  r  N©r   r   rŽ   rš   ÚassertNotContainsr†   r5   r5   r9   Ú,test_password_fields_not_shown_when_disabledÏ  s
    z?TestUserCreateView.test_password_fields_not_shown_when_disabledc              	   C   s^   |   dddddddœ¡}|  |tdƒ¡ tƒ jjdd	}|  | ¡ d
¡ |  | ¡ j	d¡ dS )zeWhen WAGTAILUSERS_PASSWORD_ENABLED is False, users should always be created without a usable passwordrf   r  r  r   r7  r8  r  r„   r  r¼   r—   Nr5  r  r5   r5   r9   Ú*test_password_fields_ignored_when_disabledØ  s    úÿz=TestUserCreateView.test_password_fields_ignored_when_disabledc              	      sT   ‡ fdd„}ˆ   d|¡ ˆ j tdƒ¡}W 5 Q R X ˆ  |jd¡ ˆ  |jd¡ d S )Nc                    s   ˆ   | t¡ tdƒS ©NzOverridden!©ÚassertIsInstancer   r   ©Úrequestrb   r5   r9   Ú	hook_funcï  s    zBTestUserCreateView.test_before_create_user_hook.<locals>.hook_funcÚbefore_create_userr  r•   ó   Overridden!)rò   r~   r   r   r   rŽ   r    ©rM   rG  r‡   r5   rb   r9   Útest_before_create_user_hookî  s
    z/TestUserCreateView.test_before_create_user_hookc              	      sh   ‡ fdd„}ˆ   d|¡* ddddddd	œ}ˆ j td
ƒ|¡}W 5 Q R X ˆ  |jd¡ ˆ  |jd¡ d S )Nc                    s   ˆ   | t¡ tdƒS rB  rC  rE  rb   r5   r9   rG  ù  s    zGTestUserCreateView.test_before_create_user_hook_post.<locals>.hook_funcrH  rf   útestuser@test.comÚ
password12rØ   r6   ©rl   rm   r  r  rn   ro   r  r•   rI  ©rò   r~   r	  r   r   rŽ   r    ©rM   rG  r  r‡   r5   rb   r9   Ú!test_before_create_user_hook_postø  s    úz4TestUserCreateView.test_before_create_user_hook_postc              	      sh   ‡ fdd„}ˆ   d|¡* ddddddd	œ}ˆ j td
ƒ|¡}W 5 Q R X ˆ  |jd¡ ˆ  |jd¡ d S )Nc                    s"   ˆ   | t¡ ˆ   |tƒ ¡ tdƒS rB  )rD  r   r   r   ©rF  r6   rb   r5   r9   rG    s    zATestUserCreateView.test_after_create_user_hook.<locals>.hook_funcZafter_create_userrf   rL  rM  rØ   r6   rN  r  r•   rI  rO  rP  r5   rb   r9   Útest_after_create_user_hook
  s    úz.TestUserCreateView.test_after_create_user_hookN)r<   r=   r>   rz   r   r	  rˆ   r  rý   Ú
skipUnlessr   rÿ   r   r#  r%  r*  r2  r3  r4  r6  r9  r;  r@  rA  rK  rQ  rS  r5   r5   r5   r9   r  È  sL   þÿ ÿÿÿ







r  c                   @   sf   e Zd Zdd„ Zi fdd„Zi 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S )ÚTestUserDeleteViewc                 C   s2   | j dddd| _| jdddd| _|  ¡ | _d S )Nrf   rg   rh   ©rl   rm   rh   Ztestsuperuserútestsuperuser@email.com)rr   rs   Úcreate_superuserÚ	superuserry   Úcurrent_userrb   r5   r5   r9   rz     s      ÿýzTestUserDeleteView.setUpc                 C   s   | j  td| jjfd|¡S ©NrÝ   r{   ©r~   r   r   rs   r€   r”   r5   r5   r9   r   ,  s     ÿzTestUserDeleteView.getFc                 C   s    | j jtd| jjfd||dS )NrÝ   r{   r  ©r~   r	  r   rs   r€   r
  r5   r5   r9   r	  1  s
    ýzTestUserDeleteView.postc                 C   sl   |   ¡ }|  |jd¡ |  |d¡ |  |j¡ |  |j¡}td| jj	fd}| 
d¡jd }|  ||¡ d S )Nr•   ú&wagtailusers/users/confirm_delete.htmlrÝ   r{   r&  Úaction)r   r   rŽ   rš   r  r    r°   r   rs   r€   ró   rÞ   )rM   r‡   r³   Z
delete_urlÚform_actionr5   r5   r9   rˆ   8  s    zTestUserDeleteView.test_simplec                 C   sd   | j dd}|  |tdƒ¡ tƒ jjdd}|  | ¡ d¡ tj	dkrT|  
|d¡ n|  
|d	¡ d S )
NTr  r„   rg   r  r   r¡   z,User &#x27;testuser@email.com&#x27; deleted.z"User &#x27;testuser&#x27; deleted.r  r  r5   r5   r9   Útest_deleteD  s    
 ÿzTestUserDeleteView.test_deletec                 C   sL   | j  td| jjfd¡}|  |tdƒ¡ |  tƒ jj	| jjd 
¡ ¡ d S ©NrÝ   r{   Úwagtailadmin_homer¤   )r~   r   r   rZ  r€   r…   r(  r   rt   r  Úexistsr†   r5   r5   r9   Útest_user_cannot_delete_selfT  s    ÿÿz/TestUserDeleteView.test_user_cannot_delete_selfc                 C   s‚   | j  td| jjfd¡}|  |jd¡ |  |d¡ | j  td| jjfd¡}|  	|tdƒ¡ t
ƒ jjdd}|  | ¡ d¡ d S )	NrÝ   r{   r•   r^  r„   rW  r  r   )r~   r   r   rY  r€   r   rŽ   rš   r	  r…   r   rt   r  r  r  r5   r5   r9   Ú$test_user_can_delete_other_superuser`  s    ÿÿz7TestUserDeleteView.test_user_can_delete_other_superuserc              	      s^   ‡ fdd„}ˆ   d|¡  ˆ j tdˆ jjfd¡}W 5 Q R X ˆ  |jd¡ ˆ  |jd¡ d S )Nc                    s&   ˆ   | t¡ ˆ  |jˆ jj¡ tdƒS rB  ©rD  r   r   r€   rs   r   rR  rb   r5   r9   rG  r  s    zBTestUserDeleteView.test_before_delete_user_hook.<locals>.hook_funcÚbefore_delete_userrÝ   r{   r•   rI  ©	rò   r~   r   r   rs   r€   r   rŽ   r    rJ  r5   rb   r9   Útest_before_delete_user_hookq  s    ÿz/TestUserDeleteView.test_before_delete_user_hookc              	      s^   ‡ fdd„}ˆ   d|¡  ˆ j tdˆ jjfd¡}W 5 Q R X ˆ  |jd¡ ˆ  |jd¡ d S )Nc                    s&   ˆ   | t¡ ˆ  |jˆ jj¡ tdƒS rB  rg  rR  rb   r5   r9   rG    s    zGTestUserDeleteView.test_before_delete_user_hook_post.<locals>.hook_funcrh  rÝ   r{   r•   rI  ©	rò   r~   r	  r   rs   r€   r   rŽ   r    rJ  r5   rb   r9   Ú!test_before_delete_user_hook_post€  s    ÿz4TestUserDeleteView.test_before_delete_user_hook_postc              	      s^   ‡ fdd„}ˆ   d|¡  ˆ j tdˆ jjfd¡}W 5 Q R X ˆ  |jd¡ ˆ  |jd¡ d S )Nc                    s&   ˆ   | t¡ ˆ  |jˆ jj¡ tdƒS rB  )rD  r   r   rm   rs   r   rR  rb   r5   r9   rG    s    zATestUserDeleteView.test_after_delete_user_hook.<locals>.hook_funcZafter_delete_userrÝ   r{   r•   rI  rk  rJ  r5   rb   r9   Útest_after_delete_user_hook  s    ÿz.TestUserDeleteView.test_after_delete_user_hookN)r<   r=   r>   rz   r   r	  rˆ   ra  re  rf  rj  rl  rm  r5   r5   r5   r9   rU    s   rU  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )Ú!TestUserDeleteViewForNonSuperuserc                 C   sˆ   | j dddd| _| j ddd| _tjjdd}|j tjj	d	d
¡ |j tjj	t
td¡ | jj |¡ |  ¡ | _| jddd d S )Nrf   rg   rh   rV  Údeleterr$  zUser deletersrp   Úaccess_admin©Úcodename©Úcontent_type__app_labelrr  )rr   rs   Údeleter_userr   rt   ru   Úpermissionsrx   r   r   r   Údelete_user_perm_codenamerw   Zcreate_test_userrY  ry   )rM   Zdeleters_groupr5   r5   r9   rz   ¢  s"      ÿþÿ
z'TestUserDeleteViewForNonSuperuser.setUpc                 C   sD   | j  td| jjfd¡}|  |jd¡ |  |d¡ |  |j	¡ d S )NrÝ   r{   r•   r^  )
r~   r   r   rs   r€   r   rŽ   rš   r  r    r†   r5   r5   r9   rˆ   ·  s    ÿz-TestUserDeleteViewForNonSuperuser.test_simplec                 C   sN   | j  td| jjfd¡}|  |tdƒ¡ tƒ jjdd}|  	| 
¡ d¡ d S )NrÝ   r{   r„   rg   r  r   )r~   r	  r   rs   r€   r…   r   rt   r  r   r  r  r5   r5   r9   ra  ¿  s    ÿz-TestUserDeleteViewForNonSuperuser.test_deletec                 C   sL   | j  td| jjfd¡}|  |tdƒ¡ |  tƒ jj	| jjd 
¡ ¡ d S rb  )r~   r	  r   ru  r€   r…   r(  r   rt   r  rd  r†   r5   r5   r9   re  Ë  s    ÿÿz>TestUserDeleteViewForNonSuperuser.test_user_cannot_delete_selfc                 C   sL   | j  td| jjfd¡}|  |tdƒ¡ |  tƒ jj	| jjd 
¡ ¡ d S rb  )r~   r	  r   rY  r€   r…   r(  r   rt   r  rd  r†   r5   r5   r9   Ú!test_user_cannot_delete_superuser×  s
    ÿzCTestUserDeleteViewForNonSuperuser.test_user_cannot_delete_superuserN)r<   r=   r>   rz   rˆ   ra  re  rx  r5   r5   r5   r9   rn  Ÿ  s
   rn  c                   @   s  e Zd Zdd„ Zi dfdd„Zi ddfdd„Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zeddigddd„ ƒZdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Ze ejd$kd%¡ed&d'd(d)„ ƒƒZe ejd*kd+¡d,d-„ ƒZedd.d/d0„ ƒZedd.d1d2„ ƒZd3d4„ Zd5d6„ Zd7d8„ ZdS )9ÚTestUserEditViewc                 C   s$   | j dddddd| _|  ¡ | _d S )Nrf   rg   ÚOriginalr   rh   ©rl   rm   rn   ro   rh   )rr   rs   ry   rZ  rb   r5   r5   r9   rz   ã  s    û	zTestUserEditView.setUpNc                 C   s    | j  td|p| jjfd|¡S ©NrÛ   r{   r\  ©rM   r‚   Úuser_idr5   r5   r9   r   ð  s    þzTestUserEditView.getFc                 C   s$   | j jtd|p| jjfd||dS )NrÛ   r{   r  r]  )rM   r  r~  r  r5   r5   r9   r	  ö  s
    ýzTestUserEditView.postc           	      C   sô   |   ¡ }|  |jd¡ |  |d¡ |  |d¡ |  |d¡ |  dttjj	ƒdœdddœg|j
¡ |  |j
¡}| d	¡}td
| jjfd}|jdd|id}|  |¡ td| jjfd}| d¡jd }|  ||¡ t| jƒ}|  | | j¡|¡ d S )Nr•   úwagtailusers/users/edit.htmlr  r  r  r˜   r—   zOriginal Userú.w-slim-headerúwagtailusers_users:historyr{   r­   r©   rñ   rÛ   r&  r_  )r   r   rŽ   rš   r›   rœ   r   r   rž   rŸ   r    r°   ró   r   rs   r€   r÷   rô   rÞ   r   rZ  Úget_edit_url)	rM   r‡   r³   ÚheaderÚhistory_urlÚhistory_linkZedit_urlr`  Ú
url_finderr5   r5   r9   rˆ   ý  s.    
þûø


zTestUserEditView.test_simplec              	   C   sP   |   td¡ | j d| jj› d¡}W 5 Q R X | j|d| jj› ddd d S )NzZUserViewSet's `/<pk>/` edit view URL pattern has been deprecated in favour of /edit/<pk>/.r  ú/z/admin/users/edit/i-  )rŽ   )r[   r0   r~   r   rs   r€   r…   r†   r5   r5   r9   Útest_legacy_url_redirect  s    ý"ýz)TestUserEditView.test_legacy_url_redirectc                 C   s,   t jdkrdnd}|  | j|djd¡ d S )Nr¡   z$99999999-9999-9999-9999-999999999999é † )r~  r‹   )r   rÿ   r   r   rŽ   )rM   Z
invalid_idr5   r5   r9   Útest_nonexistent_redirect,  s
    ÿýz*TestUserEditView.test_nonexistent_redirectc              	   C   s  | j ddddddddœdd	}|  |td
ƒ¡ tƒ jj| jjd}|  |j	d¡ |  
| d¡¡ tjdkrx|  |d¡ n|  |d¡ |  ¡ }|  |d¡ |  |j¡}| d¡}|  |¡ | d¡}|  |¡ |  |jddd| j ¡ › ¡ td| jjfd}| d|› d¡}|  |¡ d S )Nrf   r  ÚEditedr   ÚnewpasswordÚon©rl   rm   rn   ro   r  r  rÁ   Tr  r„   r¤   r¡   z'User &#x27;test@user.com&#x27; updated.z"User &#x27;testuser&#x27; updated.zEdited Userú[data-side-panel="status"]ú.w-help-text©r«   ú[0-9][0-9]:[0-9][0-9] by r  r{   úa[href="ú"])r	  r…   r   r   rt   r   rs   r€   r   rn   r(  r:  r   rÿ   r›   r°   r    ró   rô   ÚassertRegexÚget_textrZ  Úget_username)rM   r‡   r6   r³   Ústatus_panelÚlast_updatedr„  r…  r5   r5   r9   Útest_simple_post4  s@    ù	ö





þz!TestUserEditView.test_simple_postc              
   C   s`   |   ddddddddœ¡}|  |tdƒ¡ tƒ jj| jjd	}|  |j	d¡ |  
| d
¡¡ dS )z7Leaving password fields blank should leave it unchangedrf   r  r‹  r   r—   r  rŽ  r„   r¤   rh   N©r	  r…   r   r   rt   r   rs   r€   r   rn   r(  r:  ©rM   r‡   r6   r5   r5   r9   Útest_password_optional^  s    ùÿz'TestUserEditView.test_password_optionalc              
   C   s€   |   ddddddddœ¡}|  |jd	¡ |  |d
¡ |  |jd jd ¡ tƒ jj	| j
jd}|  |jd¡ |  | d¡¡ dS )z/Password fields should be validated if suppliedrf   r  r‹  r   r7  r8  r  rŽ  r•   r  r&  r  r¤   rz  rh   N)r	  r   rŽ   rš   r(  r¯   r)  r   rt   r   rs   r€   rn   r:  rœ  r5   r5   r9   Útest_passwords_matchs  s     ùÿz%TestUserEditView.test_passwords_matchr+  r,  r-  c              	   C   sš   |   dddddddœ¡}|  |jd¡ |  |d¡ |jd	 j ¡ }|  d
|¡ |  |d
 d jd¡ t	ƒ j
j| jjd}|  |jd¡ |  | d¡¡ dS )zò
        Test that the Django password validators are run when editing a user.
        Specifically test that the UserAttributeSimilarityValidator works,
        which requires a full-populated user model before the validation works.
        rf   r  r‹  r.  zedited namer  r•   r  r&  r  r   r/  r¤   rz  rh   N)r	  r   rŽ   rš   r¯   r)  r0  r²   r1  r   rt   r   rs   r€   rn   r(  r:  )rM   r‡   r)  r6   r5   r5   r9   Ú"test_edit_with_password_validation‹  s"    úÿz3TestUserEditView.test_edit_with_password_validationc              	   C   sj   |   dddddddœ¡}|  |tdƒ¡ tƒ jj| jjd}|  |j	d¡ |  
|jd	¡ |  
|jd	¡ d S )
Nrf   r  r‹  r   rh   r  r„   r¤   F)r	  r…   r   r   rt   r   rs   r€   r   rn   rT   r¿   rÁ   rœ  r5   r5   r9   Útest_edit_and_deactivate²  s    úÿz)TestUserEditView.test_edit_and_deactivatec                 C   s`   |   dddddddddœ¡}|  |tdƒ¡ tƒ jj| jjd	}|  |j	d
¡ |  |j
d
¡ d S )Nrf   r  r‹  r   rh   r  ©rl   rm   rn   ro   r  r  rÁ   r¿   r„   r¤   T)r	  r…   r   r   rt   r   rs   r€   rT   r¿   rÁ   rœ  r5   r5   r9   Útest_edit_and_make_superuserÌ  s    øÿz-TestUserEditView.test_edit_and_make_superuserc              	   C   sp   |   dddddddœ| jj¡}|  |tdƒ¡ tƒ jj| jjd}|  |j	d¡ |  
|jd¡ |  
|jd¡ d S )	Nútest@email.comúEdited Myselfr   r  )rl   rm   rn   ro   rÁ   r¿   r„   r¤   T©r	  rZ  r€   r…   r   r   rt   r   r   rn   rT   r¿   rÁ   rœ  r5   r5   r9   Útest_edit_selfå  s    ø
õzTestUserEditView.test_edit_selfc                 C   sv   |   dddddddddœ| jj¡}|  |tdƒ¡ tƒ jj| jjd}|  |j	d¡ | j
 tdƒ¡}|  |jd	¡ d S )
Nr£  r¤  r   Zc0rrecth0rser  r¡  r„   r¤   r•   )r	  rZ  r€   r…   r   r   rt   r   r   rn   r~   rŽ   rœ  r5   r5   r9   Ú*test_editing_own_password_does_not_log_out   s"    ø
õz;TestUserEditView.test_editing_own_password_does_not_log_outc                 C   sl   |   dddddœ| jj¡}|  |tdƒ¡ tƒ jj| jjd}|  |j	d¡ |  
|jd¡ |  
|jd¡ dS )	z`
        check that unsetting a user's own is_active or is_superuser flag has no effect
        r£  r¤  r   )rl   rm   rn   ro   r„   r¤   TNr¥  rœ  r5   r5   r9   Útest_cannot_demote_self  s    üóz(TestUserEditView.test_cannot_demote_selfr  r  r]   r^   c                 C   sx   |   dddddddtddƒd	œ¡}|  |td
ƒ¡ tƒ jj| jjd}|  	|j
d¡ |  	|jd¡ |  	|j ¡ d¡ d S )Nrf   r  r‹  r   rh   r  r  r  r   r„   r¤   )r	  r   r…   r   r   rt   r   rs   r€   r   rn   rF   rG   r"  rœ  r5   r5   r9   Útest_edit_with_custom_form:  s     øÿz+TestUserEditView.test_edit_with_custom_formr¡   zNot applicable to EmailUserc              	   C   s*   |   dddddddœ¡}|  |jd¡ d S )Nr—   r  ZTesetr   rh   r  r•   ©r	  r   rŽ   r†   r5   r5   r9   Útest_edit_validation_errorX  s    úÿz+TestUserEditView.test_edit_validation_errorr<  c                 C   s>   |   ¡ }|  |jd¡ |  |d¡ |  |d¡ |  |d¡ dS )r=  r•   r  r  r  Nr>  r†   r5   r5   r9   r@  k  s
    z=TestUserEditView.test_password_fields_not_shown_when_disabledc              
   C   s`   |   ddddddddœ¡}|  |td	ƒ¡ tƒ jj| jjd
}|  |j	d¡ |  
| d¡¡ dS )zXWhen WAGTAILUSERS_PASSWORD_REQUIRED is False, existing password should be left unchangedrf   r  r‹  r   r  r7  r8  )rl   rm   rn   ro   rÁ   r  r  r„   r¤   rh   Nr›  rœ  r5   r5   r9   rA  t  s    ùÿz;TestUserEditView.test_password_fields_ignored_when_disabledc              	      s^   ‡ fdd„}ˆ   d|¡  ˆ j tdˆ jjfd¡}W 5 Q R X ˆ  |jd¡ ˆ  |jd¡ d S )Nc                    s&   ˆ   | t¡ ˆ  |jˆ jj¡ tdƒS rB  rg  rR  rb   r5   r9   rG  Œ  s    z>TestUserEditView.test_before_edit_user_hook.<locals>.hook_funcÚbefore_edit_userrÛ   r{   r•   rI  ri  rJ  r5   rb   r9   Útest_before_edit_user_hook‹  s    ÿz+TestUserEditView.test_before_edit_user_hookc              	      sr   ‡ fdd„}ˆ   d|¡4 ddddddd	œ}ˆ j td
ˆ jjfd|¡}W 5 Q R X ˆ  |jd¡ ˆ  |jd¡ d S )Nc                    s&   ˆ   | t¡ ˆ  |jˆ jj¡ tdƒS rB  rg  rR  rb   r5   r9   rG  ›  s    zCTestUserEditView.test_before_edit_user_hook_post.<locals>.hook_funcr¬  rf   r  r‹  r   rh   r  rÛ   r{   r•   rI  rk  rP  r5   rb   r9   Útest_before_edit_user_hook_postš  s    ú ÿz0TestUserEditView.test_before_edit_user_hook_postc              	      sr   ‡ fdd„}ˆ   d|¡4 ddddddd	œ}ˆ j td
ˆ jjfd|¡}W 5 Q R X ˆ  |jd¡ ˆ  |jd¡ d S )Nc                    s&   ˆ   | t¡ ˆ  |jˆ jj¡ tdƒS rB  rg  rR  rb   r5   r9   rG  ²  s    zBTestUserEditView.test_after_edit_user_hook_post.<locals>.hook_funcZafter_edit_userrf   r  r‹  r   rh   r  rÛ   r{   r•   rI  rk  rP  r5   rb   r9   Útest_after_edit_user_hook_post±  s    ú ÿz/TestUserEditView.test_after_edit_user_hook_post)r<   r=   r>   rz   r   r	  rˆ   rˆ  rŠ  rš  r  rž  r   rŸ  r   r¢  r¦  r§  r¨  rý   rT  r   rÿ   r©  rþ   r«  r@  rA  r­  r®  r¯  r5   r5   r5   r9   ry  â  sR   * ÿÿÿ
  þÿ ÿ


ry  c                   @   s0   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	S )
ÚTestUserCopyViewc                 C   s   |   ¡ | _d S rK   ©ry   r6   rb   r5   r5   r9   rz   Ê  s    zTestUserCopyView.setUpc                 C   s2   | j dddddd| _tdt| jjƒgd| _d S )	Nrf   rg   rz  r   rh   r{  rÜ   r{   )rr   rs   r   r   r€   r™   ©Úclsr5   r5   r9   ÚsetUpTestDataÍ  s    ûzTestUserCopyView.setUpTestDatac                 C   s`   d| j _| j  ¡  tjjddd}| j j |¡ | j | j	¡}|  
|jd¡ |  |tdƒ¡ d S )NFÚwagtailadminrp  rs  i.  rc  )r6   r¿   rÏ   r   rt   r   Úuser_permissionsrx   r~   r™   r   rŽ   r…   r   )rM   Zadmin_permissionr‡   r5   r5   r9   Útest_without_permissionØ  s    
 ÿz(TestUserCopyView.test_without_permissionc                 C   sÚ   d| j _| j  ¡  | j j tjjdddtjjtt	d¡ | j
 | j¡}|  |jd¡ |  |j¡}| d¡}|  |j d¡d¡ | d	¡}|  |j d¡d
¡ | d¡}| d¡}|  |j d¡¡ |  |j d¡¡ d S )NFrµ  rp  rs  r•   zinput[name="first_name"]Úvaluerz  zinput[name="last_name"]r   zinput[name="password1"]zinput[name="password2"])r6   r¿   rÏ   r¶  rx   r   rt   r   r   Úadd_user_perm_codenamer~   r™   r   rŽ   r°   r    ró   rÞ   rõ   )rM   r‡   r³   rn   ro   r  r  r5   r5   r9   Útest_with_minimal_permissionä  s.    
 ÿþü



z-TestUserCopyView.test_with_minimal_permissionN)r<   r=   r>   rz   Úclassmethodr´  r·  rº  r5   r5   r5   r9   r°  É  s
   

r°  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestUserProfileCreationc                 C   s   | j ddd| _d S )Nrf   rh   r$  )rr   rs   rb   r5   r5   r9   rz     s    þzTestUserProfileCreation.setUpc              	   C   s@   |   tjj| jd ¡ d¡ |  tj¡ | jj W 5 Q R X d S )N©r6   r   )	r   r(   rt   r  rs   r  ra   ZDoesNotExistZwagtail_userprofilerb   r5   r5   r9   Ú!test_user_created_without_profile  s    z9TestUserProfileCreation.test_user_created_without_profilec                 C   s4   |   t | j¡t¡ |  tjj| jd ¡ d¡ d S )Nr½  r¼   )rD  r(   Úget_for_userrs   r   rt   r  r  rb   r5   r5   r9   Ú,test_user_profile_created_when_method_called  s    zDTestUserProfileCreation.test_user_profile_created_when_method_calledc                 C   s   t  | j¡}|  |j¡ d S rK   )r(   r¿  rs   ÚassertFalseZavatar)rM   Zuser_profiler5   r5   r9   Ú%test_avatar_empty_on_profile_creation  s    z=TestUserProfileCreation.test_avatar_empty_on_profile_creationN)r<   r=   r>   rz   r¾  rÀ  rÂ  r5   r5   r5   r9   r¼     s   r¼  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestUserEditViewForNonSuperuserc                 C   sl   | j ddd| _tjjdd}|j tjjdd¡ |j tjjt	t
d¡ | jj |¡ | jddd d S )	NÚeditorrh   r$  úUser editorsrp   rp  rq  rs  )rr   Úeditor_userr   rt   ru   rv  rx   r   r   r   Úchange_user_perm_codenamerw   ry   )rM   Úeditors_groupr5   r5   r9   rz     s    þÿz%TestUserEditViewForNonSuperuser.setUpc              
   C   s¢   t jjdd}dddddd|jgddd	œ	}| j td
| jjfd|¡}|  	|tdƒ¡ t
ƒ jj| jjd}|  |jjdd ¡ ¡ |  |jd¡ |  |jd¡ dS )ac  
        Check that a non-superuser cannot edit their own is_active or is_superuser flag.
        (note: this doesn't necessarily guard against other routes to escalating privileges, such
        as creating a new user with is_superuser=True or adding oneself to a group with additional
        privileges - the latter will be dealt with by #537)
        rÅ  rp   rÄ  zeditor@email.comZ
Escalatingr   r—   r  )	rl   rm   rn   ro   r  r  rw   r¿   rÁ   rÛ   r{   r„   r¤   FN)r   rt   r   Úidr~   r	  r   rÆ  r€   r…   r   r(  rw   r  rd  r   rn   rT   r¿   )rM   rÈ  r  r‡   r6   r5   r5   r9   Ú$test_user_cannot_escalate_privileges'  s*    ÿô ÿzDTestUserEditViewForNonSuperuser.test_user_cannot_escalate_privilegesN)r<   r=   r>   rz   rÊ  r5   r5   r5   r9   rÃ    s   rÃ  c                   @   s(   e Zd Zedd„ ƒZdd„ Zdd„ ZdS )ÚTestUserHistoryViewc                 C   s.   | j dddddd| _td| jjfd| _d S )	Nrf   rg   rz  r   rh   r{  r  r{   )rr   rs   r   r€   r™   r²  r5   r5   r9   r´  Q  s    ûz!TestUserHistoryView.setUpTestDatac                 C   s   |   ¡ | _d S rK   r±  rb   r5   r5   r9   rz   \  s    zTestUserHistoryView.setUpc                 C   sX   t | jd| jd t | jd| jd | j | j¡}|  d¡ |  |d¡ |  |d¡ d S ©Nzwagtail.creater½  zwagtail.editz!wagtailadmin/generic/listing.htmlÚCreatedr‹  )r   rs   r6   r~   r   r™   rš   r›   r†   r5   r5   r9   rˆ   _  s    
zTestUserHistoryView.test_simpleN©r<   r=   r>   r»  r´  rz   rˆ   r5   r5   r5   r9   rË  N  s   

rË  c                   @   s8   e Zd Zdd„ Zi fdd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestGroupIndexViewc                 C   s   |   ¡  d S rK   r  rb   r5   r5   r9   rz   i  s    zTestGroupIndexView.setUpc                 C   s   | j  tdƒ|¡S )Núwagtailusers_groups:indexr“   r”   r5   r5   r9   r   l  s    zTestGroupIndexView.getc                 C   sT   |   ¡ }|  |jd¡ |  |d¡ |  |d¡ |  |d¡ |  dddœg|j¡ d S )Nr•   zwagtailusers/groups/index.htmlzwagtailadmin/generic/index.htmlzAdd a groupr—   ÚGroupsr˜   )r   r   rŽ   rš   r›   rœ   r    r†   r5   r5   r9   rˆ   o  s    
 ÿzTestGroupIndexView.test_simplec                 C   s:   |   ddi¡}|  |jd¡ |  |jd d  ¡ d¡ d S ©Nr¦   r§   r•   Zsearch_form©r   r   rŽ   r¯   r¸  r†   r5   r5   r9   r´   z  s    zTestGroupIndexView.test_searchc                 C   s@   t jjdd |  ¡ }dd„ |jd D ƒ}|  |dddg¡ d S )NZPhotographersrp   c                 S   s   g | ]
}|j ‘qS r5   rp   )r¬   rÍ   r5   r5   r9   r®   …  s     z<TestGroupIndexView.test_default_ordering.<locals>.<listcomp>rÆ   ZEditorsZ
Moderators)r   rt   ru   r   rÈ   r   )rM   r‡   Únamesr5   r5   r9   Útest_default_ordering  s    z(TestGroupIndexView.test_default_orderingN)r<   r=   r>   rz   r   rˆ   r´   rÕ  r5   r5   r5   r9   rÏ  h  s
   rÏ  c                   @   s0   e Zd Zdd„ Zi fdd„Zdd„ Zdd„ Zd	S )
ÚTestGroupIndexResultsViewc                 C   s   |   ¡  d S rK   r  rb   r5   r5   r9   rz   Š  s    zTestGroupIndexResultsView.setUpc                 C   s   | j  tdƒ|¡S )Nz!wagtailusers_groups:index_resultsr“   r”   r5   r5   r9   r     s    zTestGroupIndexResultsView.getc                 C   s2   |   ¡ }|  |jd¡ |  |d¡ |  |j¡ d S )Nr•   z)wagtailadmin/generic/listing_results.html)r   r   rŽ   rš   r  r    r†   r5   r5   r9   rˆ     s    z%TestGroupIndexResultsView.test_simplec                 C   s:   |   ddi¡}|  |jd¡ |  |jd d  ¡ d¡ d S rÒ  rÓ  r†   r5   r5   r9   r´   —  s    z%TestGroupIndexResultsView.test_searchN)r<   r=   r>   rz   r   rˆ   r´   r5   r5   r5   r9   rÖ  ‰  s   rÖ  c                   @   sœ   e Zd Zdd„ Zi fdd„Zi 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d„ Zdd„ Zdd „ Zd!d"„ Zd#S )$ÚTestGroupCreateViewc                 C   s0   |   ¡  tjjddd| _tjjddd| _d S )NÚwagtaildocsÚadd_documentrs  Úchange_document)ry   r   rt   r   Úadd_doc_permissionÚchange_doc_permissionrb   r5   r5   r9   rz   ž  s     ÿ ÿzTestGroupCreateView.setUpc                 C   s   | j  tdƒ|¡S )Núwagtailusers_groups:addr“   r”   r5   r5   r9   r   §  s    zTestGroupCreateView.getc                 C   sj   dgdgdgdgdgdgdgdgdgdgdgdgdœ}|  ¡ D ]\}}| ||¡||< q>| j tdƒ|¡S )NÚ0Ú1000)úpage_permissions-TOTAL_FORMSúpage_permissions-MAX_NUM_FORMSúpage_permissions-INITIAL_FORMSú"collection_permissions-TOTAL_FORMSú$collection_permissions-MAX_NUM_FORMSú$collection_permissions-INITIAL_FORMSú document_permissions-TOTAL_FORMSú"document_permissions-MAX_NUM_FORMSú"document_permissions-INITIAL_FORMSúimage_permissions-TOTAL_FORMSúimage_permissions-MAX_NUM_FORMSúimage_permissions-INITIAL_FORMSrÝ  )rÇ   r   r~   r	  r   )rM   r  Úpost_defaultsÚkÚvr5   r5   r9   r	  ª  s     ôzTestGroupCreateView.postc                 C   sl   |   ¡ }|  |jd¡ |  |d¡ |  dddœdddœg|j¡ tdƒ}td	ƒ}|  ||¡ |  ||¡ d S )
Nr•   zwagtailusers/groups/create.htmlú/admin/groups/rÑ  r˜   r—   z
New: Groupúwagtailadmin/js/page-chooser.jsúwagtailusers/js/group-form.js)r   r   rŽ   rš   rœ   r    r   r›   )rM   r‡   Úpage_chooser_jsÚgroup_form_jsr5   r5   r9   rˆ   ½  s    þûzTestGroupCreateView.test_simplec              	   C   s*   |   ¡  |  d¡ |   ¡  W 5 Q R X d S )Né   ©r   rÙ   rb   r5   r5   r9   rÚ   Î  s    z$TestGroupCreateView.test_num_queriesc                 C   s@   |   ddi¡}|  |tdƒ¡ tjjdd}|  | ¡ d¡ d S )Nrq   ú
test grouprÐ  rp   r¼   )r	  r…   r   r   rt   r  r   r  )rM   r‡   rw   r5   r5   r9   Útest_create_groupÔ  s    z%TestGroupCreateView.test_create_groupc              
   C   s†   |   ddgddgdgt ¡ jg| jjgdgdœ¡}|  |tdƒ¡ tjj	dd}|  
|j ¡  ¡ d¡ |  
|jj| jd	 ¡ d
¡ d S )Nrö  Ú1Úchange_pageÚpublish_page)rq   úpage_permissions-0-pageúpage_permissions-0-permissionsrà  ú!document_permissions-0-collectionú"document_permissions-0-permissionsræ  rÐ  rp   rð   ©Ú
permissionr¼   )r	  r   Úget_first_root_noder€   rÛ  r…   r   r   rt   r   r   Úpage_permissionsÚallr  Úcollection_permissionsr  ©rM   r‡   Z	new_groupr5   r5   r9   Ú$test_group_create_adding_permissionsÞ  s(    ÿ÷ÿÿüz8TestGroupCreateView.test_group_create_adding_permissionsc              	   C   sJ   |   ddgdgdgdgdgdœ¡}|  |jd¡ |  |jd d	 j¡ d S )
Nrö  rø  rú  rù  Ú2)rq   rû  rü  úpage_permissions-1-pageúpage_permissions-1-permissionsrà  r•   Úpermission_panelsr   )r	  r   rŽ   r(  r¯   Únon_form_errorsr†   r5   r5   r9   Ú%test_duplicate_page_permissions_errorù  s    úÿz9TestGroupCreateView.test_duplicate_page_permissions_errorc              	   C   sf   t  ¡ }|  d|jg| jjg|jg| jjgdgdœ¡}|  |jd¡ |  t	dd„ |j
d D ƒƒ¡ d S )Nrö  r  )rq   rý  rþ  ú!document_permissions-1-collectionú"document_permissions-1-permissionsræ  r•   c                 s   s   | ]}t |d ƒo|jV  qdS ©r  N©Úhasattrr  ©r¬   Úpanelr5   r5   r9   Ú	<genexpr>  s   ÿzPTestGroupCreateView.test_duplicate_document_permissions_error.<locals>.<genexpr>r
  )r   r  r	  r€   rÛ  rÜ  r   rŽ   r(  Úanyr¯   )rM   Úroot_collectionr‡   r5   r5   r9   Ú)test_duplicate_document_permissions_error
  s     úÿþÿz=TestGroupCreateView.test_duplicate_document_permissions_errorc                 C   sr   |   ddgdgdgdgdœ¡}|  |tdƒ¡ tjjdd}|  |j ¡  	¡ d¡ |  |j
j| jd 	¡ d¡ d S )	Nrö  r—   rø  )rq   rû  rà  rý  ræ  rÐ  rp   r   rÿ  )r	  r…   r   r   rt   r   r   r  r  r  r  r  rÛ  r  r5   r5   r9   Ú%test_can_submit_blank_permission_form#  s"    ûÿ
ÿüz9TestGroupCreateView.test_can_submit_blank_permission_formc                 C   sl   t j tddtddB tddB tddB ¡ ¡  t jjdddd	 ¡  |  ¡ }| jd
|j 	¡ dd d S )Nrx   ©Zcodename__startswithÚchangeÚdeleteÚpublishÚchange_textÚtestsÚcustompermissionmodel©rr  rt  Zcontent_type__modelúCustom permissionsr   ©r  )
r   rt   Úexcluder   r  r  r   ÚassertInHTMLr    Údecoder†   r5   r5   r9   Útest_custom_permissions_hidden;  s     ÿþýÿý
z2TestGroupCreateView.test_custom_permissions_hiddenc                 C   s   |   ¡ }|  d|j ¡ ¡ d S )Nr!  )r   r$  r    r%  r†   r5   r5   r9   Útest_custom_permissions_shownO  s    z1TestGroupCreateView.test_custom_permissions_shownc                 C   sF   |   ¡ }|j ¡ }|  d|¡ |  d|¡ |  d|¡ |  d|¡ d S ©Nú<th>Publish</th>úCan publish draft state modelú0Can publish draft state custom primary key modelúCan publish advert©r   r    r%  r$  ÚassertNotInHTML©rM   r‡   Úhtmlr5   r5   r9   Útest_show_publish_permissionsT  s    
z1TestGroupCreateView.test_show_publish_permissionsc                 C   sX   t jjdd ¡  |  ¡ }|j ¡ }|  d|¡ |  d|¡ |  d|¡ |  d|¡ d S ©Nr  r  r)  r*  r+  r,  ©r   rt   r  r  r   r    r%  r.  r/  r5   r5   r9   Útest_hide_publish_permissionsb  s    
z1TestGroupCreateView.test_hide_publish_permissionsc                 C   sx   |   ¡ }|  |d¡ |  |d¡ |  |d¡ |  |d¡ |  |d¡ |  |d¡ |  |d¡ |  |d¡ |  |d	¡ d
S )zÃ
        https://github.com/wagtail/wagtail/issues/10982
        Ensure model name or verbose name is stripped from permissions' labels
        for consistency with built-in permissions.
        zCan bulk updatezCan start troublezCause chaos forzChange textZManagezCan bulk_updatez)Can bulk update ADVANCED permission modelz)Cause chaos for advanced permission modelzManage custom permission modelN)r   r›   r?  r†   r5   r5   r9   Ú-test_strip_model_name_from_custom_permissionss  s    zATestGroupCreateView.test_strip_model_name_from_custom_permissionsc                 C   s¤   |   ¡ }|  |j¡}tjj dddd}tjj dddd}|  | d|j› d¡¡ |  | d|j› d¡¡ |  | d|j› d¡¡ |  | d|j› d¡¡ d	S )
z¸
        https://github.com/wagtail/wagtail/issues/11650
        Ensure that permissions with the same action (part before the first _ in
        the codename) are not hidden.
        Zchange_custompermissionmodelr  r  r   r  ztd > input[value="r”  ztd > fieldset input[value="N)	r   r°   r    r   rt   rô   ró   r€   rõ   )rM   r‡   r³   Zmain_change_permissionZcustom_change_permissionr5   r5   r9   Ú test_permission_with_same_action…  s4    ýýÿÿÿÿÿz4TestGroupCreateView.test_permission_with_same_actionc              	      sÀ   t j t¡‰ tjjddˆ d}|  d‡ fdd„¡ |  ¡ }W 5 Q R X |  |j	¡}| 
d¡}|  |¡ | 
d|j› d	¡}|  |¡ | 
d
|j d¡› d	¡}|  |¡ |  |jddd¡ dS )zÀ
        https://github.com/wagtail/wagtail/issues/8086
        Allow custom permissions using Wagtail's Admin content type to be
        displayed in the "Other permissions" section.
        Úroadmap_syncz"Can sync roadmap items from GitHub)rr  rq   Úcontent_typeÚregister_permissionsc                      s   t jjdˆ dS )Nr7  )rr  r8  )r   rt   r  r5   ©Zadmin_ctr5   r9   Ú<lambda>»  s    ÿzcTestGroupCreateView.test_custom_other_permissions_with_wagtail_admin_content_type.<locals>.<lambda>z#other-permissions-sectionzinput[value="r”  zlabel[for="rÉ  Tr‘  N)r	   rt   Úget_for_modelr   r   ru   rò   r   r°   r    ró   rô   r€   rÞ   r   r–  )rM   Úcustom_permissionr‡   r³   Zother_permissionsZcustom_checkboxZcustom_labelr5   r:  r9   Ú=test_custom_other_permissions_with_wagtail_admin_content_type¬  s4    ý
þ

ÿ
ÿ

 ÿzQTestGroupCreateView.test_custom_other_permissions_with_wagtail_admin_content_typeN)r<   r=   r>   rz   r   r	  rˆ   rÚ   r÷  r  r  r  r  r&  r'  r1  r4  r5  r6  r>  r5   r5   r5   r9   r×    s"   	
'r×  c                   @   sø   e Zd Zdd„ Zi dfdd„Zi 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d„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ ZdS ):ÚTestGroupEditViewc                 C   s
  t jjdd| _tjjdd| _tjj| jd| jd| _tjjdd| _	t
j ¡ | _t d¡D ]}| j|ƒ B | _q^| j d	¡d
 | _| j d	¡d | _| jj | j¡ t ¡ | _| jjdd| _t
jjddd| _t
jjddd| _tjj| j| j| jd |  ¡ | _d S )Nrö  rp   r¼   r¤   rx   ©ÚpageZpermission_typerÍ   rð   r9  r€   r   z
Evil plansrØ  rÙ  rs  rÚ  )rÍ   Z
collectionr   )r   rt   ru   rv   r"   r   Ú	root_pager!   Zroot_add_permissionÚ	home_pager   ÚnoneÚregistered_permissionsr   Ú	get_hooksrÊ   Úexisting_permissionÚanother_permissionrv  rx   r   r  r  Ú	add_childÚevil_plans_collectionrÛ  rÜ  r    ry   r6   )rM   Úfnr5   r5   r9   rz   Õ  s<      ÿ
 ÿ ÿýzTestGroupEditView.setUpNc                 C   s    | j  td|p| jjfd|¡S )Núwagtailusers_groups:editr{   r}   r   r5   r5   r9   r   ù  s    þzTestGroupEditView.getc                 C   sž   d| j jgdgdgdg| jjgdgdgdgdg| jjg| jjgdgdgdgdgdgdgdœ}| ¡ D ]\}}| ||¡||< qd| j t	d|p’| j
jfd|¡S )	Nrö  rø  rß  Úadd_pagerÞ  )rq   rv  rà  rá  râ  rû  rü  ræ  rç  rè  rý  rþ  ré  rê  rë  rã  rä  rå  rL  r{   )rG  r€   rB  rJ  rÛ  rÇ   r   r~   r	  r   rv   )rM   r  rƒ   rì  rí  rî  r5   r5   r9   r	  ÿ  s2    îþzTestGroupEditView.postc                 C   s2   t jj| jd| _| jd | _| jj | j¡ d S )N)Zpk__inr   )	r   rt   r#  rE  Znon_registered_permsÚnon_registered_permrv   rv  rx   rb   r5   r5   r9   Úadd_non_registered_perm  s
    ÿz)TestGroupEditView.add_non_registered_permc           
      C   sà   |   ¡ }|  |jd¡ |  |d¡ |  dddœdt| jƒdœg|j¡ tdƒ}tdƒ}|  	||¡ |  	||¡ |  
|j¡}| d	¡}td
| jjfd}|jdd|id}|  |¡ t| jƒ}d| jj }	|  | | j¡|	¡ d S )Nr•   zwagtailusers/groups/edit.htmlrï  rÑ  r˜   r—   rð  rñ  r€  úwagtailusers_groups:historyr{   r­   r©   rñ   z/admin/groups/edit/%d/)r   r   rŽ   rš   rœ   rÔ   rv   r    r   r›   r°   ró   r   r€   r÷   rô   r   r6   rÉ  r‚  )
rM   r‡   rò  ró  r³   rƒ  r„  r…  r†  Zexpected_urlr5   r5   r9   rˆ   '  s.    þûø


zTestGroupEditView.test_simplec              	   C   s*   |   ¡  |  d¡ |   ¡  W 5 Q R X d S )Né    rõ  rb   r5   r5   r9   rÚ   E  s    z"TestGroupEditView.test_num_queriesc                 C   s   |   | jddjd¡ d S )Nr‰  rŠ   r‹   )r   r   rŽ   rb   r5   r5   r9   Útest_nonexistent_group_redirectK  s    z1TestGroupEditView.test_nonexistent_group_redirectc                 C   sØ   |   ddi¡}|  |tdƒ¡ tjj| jjd}|  |j	d¡ |  ¡ }|  
|d¡ |  |j¡}| d¡}|  |¡ | d¡}|  |¡ |  |jddd	| j ¡ › ¡ td
| jjfd}| d|› d¡}|  |¡ d S )Nrq   ztest group editedrÐ  r¤   r  r  Tr‘  r’  rP  r{   r“  r”  )r	  r…   r   r   rt   r   rv   r€   r   rq   r›   r°   r    ró   rô   r•  r–  r6   r—  )rM   r‡   rÍ   r³   r˜  r™  r„  r…  r5   r5   r9   Útest_group_editN  s$    




þz!TestGroupEditView.test_group_editc                 C   s    |   ddi¡}|  |jd¡ d S )Nrq   r—   r•   rª  r†   r5   r5   r9   Ú test_group_edit_validation_errori  s    z2TestGroupEditView.test_group_edit_validation_errorc                 C   sP   |   | jj ¡ d¡ |  ddddgi¡}|  |tdƒ¡ |   | jj ¡ d¡ d S )Nr¼   rü  rM  rú  rù  rÐ  é   ©r   rv   r  r  r	  r…   r   r†   r5   r5   r9   Ú1test_group_edit_adding_page_permissions_same_pagep  s    ýÿÿ
zCTestGroupEditView.test_group_edit_adding_page_permissions_same_pagec                 C   sf   |   | jjjdd ¡ d¡ |  d| jj| jjgi¡}|  	|t
dƒ¡ |   | jjjdd ¡ d¡ d S )NrØ  ©Z#permission__content_type__app_labelr¼   rþ  rÐ  rð   )r   rv   r  r  r  r	  rÛ  r€   rÜ  r…   r   r†   r5   r5   r9   Ú;test_group_edit_adding_document_permissions_same_collection‚  s(    ÿüþÿÿ	ÿüzMTestGroupEditView.test_group_edit_adding_document_permissions_same_collectionc                 C   sr   |   | jjjdd ¡ d¡ |  dg| jjg| jj| j	jgdœ¡}|  
|tdƒ¡ |   | jjjdd ¡ d¡ d S )NrØ  rX  r¼   r  )ræ  r  r  rÐ  rU  )r   rv   r  r  r  r	  r  r€   rÛ  rÜ  r…   r   r†   r5   r5   r9   Ú@test_group_edit_adding_document_permissions_different_collectionž  s*    ÿüþýÿÿüzRTestGroupEditView.test_group_edit_adding_document_permissions_different_collectionc                 C   sL   |   | jj ¡ d¡ |  ddgi¡}|  |tdƒ¡ |   | jj ¡ d¡ d S )Nr¼   zpage_permissions-0-DELETErø  rÐ  r   rV  r†   r5   r5   r9   Ú)test_group_edit_deleting_page_permissions¼  s     ÿÿz;TestGroupEditView.test_group_edit_deleting_page_permissionsc                 C   s\   |   | jjjdd ¡ d¡ |  ddgi¡}|  |tdƒ¡ |   | jjjdd ¡ d¡ d S )NrØ  rX  r¼   zdocument_permissions-0-DELETErø  rÐ  r   )r   rv   r  r  r  r	  r…   r   r†   r5   r5   r9   Ú-test_group_edit_deleting_document_permissionsÊ  s$    ÿü ÿÿÿüz?TestGroupEditView.test_group_edit_deleting_document_permissionsc                 C   s*   |   ¡ }| jd| jj |j ¡ dd d S )Nz=<input name="permissions" type="checkbox" checked value="%s">T)Zallow_extra_attrs)r   ZassertTagInHTMLrG  rÉ  r    r%  r†   r5   r5   r9   Ú3test_group_edit_loads_with_django_permissions_shownâ  s    ÿüzETestGroupEditView.test_group_edit_loads_with_django_permissions_shownc                 C   s0   | j jtddd |  ¡ }| j|ddd d S )NzEviler Plansrp   )Úinstancez->&nbsp;&nbsp;&nbsp;&nbsp;&#x21b3 Eviler Plansé   r"  )rJ  rI  r   r   r›   r†   r5   r5   r9   Ú+test_group_edit_displays_collection_nestingî  s      ÿz=TestGroupEditView.test_group_edit_displays_collection_nestingc                 C   sö  |   | jj ¡ d¡ |  ¡ }|jd d }|   |jd  ¡ d¡ |   |jd d  ¡ | j	j
¡ |   |jd d  ¡ dg¡ tjj| j	d| jd	 |   | jj ¡ d
¡ |  ¡ }|jd d }|   |jd  ¡ d¡ |   t|jƒd¡ |   |jd d  ¡ | j	j
¡ |   t|jd d  ¡ ƒddh¡ tjj| jd| jd	 |   | jj ¡ d¡ |  ¡ }|jd d }|   |jd  ¡ d
¡ |   |jd d  ¡ | j	j
¡ |   t|jd d  ¡ ƒddh¡ |   |jd d  ¡ | jj
¡ |   |jd d  ¡ dg¡ d S )Nr¼   r
  r   ZINITIAL_FORMSrA  rv  rM  r  r@  rð   rù  rU  )r   rv   r  r  r   r¯   Zmanagement_formr¸  r   rB  r€   r!   rt   ru   rö   ÚsetrC  )rM   r‡   Zpage_permissions_formsetr5   r5   r9   Ú1test_group_edit_loads_with_page_permissions_shownú  s€     ÿ ÿ ÿ  ÿ ÿ ÿþ  ÿ ÿ ÿþ ÿ ÿzCTestGroupEditView.test_group_edit_loads_with_page_permissions_shownc                 C   sD   |   | jjgdgdgdœ¡}|  |jd¡ |  |jd d j¡ d S )Nrù  r  )r  r	  rà  r•   r
  r   )r	  rB  r€   r   rŽ   r(  r¯   r  r†   r5   r5   r9   r  >	  s    ýÿz7TestGroupEditView.test_duplicate_page_permissions_errorc                 C   sN   |   | jjg| jgdgdœ¡}|  |jd¡ |  tdd„ |jd D ƒƒ¡ d S )Nr  )zdocument_permissions-1-pager  ræ  r•   c                 s   s   | ]}t |d ƒo|jV  qdS r  r  r  r5   r5   r9   r  Y	  s   ÿzNTestGroupEditView.test_duplicate_document_permissions_error.<locals>.<genexpr>r
  )	r	  rJ  r€   rÜ  r   rŽ   r(  r  r¯   r†   r5   r5   r9   r  L	  s    ýÿþÿz;TestGroupEditView.test_duplicate_document_permissions_errorc                 C   sV   |   | jj ¡ d¡ |  d| jj| jjgi¡}|  |t	dƒ¡ |   | jj ¡ d¡ d S )Nr¼   rv  rÐ  rð   )
r   rv   rv  r  r	  rG  r€   rH  r…   r   r†   r5   r5   r9   Ú,test_group_add_registered_django_permissions_	  s    ÿz>TestGroupEditView.test_group_add_registered_django_permissionsc                 C   sP   |   ¡  t| jj ¡ ƒ}|  ¡  |  t| jj ¡ ƒ|¡ |  | jj ¡ d¡ d S )Nrð   )rO  Úlistrv   rv  r  r	  r   r  )rM   Zoriginal_permissionsr5   r5   r9   Ú:test_group_retains_non_registered_permissions_when_editingh	  s    
ÿzLTestGroupEditView.test_group_retains_non_registered_permissions_when_editingc                 C   sP   |   ¡  |  d| jj| jjgi¡ |  | jj ¡ d¡ |  	| j
| jj ¡ ¡ d S )Nrv  rU  )rO  r	  rG  r€   rH  r   rv   rv  r  r²   rN  r  rb   r5   r5   r9   Ú9test_group_retains_non_registered_permissions_when_addingv	  s    ÿzKTestGroupEditView.test_group_retains_non_registered_permissions_when_addingc                 C   sH   |   ¡  |  dg i¡ |  | jj ¡ d¡ |  | jj ¡ d | j¡ d S )Nrv  r¼   r   )rO  r	  r   rv   rv  r  r  rN  rb   r5   r5   r9   Ú;test_group_retains_non_registered_permissions_when_deleting‚	  s    zMTestGroupEditView.test_group_retains_non_registered_permissions_when_deletingc              	   C   sb   t jjdd}| jj |¡ |  ¡ }|  |j¡}|jddd|j	dddd	œd
}|  
t|ƒd¡ d S )NZview_fullfeaturedsnippetrq  Úinputrv  Túw-bulk#toggleZcustomÚitem)rq   Úcheckedr¸  údata-actionzdata-w-bulk-group-paramzdata-w-bulk-targetrñ   r¼   )r   rt   r   rv   rv  rx   r°   r    Zfind_allrÉ  r   rö   )rM   r=  r‡   r³   Zcheckboxr5   r5   r9   Ú!test_is_custom_permission_checked‹	  s    úþz3TestGroupEditView.test_is_custom_permission_checkedc                 C   sF   |   ¡ }|j ¡ }|  d|¡ |  d|¡ |  d|¡ |  d|¡ d S r(  r-  r/  r5   r5   r9   r1  ¡	  s    
z/TestGroupEditView.test_show_publish_permissionsc                 C   sX   t jjdd ¡  |  ¡ }|j ¡ }|  d|¡ |  d|¡ |  d|¡ |  d|¡ d S r2  r3  r/  r5   r5   r9   r4  ¯	  s    
z/TestGroupEditView.test_hide_publish_permissionsc                 C   sÐ   dd„ }t ddd t ddd |  ¡ }||jd ƒ}| j|d	 d
dd | j|d ddd t ddd |  ¡ }||jd ƒ}| j|d	 ddd | j|d d
dd | j|dd … t|dd … ƒdd d S )Nc                    s   dd„ ‰ ‡ fdd„| D ƒS )Nc                 s   s.   |   ¡ D ] }t|tƒr"|E d H  q|V  qd S rK   )ÚvaluesÚ
isinstancerd  )Úperm_setrî  r5   r5   r9   ÚflattenÇ	  s    
zrTestGroupEditView.test_group_edit_loads_with_django_permissions_in_order.<locals>.object_position.<locals>.flattenc                    s>   g | ]6}t d d„ ˆ |ƒD ƒƒd fD ]}|jj|jjf‘q$qS )c                 s   s$   | ]}t |tƒrd |kr|V  qdS )ÚpermN)ro  Údict)r¬   rî  r5   r5   r9   r  Ö	  s   
 þzTestGroupEditView.test_group_edit_loads_with_django_permissions_in_order.<locals>.object_position.<locals>.<listcomp>.<genexpr>rr  )Únextr8  Z	app_labelÚmodel)r¬   rp  rr  ©rq  r5   r9   r®   Ï	  s   þüÿ üþzuTestGroupEditView.test_group_edit_loads_with_django_permissions_in_order.<locals>.object_position.<locals>.<listcomp>r5   )Úobject_permsr5   rv  r9   Úobject_positionÃ	  s    
ûzaTestGroupEditView.test_group_edit_loads_with_django_permissions_in_order.<locals>.object_positionzsnippetstests.fancysnippetéd   )Úorderzsnippetstests.standardsnippetén   rw  r   )ÚsnippetstestsZfancysnippetz/Configured object permission order is incorrect)Úmsgr¼   )r|  ZstandardsnippetéZ   rð   z,Default object permission order is incorrect)Úregister_permission_orderr   r¯   r   Úsorted)rM   rx  r‡   Zobject_positionsr5   r5   r9   Ú6test_group_edit_loads_with_django_permissions_in_orderÀ	  sB    ýýýý
ýzHTestGroupEditView.test_group_edit_loads_with_django_permissions_in_orderc                 C   s¾   |   ¡ }|  |j¡}| dd¡}|  |d d¡ | d¡}|  t|ƒd¡ |  |d d d	¡ | d
¡}|  t|ƒd¡ |  |d d d	¡ | d¡}|  t|ƒd¡ |  |d d d¡ d S )NÚtableZlistingzdata-controllerzw-bulkz(tfoot th input[data-w-bulk-target="all"]r¼   r   rl  zw-bulk#toggleAllzGtfoot td input[data-w-bulk-target="all"][data-w-bulk-group-param="add"]zHtbody td input[data-w-bulk-target="item"][data-w-bulk-group-param="add"]rå   ri  )	r   r°   r    r÷   r²   r±   r   rö   ZassertGreaterEqual)rM   r‡   r³   r‚  Z
toggle_allZtoggle_all_addZtoggle_add_itemsr5   r5   r9   Ú'test_data_attributes_for_bulk_selection
  s"    
ÿÿz9TestGroupEditView.test_data_attributes_for_bulk_selection)r<   r=   r>   rz   r   r	  rO  rˆ   rÚ   rR  rS  rT  rW  rY  rZ  r[  r\  r]  r`  rb  r  r  rc  re  rf  rg  rm  r1  r4  r  rƒ  r5   r5   r5   r9   r?  Ô  s8   $D		Fr?  c                   @   s(   e Zd Zedd„ ƒZdd„ Zdd„ ZdS )ÚTestGroupHistoryViewc                 C   s(   t jjdd| _td| jjfd| _d S )Nrö  rp   rP  r{   )r   rt   ru   rv   r   r€   r™   r²  r5   r5   r9   r´  $
  s    z"TestGroupHistoryView.setUpTestDatac                 C   s   |   ¡ | _d S rK   r±  rb   r5   r5   r9   rz   )
  s    zTestGroupHistoryView.setUpc                 C   sX   t | jd| jd t | jd| jd | j | j¡}|  d¡ |  |d¡ |  |d¡ d S rÌ  )r   rv   r6   r~   r   r™   rš   r›   r†   r5   r5   r9   rˆ   ,
  s    
z TestGroupHistoryView.test_simpleNrÎ  r5   r5   r5   r9   r„  !
  s   
r„  c                   @   sH   e Zd ZdZeZeZeZ	eZ
dd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚTestGroupViewSetÚgroup_viewsetc                 C   s   t  d¡| _d S )NZwagtailusers)r   Zget_app_configÚ
app_configrb   r5   r5   r9   rz   <
  s    zTestGroupViewSet.setUpc                 C   s   |   t| j| jƒ| j¡ d S rK   )rT   r.   r‡  Úapp_config_attrÚdefault_viewset_clsrb   r5   r5   r9   Útest_get_viewset_cls?
  s    þz%TestGroupViewSet.test_get_viewset_clsc              	   C   sŽ   t jjj| j| jd| jj› d t| j| jƒ}W 5 Q R X |  	|| j¡ |  
|jd¡ |ƒ }|  	|jdd| j¡ |  	|jdd| j¡ d S )Nzwagtail.users.tests.©ÚnewrJ   F)rN   T)rý   ÚmockÚpatchÚobjectr‡  rˆ  Úcustom_viewset_clsr<   r.   rT   r   rQ   rO   Úcreate_form_clsÚedit_form_cls)rM   r†  Zviewsetr5   r5   r9   Ú%test_get_viewset_cls_with_custom_formE
  s    ýz6TestGroupViewSet.test_get_viewset_cls_with_custom_formc              
   C   sX   t jjj| j| jdd6 |  td| j› d¡ t| j| jƒ W 5 Q R X W 5 Q R X d S )NZasdfasdfr‹  ú*Invalid setting for WagtailUsersAppConfig.z*: asdfasdf doesn't look like a module path©	rý   r  rŽ  r  r‡  rˆ  ZassertRaisesMessager
   r.   rb   r5   r5   r9   Ú.test_get_viewset_cls_custom_form_invalid_valueR
  s      ÿþz?TestGroupViewSet.test_get_viewset_cls_custom_form_invalid_valuec              
   C   sX   t jjj| j| jdd6 |  td| j› d¡ t| j| jƒ W 5 Q R X W 5 Q R X d S )Nz+wagtail.users.tests.CustomClassDoesNotExistr‹  r”  zZ: Module "wagtail.users.tests" does not define a "CustomClassDoesNotExist" attribute/classr•  rb   r5   r5   r9   Ú/test_get_viewset_cls_custom_form_does_not_exist]
  s    ýþz@TestGroupViewSet.test_get_viewset_cls_custom_form_does_not_existN)r<   r=   r>   rˆ  r*   r‰  rI   r  r;   r‘  r’  rz   rŠ  r“  r–  r—  r5   r5   r5   r9   r…  5
  s   r…  c                   @   s(   e Zd ZdZeZeZeZ	e
Zdd„ ZdS )ÚTestUserViewSetZuser_viewsetc                 C   s`   t j t¡}tj ¡ }t d¡D ]}||ƒ O }q |j|d}|  	t
|jdddƒdddh¡ d S )	Nr9  ©r8  rr  T©ZflatÚ	add_groupZchange_groupZdelete_group)r	   rt   r<  r   r   rD  r   rF  r  r   ra  Úvalues_list)rM   Zgroup_ctÚqsrK  Úregistered_user_permissionsr5   r5   r9   Útest_registered_permissionsr
  s    
þz+TestUserViewSet.test_registered_permissionsN)r<   r=   r>   rˆ  r+   r‰  rR   r  r?   r‘  rH   r’  rŸ  r5   r5   r5   r9   r˜  k
  s   r˜  c                   @   s0   e Zd Zdd„ Zi fdd„Zdd„ Zdd„ Zd	S )
ÚTestAuthorisationIndexViewc                 C   s:   | j ddd| _| jj tjjdd¡ | jddd d S ©NÚ	auth_userrh   r$  rp  rq  ©rr   Ú_userr¶  rx   r   rt   r   ry   rb   r5   r5   r9   rz   
  s    z TestAuthorisationIndexView.setUpc                 C   s   | j  tdƒ¡S r’   r“   r”   r5   r5   r9   r   „
  s    zTestAuthorisationIndexView.getc                 C   s.   |   ¡ }|  |tdƒ¡ |  |jd d¡ d S ©Nrc  Úmessageú6Sorry, you do not have permission to access this area.©r   r…   r   r   r¯   r†   r5   r5   r9   rˆ   ‡
  s    þz&TestAuthorisationIndexView.test_simplec                 C   sx   dD ]n}|› dt  ¡ › }tjj|d}| jj |¡ |  ¡ }|  |j	d¡ |  
|d¡ |  |d¡ | jj |¡ qd S )N)rx   r  r  Ú_rq  r•   r–   r¢  )r   Úlowerr   rt   r   r¤  r¶  rx   r   rŽ   rš   r›   Úremove)rM   r   Zpermission_nameZpermission_objectr‡   r5   r5   r9   Útest_authorised
  s    z*TestAuthorisationIndexView.test_authorisedN)r<   r=   r>   rz   r   rˆ   r¬  r5   r5   r5   r9   r   ~
  s   	r   c                   @   sT   e Zd Zdd„ Zi fdd„Zi fdd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚTestAuthorisationCreateViewc                 C   s:   | j ddd| _| jj tjjdd¡ | jddd d S r¡  r£  rb   r5   r5   r9   rz   Ÿ
  s    z!TestAuthorisationCreateView.setUpc                 C   s   | j  tdƒ|¡S r  r“   r”   r5   r5   r9   r   ¤
  s    zTestAuthorisationCreateView.getc                 C   s   | j  tdƒ|¡S r  r  ©rM   r  r5   r5   r9   r	  §
  s    z TestAuthorisationCreateView.postc                 C   s(   | j j tjjtdt ¡ › d¡ d S )Nr1   rs  ©	r¤  r¶  rx   r   rt   r   r   r   rª  rb   r5   r5   r9   Úgain_permissionsª
  s    þÿz,TestAuthorisationCreateView.gain_permissionsc                 C   s.   |   ¡ }|  |tdƒ¡ |  |jd d¡ d S r¥  r¨  r†   r5   r5   r9   rˆ   ²
  s    þz'TestAuthorisationCreateView.test_simplec                 C   s.   |   ¡  |  ¡ }|  |jd¡ |  |d¡ d S )Nr•   r  ©r°  r   r   rŽ   rš   r†   r5   r5   r9   r¬  »
  s    z+TestAuthorisationCreateView.test_authorisedc              	   C   s\   |   dddddddœ¡}|  |tdƒ¡ |  |jd d	¡ tƒ jjdd
}|  | 	¡ ¡ d S )Nrf   r  r  r   rh   r  rc  r¦  r§  r  )
r	  r…   r   r   r¯   r   rt   r  rÁ  rd  rœ  r5   r5   r9   Útest_unauthorised_postÁ
  s     úÿþz2TestAuthorisationCreateView.test_unauthorised_postc              	   C   sR   |   ¡  |  dddddddœ¡}|  |tdƒ¡ tƒ jjdd}|  | ¡ ¡ d S )	Nrf   r  r  r   rh   r  r„   r  )	r°  r	  r…   r   r   rt   r  r(  rd  rœ  r5   r5   r9   Útest_authorised_postÕ
  s    úÿ
z0TestAuthorisationCreateView.test_authorised_postN)r<   r=   r>   rz   r   r	  r°  rˆ   r¬  r²  r³  r5   r5   r5   r9   r­  ž
  s   	r­  c                   @   sX   e Zd Zdd„ Zi dfdd„Zi dfdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚTestAuthorisationEditViewc                 C   sP   | j ddd| _| jj tjjdd¡ | jddd | j dddd	dd
| _d S )Nr¢  rh   r$  rp  rq  rf   rg   rz  r   r{  ©	rr   r¤  r¶  rx   r   rt   r   ry   rs   rb   r5   r5   r9   rz   ç
  s    ûzTestAuthorisationEditView.setUpNc                 C   s    | j  td|p| jjfd|¡S r|  r\  r}  r5   r5   r9   r   ó
  s    þzTestAuthorisationEditView.getc                 C   s    | j  td|p| jjfd|¡S r|  r]  )rM   r  r~  r5   r5   r9   r	  ù
  s    þzTestAuthorisationEditView.postc                 C   s(   | j j tjjtdt ¡ › d¡ d S )Nr3   rs  r¯  rb   r5   r5   r9   r°  ÿ
  s    þÿz*TestAuthorisationEditView.gain_permissionsc                 C   s.   |   ¡ }|  |tdƒ¡ |  |jd d¡ d S r¥  r¨  r†   r5   r5   r9   rˆ     s    þz%TestAuthorisationEditView.test_simplec                 C   s.   |   ¡  |  ¡ }|  |jd¡ |  |d¡ d S )Nr•   r  r±  r†   r5   r5   r9   Útest_authorised_get  s    z-TestAuthorisationEditView.test_authorised_getc              
   C   sr   |   ddddddddœ¡}|  |tdƒ¡ |  |jd	 d
¡ tƒ jj| jj	d}|  
|jd¡ |  | d¡¡ d S )Nrf   r  r‹  r   rŒ  r  rŽ  rc  r¦  r§  r¤   )r	  r…   r   r   r¯   r   rt   r   rs   r€   ZassertNotEqualrn   rÁ  r:  rœ  r5   r5   r9   r²    s$    ùÿþz0TestAuthorisationEditView.test_unauthorised_postc              
   C   sh   |   ¡  |  ddddddddœ¡}|  |tdƒ¡ tƒ jj| jjd	}|  	|j
d¡ |  | d¡¡ d S )
Nrf   r  r‹  r   rŒ  r  rŽ  r„   r¤   )r°  r	  r…   r   r   rt   r   rs   r€   r   rn   r(  r:  rœ  r5   r5   r9   r³  ,  s    ùÿz.TestAuthorisationEditView.test_authorised_post©r<   r=   r>   rz   r   r	  r°  rˆ   r¶  r²  r³  r5   r5   r5   r9   r´  æ
  s   	r´  c                   @   sT   e Zd Zdd„ Zi fdd„Zi fdd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚTestAuthorisationDeleteViewc                 C   sL   | j ddd| _| jj tjjdd¡ | jddd | j dddd| _d S )	Nr¢  rh   r$  rp  rq  rs   útest_user@email.comrV  rµ  rb   r5   r5   r9   rz   @  s    ýz!TestAuthorisationDeleteView.setUpc                 C   s   | j  td| jjfd|¡S r[  r\  r”   r5   r5   r9   r   J  s     ÿzTestAuthorisationDeleteView.getc                 C   s   | j  td| jjfd|¡S r[  r]  r®  r5   r5   r9   r	  O  s     ÿz TestAuthorisationDeleteView.postc                 C   s(   | j j tjjtdt ¡ › d¡ d S )Nr2   rs  r¯  rb   r5   r5   r9   r°  T  s    þÿz,TestAuthorisationDeleteView.gain_permissionsc                 C   s.   |   ¡ }|  |tdƒ¡ |  |jd d¡ d S r¥  r¨  r†   r5   r5   r9   rˆ   \  s    þz'TestAuthorisationDeleteView.test_simplec                 C   s.   |   ¡  |  ¡ }|  |jd¡ |  |d¡ d S )Nr•   r^  r±  r†   r5   r5   r9   r¶  e  s    z/TestAuthorisationDeleteView.test_authorised_getc                 C   sL   |   ¡ }|  |tdƒ¡ |  |jd d¡ tƒ jjdd}|  | 	¡ ¡ d S )Nrc  r¦  r§  r¹  r  )
r	  r…   r   r   r¯   r   rt   r  r(  rd  rœ  r5   r5   r9   r²  k  s    þz2TestAuthorisationDeleteView.test_unauthorised_postc                 C   sB   |   ¡  |  ¡ }|  |tdƒ¡ tƒ jjdd}|  | ¡ ¡ d S )Nr„   r¹  r  )	r°  r	  r…   r   r   rt   r  rÁ  rd  rœ  r5   r5   r9   r³  v  s
    z0TestAuthorisationDeleteView.test_authorised_postNr·  r5   r5   r5   r9   r¸  ?  s   
	r¸  c                   @   s(   e Zd Zedd„ ƒZdd„ Zdd„ ZdS )ÚTestTemplateTagsc                 C   s4   |   d¡| _tƒ | _| j| j_| jdddd| _d S )NZadminrf   rg   rh   rV  )rX  r6   r   rF  rr   rs   r²  r5   r5   r9   r´    s    
ýzTestTemplateTags.setUpTestDatac              
      s¨   d}‡ fdd„}ˆ   d|¡< ˆ  td¡$ t|ƒ tˆ jdˆ jgiƒ¡}W 5 Q R X W 5 Q R X ˆ  |¡}dˆ jj	› }| 
d|› d	¡}ˆ  |¡ ˆ  |j ¡ d
¡ d S )NúÞ
            {% load wagtailusers_tags %}
            {% for user in users %}
                <ul class="actions">
                    {% user_listing_buttons user %}
                </ul>
            {% endfor %}
        c                 3   s8   ˆ   | ˆ j¡ ˆ   |ˆ j¡ tdd| j› ddV  d S ©Nrã   rä   rå   ræ   )r   rs   r6   r/   r€   rë   rb   r5   r9   rì   ”  s    
ýz8TestTemplateTags.test_user_listing_buttons.<locals>.hookrí   ú2`user_listing_buttons` template tag is deprecated.rµ   rä   rî   rï   rã   )rò   r[   r0   r   Úrenderr   rF  rs   r°   r€   ró   rô   r   rª   r«   )rM   Útemplaterì   r0  r³   rù   rû   r5   rb   r9   Útest_user_listing_buttonsŠ  s$    		þÿ

þz*TestTemplateTags.test_user_listing_buttonsc              
      sÂ   d}‡ fdd„}ˆ   d|¡: ˆ  t¡$}t|ƒ tˆ jdˆ jgiƒ¡}W 5 Q R X W 5 Q R X ˆ  dd„ |j	D ƒdd	g¡ ˆ  
|¡}d
ˆ jj› }| d|› d¡}ˆ  |¡ ˆ  |j ¡ d¡ d S )Nr»  c                 3   s<   ˆ   |ˆ j¡ ˆ   | jjˆ j¡ tdd|j› ddV  d S r¼  )r   rs   rF  r6   r/   r€   )r¯   r6   rb   r5   r9   Údeprecated_hookº  s    
ýzXTestTemplateTags.test_user_listing_buttons_with_deprecated_hook.<locals>.deprecated_hookrí   rµ   c                 S   s   g | ]}t |jƒ‘qS r5   )rÔ   r¦  )r¬   Úwr5   r5   r9   r®   Ê  s     zSTestTemplateTags.test_user_listing_buttons_with_deprecated_hook.<locals>.<listcomp>r½  z¶`register_user_listing_buttons` hook functions should accept a `request_user` argument instead of `context` - wagtail.users.tests.test_admin_views.deprecated_hook needs to be updatedrä   rî   rï   rã   )rò   ZassertWarnsr0   r   r¾  r   rF  rs   r   Úwarningsr°   r€   ró   rô   rª   r«   )rM   r¿  rÁ  Zwarning_managerr0  r³   rù   rû   r5   rb   r9   Ú.test_user_listing_buttons_with_deprecated_hook°  s*    		ÿüþ

þz?TestTemplateTags.test_user_listing_buttons_with_deprecated_hookN)r<   r=   r>   r»  r´  rÀ  rÄ  r5   r5   r5   r9   rº  ~  s   

&rº  c                   @   s   e Zd Zdd„ ZdS )ÚTestAdminPermissionsc                 C   sz   t j t¡}tjj}tj ¡ }t 	d¡D ]}||ƒ O }q(|j
|d}|  t|jdddƒd|› d|› d|› h¡ d S )	Nr9  r™  rr  Trš  r1   r3   r2   )r	   rt   r<  r   rž   Ú
model_namer   rD  r   rF  r  r   ra  rœ  )rM   Zuser_ctrÆ  r  rK  rž  r5   r5   r9   Ú test_registered_user_permissionsà  s    
þz5TestAdminPermissions.test_registered_user_permissionsN)r<   r=   r>   rÇ  r5   r5   r5   r9   rÅ  ß  s   rÅ  )r4   )yZunittest.mockrý   Údjangor   Zdjango.appsr   Zdjango.confr   Zdjango.contrib.admin.utilsr   Zdjango.contrib.authr   Zdjango.contrib.auth.modelsr   r   Z"django.contrib.contenttypes.modelsr	   Zdjango.core.exceptionsr
   Zdjango.core.files.uploadedfiler   Zdjango.db.modelsr   Zdjango.httpr   r   Zdjango.templater   r   Zdjango.testr   r   Zdjango.urlsr   Zdjango.utilsr   Zdjango.utils.textr   Zwagtailr   Zwagtail.admin.admin_url_finderr   Zwagtail.admin.modelsr   Zwagtail.admin.staticfilesr   Zwagtail.admin.widgets.buttonr   Zwagtail.compatr   r   Zwagtail.coreutilsr   Zwagtail.log_actionsr   Zwagtail.modelsr   r    r!   r"   Zwagtail.test.utilsr#   Z!wagtail.test.utils.template_testsr$   Zwagtail.users.formsr%   r&   r'   Zwagtail.users.modelsr(   Zwagtail.users.permission_orderr)   r  Zwagtail.users.views.groupsr*   Zwagtail.users.views.usersr+   r,   r-   Zwagtail.users.wagtail_hooksr.   Zwagtail.users.widgetsr/   Zwagtail.utils.deprecationr0   rª  r¹  rw  rÇ  r   r:   r;   r?   rH   rI   rR   rS   re   r   r   r  rU  rn  ry  r°  r¼  rÃ  rË  rÏ  rÖ  r×  r?  r„  r…  r˜  r   r­  r´  r¸  rº  rÅ  r5   r5   r5   r9   Ú<module>   s®   
	6) x  X 
  ÿC   j77!  9    Q6 HY?a