o
    h                    @   sD  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;m<Z<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZCmDZDmEZE d dlFmGZG d dlHmIZJ d d lKmLZL d d!lMmNZNmOZOmPZP d d"lQmRZR d d#lSmTZT d d$lUmVZV d%e2W  ZXd&e2W  ZYd'e2W  ZZe Z[dgd)d*Z\G d+d, d,eCZ]G d-d. d.eDZ^G d/d0 d0eEZ_G d1d2 d2eLZ`G d3d4 d4eNZaG d5d6 d6eZbG d7d8 d8eAe?eZcG d9d: d:eAe?eZdG d;d< d<eAe?eZeG d=d> d>eAe?eZfG d?d@ d@eAe?eZgG dAdB dBeAe?eZhG dCdD dDeAe?eZiG dEdF dFe?eZjG dGdH dHe?eZkG dIdJ dJe?eZlG dKdL dLe?eZmG dMdN dNeAe?eZnG dOdP dPeAe?eZoG dQdR dReAe?eZpG dSdT dTeAe?eZqG dUdV dVe?eZrG dWdX dXeZsG dYdZ dZesZtG d[d\ d\e?eZuG d]d^ d^e?eZvG d_d` d`e?eZwG dadb dbe?eZxG dcdd dde?eZyG dedf dfe?eZzd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DraftStateMixinGroupCollectionPermissionGroupPagePermissionLockableMixin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sizer7   r7   d/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/users/tests/test_admin_views.pytest_avatar_provider:      r<   c                   @   s   e Zd ZdS )CustomGroupFormN)__name__
__module____qualname__r7   r7   r7   r;   r>   >   s    r>   c                   @   (   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@   rA   r   	CharFieldcountry	FileField
attachmentr7   r7   r7   r;   rC   B       rC   c                   @   rB   )CustomUserEditFormTrD   rE   rH   NrI   r7   r7   r7   r;   rO   G   rN   rO   c                   @      e Zd ZdZdddZdS )CustomGroupViewSetcustom-iconFc                 C   s   t S N)r>   self
for_updater7   r7   r;   get_form_classO   r=   z!CustomGroupViewSet.get_form_classNFr?   r@   rA   iconrW   r7   r7   r7   r;   rQ   L       rQ   c                   @   rP   )CustomUserViewSetrR   Fc                 C   s   |rt S tS rS   )rO   rC   rT   r7   r7   r;   rW   V   s   z CustomUserViewSet.get_form_classNrX   rY   r7   r7   r7   r;   r\   S   r[   r\   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      t  }| |t d S rS   )r/   assertIsr)   rU   	user_formr7   r7   r;   )test_get_user_edit_form_with_default_form]      z=TestUserFormHelpers.test_get_user_edit_form_with_default_formc                 C   r^   rS   )r.   r_   r(   r`   r7   r7   r;   -test_get_user_creation_form_with_default_forma   rc   zATestUserFormHelpers.test_get_user_creation_form_with_default_form*wagtail.users.tests.CustomUserCreationFormWAGTAIL_USER_CREATION_FORMc                 C   B   |  td t }W d    n1 sw   Y  | |t d S NzThe `WAGTAIL_USER_CREATION_FORM` setting is deprecated. Use a custom `UserViewSet` subclass and override `get_form_class()` instead.)assertWarnsMessager2   r.   r_   rC   r`   r7   r7   r;   ,test_get_user_creation_form_with_custom_forme   s   z@TestUserFormHelpers.test_get_user_creation_form_with_custom_form&wagtail.users.tests.CustomUserEditFormWAGTAIL_USER_EDIT_FORMc                 C   rh   NzThe `WAGTAIL_USER_EDIT_FORM` setting is deprecated. Use a custom `UserViewSet` subclass and override `get_form_class()` instead.)rj   r2   r/   r_   rO   r`   r7   r7   r;   (test_get_user_edit_form_with_custom_formq   s   z<TestUserFormHelpers.test_get_user_edit_form_with_custom_formz6wagtail.users.tests.CustomUserCreationFormDoesNotExistc                 C   >   |  td | tt W d    d S 1 sw   Y  d S ri   )rj   r2   assertRaisesr
   r.   rU   r7   r7   r;   -test_get_user_creation_form_with_invalid_form{      "zATestUserFormHelpers.test_get_user_creation_form_with_invalid_formz2wagtail.users.tests.CustomUserEditFormDoesNotExistc                 C   rq   ro   )rj   r2   rr   r
   r/   rs   r7   r7   r;   )test_get_user_edit_form_with_invalid_form   ru   z=TestUserFormHelpers.test_get_user_edit_form_with_invalid_formN)
r?   r@   rA   rb   rd   r   rk   rp   rt   rv   r7   r7   r7   r;   r]   \   s"    
	
	
r]   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emailrz   
first_name	last_namez
Test Groupname)	create_user	test_userr   objectscreate
test_groupgroupsaddloginrs   r7   r7   r;   setUp   s   zTestGroupUsersView.setUpNc                 C       | j td|p
| jjfd|S )Nzwagtailusers_groups:usersargsclientgetr   r   pkrU   paramsgroup_idr7   r7   r;   r      s   zTestGroupUsersView.getc                 C   sl   |  td| jj d| jj d |  }W d    n1 s w   Y  | |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=)rj   r2   r   r   r   assertRedirectsr   rU   responser7   r7   r;   test_simple   s   
zTestGroupUsersView.test_simplec                 C   s   | j dd}| |jd d S )Ni'  r     r   assertEqualstatus_coder   r7   r7   r;   test_inexisting_group   s   z(TestGroupUsersView.test_inexisting_group)r?   r@   rA   r   r   r   r   r7   r7   r7   r;   rw      s
    rw   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   $   | j dddddd| _|  | _d S Nrx   ry   rz   r{   r|   r}   )r   r   r   r8   rs   r7   r7   r;   r      s   zTestUserIndexView.setUpc                 C      | j td|S Nr   r   r   r   rU   r   r7   r7   r;   r         zTestUserIndexView.getc                 C   sT   |   }| |jd | |d | |d | |d | dddg|j d S )N   wagtailusers/users/index.htmlrx   z
Add a user UsersurlrG   r   r   r   assertTemplateUsedassertContainsassertBreadcrumbsItemsRenderedcontentr   r7   r7   r;   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 )Nguardianzguardian@example.comgu@rd14nr   r   rx   )r   r   r   r   r   r   r7   r7   r;   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   query_stringz.filter-options ar   r   z?q=Helloc                 S   s    g | ]}|j  |d fqS href)textstripr   ).0ar7   r7   r;   
<listcomp>   s     z1TestUserIndexView.test_search.<locals>.<listcomp>)	r   r   r   contextget_soupr   selectassertInr   )rU   r   soupfilter_optionsr7   r7   r;   test_search   s   
zTestUserIndexView.test_searchc                 C   8   |  ddi}| |jd |jd }| | j| d S )Nr   z
first namer   usersr   r   r   r   r   r   rU   r   resultsr7   r7   r;   test_search_query_one_field      
z-TestUserIndexView.test_search_query_one_fieldc                 C   r   )Nr   zfirst name last namer   r   r   r   r7   r7   r;   !test_search_query_multiple_fields   r   z3TestUserIndexView.test_search_query_multiple_fieldsc                 C   s2   g d}|D ]}|  d|i}| |jd qd S )N)01z-19999z
Not a pagepr   r   )rU   pagespager   r7   r7   r;   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 ],\}}| j|d | d|i}| |jd jj| W d    n1 sMw   Y  q&d S )Nr   )r   r   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   )paramorderingobject_list)	UserUSERNAME_FIELDitemssubTestr   r   context_dataqueryorder_by)rU   casesr   r   r   r7   r7   r;   test_ordering   s*   	
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	|rt	| }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      )dayslast_login_fromlast_login_to	Musiciansr   Songwritersgroup)r   r   r   assertCountEqualr   r   r8   r   saver   nowis_aware	localtimedate	timedeltastrr   r   r   r   r   r   )rU   r   r   todaytomorrow	yesterday	musicianssongwritersr7   r7   r;   test_filters  sf   



zTestUserIndexView.test_filtersc                 C   s   |    d}| | |    W d    n1 sw   Y  | ddd | | |    W d    d S 1 s;w   Y  d S )N
   testztest@example.comr   )r   assertNumQueriesr   )rU   num_queriesr7   r7   r;   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   buttonr7   r7   r;   r   v  s    z:TestUserIndexView.test_default_buttons.<locals>.<listcomp>)	r   r   r   r   r   r8   r   r   assertSequenceEqual)rU   r   r   dropdown_buttonsexpected_urlsurlsr7   r7   r;   test_default_buttonsj  s   
z&TestUserIndexView.test_default_buttonsc                    s   fdd}  d|   }W d    n1 sw   Y   |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 v r|}q 
|  |dj d |jdddid} 
|  |j d d S )Nc                 3   sF      | 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  )rG   buttons)r   r8   r1   r   r   r8   request_userrs   r7   r;   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_oner   r   assertIsNotNoneassertIsNoner   r   r   lenfind)rU   r  r   r   rowprofile_urlactionstop_level_custom_buttoncustom_buttonnested_dropdownr  custom_dropdownr  r7   rs   r;   test_buttons_hooky  sJ   









z#TestUserIndexView.test_buttons_hookN)r?   r@   rA   r   r   r   unittestskipIfr   AUTH_USER_MODELr   r   r   r   r   r   r  r  r  r0  r7   r7   r7   r;   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   )r   r   r   rs   r7   r7   r;   r     s   zTestUserIndexResultsView.setUpc                 C   r   )Nz wagtailusers_users:index_resultsr   r   r7   r7   r;   r     r   zTestUserIndexResultsView.getc                 C   s>   |   }| |jd | |d | |d | |j d S )Nr   z%wagtailusers/users/index_results.htmlrx   )r   r   r   r   r   assertBreadcrumbsNotRenderedr   r   r7   r7   r;   r     s
   z$TestUserIndexResultsView.test_simpleN)r?   r@   rA   r   r   r   r7   r7   r7   r;   r4    s    r4  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      |    d S rS   r   rs   r7   r7   r;   r        zTestUserCreateView.setUpc                 C   r   Nwagtailusers_users:addr   r   r7   r7   r;   r     r   zTestUserCreateView.getFc                 C   s   | j jtd||dS )Nr;  followr   postr   rU   	post_datar=  r7   r7   r;   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   _metaverbose_name_pluralverbose_namer   r   r7   r7   r;   r     s   
zTestUserCreateView.test_simplec                 C   sv   | j ddddddddd}| |td	 t jjdd
}| | d tj	dkr3| 
|d d S | 
|d d S )Nrx   test@user.comTestr   rz   r~   r   r   r   	password1	password2Tr<  r   r   r   r   z'User &#x27;test@user.com&#x27; created.z"User &#x27;testuser&#x27; created.r?  r   r   r   r   filterr   countr   r3  r   rU   r   r   r7   r7   r;   test_create  s    
zTestUserCreateView.test_createcustomuser.CustomUserOnly applicable to CustomUserre   rf   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 )Nrx   rI  rJ  r   rz   testcountrytest.txt   Uploaded filer~   r   r   r   rL  rM  rK   rM   r   rN  r   )r?  r   r   r   r   r   rP  r   rQ  firstrK   rM   readrR  r7   r7   r;   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rd}| j|dd
 dS )zPassword should not be stripped	testuser2ztest@user2.comrJ  r   z  whitespaced_password  rK  Tr<  r   r~   rz   N)r?  r   logoutr   r3  r   )rU   r~   r7   r7   r;   %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 )Nrx   rI  rJ  r   rL  rM  rK  r   rB  formrN  r   r?  r   r   r   
assertTruer   errorsr   r   rP  rQ  rR  r7   r7   r;   "test_create_with_password_mismatch/  s   z5TestUserCreateView.test_create_with_password_mismatchNAMEHdjango.contrib.auth.password_validation.UserAttributeSimilarityValidator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.
        rx   rI  ExampleNamezexample namerK  r   rB  ra  rM  r   password_too_similarrN  N)r?  r   r   r   r   rd  as_datar   coder   r   rP  rQ  )rU   r   rd  r   r7   r7   r;   $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 defaultrx   rI  rJ  r   r   rK  r   rB  ra  rL  rN  r   Nrb  rR  r7   r7   r;   !test_create_with_missing_passwordk  s   z4TestUserCreateView.test_create_with_missing_password)WAGTAILUSERS_PASSWORD_REQUIREDc                 C   >   |   }| |jd | |d | |d | |d dS )zPPassword fields should still be shown if WAGTAILUSERS_PASSWORD_REQUIRED is Falser   rB  rC  rD  N)r   r   r   r   r   r   r7   r7   r;   ,test_password_fields_exist_when_not_required  
   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 Falserx   rI  rJ  r   r   rK  r   rN  r   N
r?  r   r   r   r   rP  r   rQ  rZ  rz   rR  r7   r7   r;   &test_create_with_password_not_required     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_ suppliedrx   rI  rJ  r   bananakumquatrK  r   rB  ra  rM  rN  r   Nrb  rR  r7   r7   r;   )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 setrx   rI  rJ  r   rx  rK  r   rN  r   N)r?  r   r   r   r   rP  r   rQ  rc  rZ  check_passwordrR  r7   r7   r;   *test_password_still_accepted_when_optional  s   z=TestUserCreateView.test_password_still_accepted_when_optionalWAGTAILUSERS_PASSWORD_ENABLEDc                 C   rr  )NWAGTAILUSERS_PASSWORD_ENABLED=False should cause password fields to be removedr   rB  rC  rD  Nr   r   r   r   assertNotContainsr   r7   r7   r;   ,test_password_fields_not_shown_when_disabled  rt  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 passwordrx   rI  rJ  r   rx  ry  rK  r   rN  r   r   Nru  rR  r7   r7   r;   *test_password_fields_ignored_when_disabled  rw  z=TestUserCreateView.test_password_fields_ignored_when_disabledc                    sh    fdd}  d|  jtd}W d    n1 sw   Y   |jd  |jd d S )Nc                         | t tdS NzOverridden!assertIsInstancer   r   requestrs   r7   r;   	hook_func     zBTestUserCreateView.test_before_create_user_hook.<locals>.hook_funcbefore_create_userr;  r      Overridden!)r#  r   r   r   r   r   r   rU   r  r   r7   rs   r;   test_before_create_user_hook  s   z/TestUserCreateView.test_before_create_user_hookc                    |    fdd}  d| ddddddd	} jtd
|}W d    n1 s)w   Y   |jd  |jd d S )Nc                    r  r  r  r  rs   r7   r;   r    r  zGTestUserCreateView.test_before_create_user_hook_post.<locals>.hook_funcr  rx   testuser@test.com
password12r  r8   r~   r   rL  rM  r   r   r;  r   r  r#  r   r?  r   r   r   r   rU   r  rA  r   r7   rs   r;   !test_before_create_user_hook_post  s   
z4TestUserCreateView.test_before_create_user_hook_postc                    r  )Nc                    s"     | t   |t  tdS r  )r  r   r   r   r  r8   rs   r7   r;   r    s   zATestUserCreateView.test_after_create_user_hook.<locals>.hook_funcafter_create_userrx   r  r  r  r8   r  r;  r   r  r  r  r7   rs   r;   test_after_create_user_hook
  s   
z.TestUserCreateView.test_after_create_user_hookN)r?   r@   rA   r   r   r?  r   rS  r1  
skipUnlessr   r3  r   r\  r`  re  ro  rp  rs  rv  rz  r|  r  r  r  r  r  r7   r7   r7   r;   r6    sL    







r6  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 )Nrx   ry   rz   r~   r   rz   testsuperusertestsuperuser@email.com)r   r   create_superuser	superuserr   current_userrs   r7   r7   r;   r     s   zTestUserDeleteView.setUpc                 C      | j td| jjfd|S Nr
  r   r   r   r   r   r   r   r7   r7   r;   r   ,     zTestUserDeleteView.getFc                 C   s    | j jtd| jjfd||dS )Nr
  r   r<  r   r?  r   r   r   r@  r7   r7   r;   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   ra  action)r   r   r   r   r5  r   r   r   r   r   r$  r  )rU   r   r   
delete_urlform_actionr7   r7   r;   r   8  s   zTestUserDeleteView.test_simplec                 C   sf   | j dd}| |td t jjdd}| | d tj	dkr+| 
|d d S | 
|d	 d S )
NTr<  r   ry   rN  r   r   z,User &#x27;testuser@email.com&#x27; deleted.z"User &#x27;testuser&#x27; deleted.rO  rR  r7   r7   r;   test_deleteD  s   
zTestUserDeleteView.test_deletec                 C   L   | j td| jjfd}| |td | t jj	| jjd
  d S Nr
  r   wagtailadmin_homer   )r   r   r   r  r   r   rc  r   r   rP  existsr   r7   r7   r;   test_user_cannot_delete_selfT     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   r  rN  r   )r   r   r   r  r   r   r   r   r?  r   r   r   rP  rQ  rR  r7   r7   r;   $test_user_can_delete_other_superuser`  s   z7TestUserDeleteView.test_user_can_delete_other_superuserc                    r    fdd}  d|  jtd jjfd}W d    n1 s$w   Y   |jd  |jd d S )Nc                    &     | t  |j jj tdS r  r  r   r   r   r   r   r  rs   r7   r;   r  r     zBTestUserDeleteView.test_before_delete_user_hook.<locals>.hook_funcbefore_delete_userr
  r   r   r  	r#  r   r   r   r   r   r   r   r   r  r7   rs   r;   test_before_delete_user_hookq     z/TestUserDeleteView.test_before_delete_user_hookc                    r  )Nc                    r  r  r  r  rs   r7   r;   r    r  zGTestUserDeleteView.test_before_delete_user_hook_post.<locals>.hook_funcr  r
  r   r   r  	r#  r   r?  r   r   r   r   r   r   r  r7   rs   r;   !test_before_delete_user_hook_post  r  z4TestUserDeleteView.test_before_delete_user_hook_postc                    r  )Nc                    r  r  )r  r   r   r   r   r   r  rs   r7   r;   r    r  zATestUserDeleteView.test_after_delete_user_hook.<locals>.hook_funcafter_delete_userr
  r   r   r  r  r  r7   rs   r;   test_after_delete_user_hook  r  z.TestUserDeleteView.test_after_delete_user_hookN)r?   r@   rA   r   r   r?  r   r  r  r  r  r  r  r7   r7   r7   r;   r    s    r  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 )Nrx   ry   rz   r  deleterr^  zUser deletersr   access_admincodenamecontent_type__app_labelr  )r   r   deleter_userr   r   r   permissionsr   r   r   r   delete_user_perm_codenamer   create_test_userr  r   )rU   deleters_groupr7   r7   r;   r     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   r   r   r   r   r   r5  r   r   r7   r7   r;   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   ry   rN  r   )r   r?  r   r   r   r   r   r   rP  r   rQ  rR  r7   r7   r;   r    s   z-TestUserDeleteViewForNonSuperuser.test_deletec                 C   r  r  )r   r?  r   r  r   r   rc  r   r   rP  r  r   r7   r7   r;   r    r  z>TestUserDeleteViewForNonSuperuser.test_user_cannot_delete_selfc                 C   r  r  )r   r?  r   r  r   r   rc  r   r   rP  r  r   r7   r7   r;   !test_user_cannot_delete_superuser  s
   "zCTestUserDeleteViewForNonSuperuser.test_user_cannot_delete_superuserN)r?   r@   rA   r   r   r  r  r  r7   r7   r7   r;   r    s    r  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   r   )Nrx   ry   Originalr   rz   r~   r   r   r   rz   )r   r   r   r  rs   r7   r7   r;   r     s   	zTestUserEditView.setUpNc                 C   r   Nr  r   r  rU   r   user_idr7   r7   r;   r        zTestUserEditView.getFc                 C   s$   | j jtd|p
| jjfd||dS )Nr  r   r<  r  )rU   rA  r  r=  r7   r7   r;   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.htmlrC  rD  rE  r   r   zOriginal User.w-slim-headerwagtailusers_users:historyr   r   r   r"  r  ra  r  )r   r   r   r   r   r   r   r   rF  rG  r   r   r$  r   r   r   r(  r%  r  r   r  get_edit_url)	rU   r   r   headerhistory_urlhistory_linkedit_urlr  
url_finderr7   r7   r;   r     s.   



zTestUserEditView.test_simplec                 C   sd   |  td | jd| jj d}W d    n1 sw   Y  | j|d| jj ddd d S )NzZUserViewSet's `/<pk>/` edit view URL pattern has been deprecated in favour of /edit/<pk>/.rE  /z/admin/users/edit/i-  )r   )rj   r2   r   r   r   r   r   r   r7   r7   r;   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   r3  r   r   r   )rU   
invalid_idr7   r7   r;   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r<| |d n| |d |  }| |d | |j}|d}| | |d}| | | |jddd| j   td| jjfd}|d| d}| | d S )Nrx   rI  Editedr   newpasswordonr~   r   r   r   rL  rM  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   r   r   r   r   r   r   rc  r{  r   r3  r   r   r   r$  r%  assertRegexget_textr  get_username)rU   r   r8   r   status_panellast_updatedr  r  r7   r7   r;   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 unchangedrx   rI  r  r   r   r  r  r   r   rz   Nr?  r   r   r   r   r   r   r   r   r   rc  r{  rU   r   r8   r7   r7   r;   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 suppliedrx   rI  r  r   rx  ry  r  r  r   r  ra  rM  r   r  rz   N)r?  r   r   r   rc  r   rd  r   r   r   r   r   r   r{  r  r7   r7   r;   test_passwords_matchs  s    z%TestUserEditView.test_passwords_matchrf  rg  rh  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.
        rx   rI  r  rk  zedited namerK  r   r  ra  rM  r   rl  r   r  rz   N)r?  r   r   r   r   rd  rm  r   rn  r   r   r   r   r   r   rc  r{  )rU   r   rd  r8   r7   r7   r;   "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 )
Nrx   rI  r  r   rz   rK  r   r   F)r?  r   r   r   r   r   r   r   r   r   r_   r   r   r  r7   r7   r;   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 )Nrx   rI  r  r   rz   r  r~   r   r   r   rL  rM  r   r   r   r   T)r?  r   r   r   r   r   r   r   r_   r   r   r  r7   r7   r;   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  )r~   r   r   r   r   r   r   r   Tr?  r  r   r   r   r   r   r   r   r   r_   r   r   r  r7   r7   r;   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   c0rrecth0rser  r  r   r   r   )r?  r  r   r   r   r   r   r   r   r   r   r   r  r7   r7   r;   *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   )r~   r   r   r   r   r   TNr  r  r7   r7   r;   test_cannot_demote_self  s   z(TestUserEditView.test_cannot_demote_selfrT  rU  rl   rm   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 )Nrx   rI  r  r   rz   rV  rW  rX  rY  r   r   )r?  r   r   r   r   r   r   r   r   r   r   rK   rM   r[  r  r7   r7   r;   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   rI  Tesetr   rz   rK  r   r?  r   r   r   r7   r7   r;   test_edit_validation_errorX  s   z+TestUserEditView.test_edit_validation_errorr}  c                 C   rr  )r  r   r  rC  rD  Nr  r   r7   r7   r;   r  k  rt  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 unchangedrx   rI  r  r   r  rx  ry  )r~   r   r   r   r   rL  rM  r   r   rz   Nr  r  r7   r7   r;   r  t  s   z;TestUserEditView.test_password_fields_ignored_when_disabledc                    r  )Nc                    r  r  r  r  rs   r7   r;   r    r  z>TestUserEditView.test_before_edit_user_hook.<locals>.hook_funcbefore_edit_userr  r   r   r  r  r  r7   rs   r;   test_before_edit_user_hook  r  z+TestUserEditView.test_before_edit_user_hookc                        fdd}  d| ddddddd	} jtd
 jjfd|}W d    n1 s.w   Y   |jd  |jd d S )Nc                    r  r  r  r  rs   r7   r;   r    r  zCTestUserEditView.test_before_edit_user_hook_post.<locals>.hook_funcr  rx   rI  r  r   rz   rK  r  r   r   r  r  r  r7   rs   r;   test_before_edit_user_hook_post     z0TestUserEditView.test_before_edit_user_hook_postc                    r  )Nc                    r  r  r  r  rs   r7   r;   r    r  zBTestUserEditView.test_after_edit_user_hook_post.<locals>.hook_funcafter_edit_userrx   rI  r  r   rz   rK  r  r   r   r  r  r  r7   rs   r;   test_after_edit_user_hook_post  r  z/TestUserEditView.test_after_edit_user_hook_post)r?   r@   rA   r   r   r?  r   r  r  r  r  r  r   r  r  r  r  r  r  r1  r  r   r3  r   r2  r  r  r  r  r  r
  r7   r7   r7   r;   r    sP    *
  



r  c                   @   s0   e Zd Zdd Zedd Zdd Zdd Zd	S )
TestUserCopyViewc                 C      |   | _d S rS   r   r8   rs   r7   r7   r;   r        zTestUserCopyView.setUpc                 C   s2   | j dddddd| _tdt| jjgd| _d S )	Nrx   ry   r  r   rz   r  r	  r   )r   r   r   r   r   r   clsr7   r7   r;   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wagtailadminr  r  i.  r  )r8   r   r   r   r   r   user_permissionsr   r   r   r   r   r   r   )rU   admin_permissionr   r7   r7   r;   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  r  r  r   zinput[name="first_name"]valuer  zinput[name="last_name"]r   zinput[name="password1"]zinput[name="password2"])r8   r   r   r  r   r   r   r   r   add_user_perm_codenamer   r   r   r   r   r   r$  r  r&  )rU   r   r   r   r   rL  rM  r7   r7   r;   test_with_minimal_permission  s,   




z-TestUserCopyView.test_with_minimal_permissionN)r?   r@   rA   r   classmethodr  r  r  r7   r7   r7   r;   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 )Nrx   rz   r^  )r   r   rs   r7   r7   r;   r     s   zTestUserProfileCreation.setUpc                 C   sV   |  tjj| jd d | tj | jj W d    d S 1 s$w   Y  d S )Nr8   r   )	r   r*   r   rP  r   rQ  rr   DoesNotExistwagtail_userprofilers   r7   r7   r;   !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   )r  r*   get_for_userr   r   r   rP  rQ  rs   r7   r7   r;   ,test_user_profile_created_when_method_called  s    zDTestUserProfileCreation.test_user_profile_created_when_method_calledc                 C   s   t | j}| |j d S rS   )r*   r  r   assertFalseavatar)rU   user_profiler7   r7   r;   %test_avatar_empty_on_profile_creation  s   z=TestUserProfileCreation.test_avatar_empty_on_profile_creationN)r?   r@   rA   r   r  r   r$  r7   r7   r7   r;   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editorrz   r^  User editorsr   r  r  r  )r   editor_userr   r   r   r  r   r   r   r   change_user_perm_codenamer   r   )rU   editors_groupr7   r7   r;   r     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'  r   r&  zeditor@email.com
Escalatingr   r   r  )	r~   r   r   r   rL  rM  r   r   r   r  r   r   r   FN)r   r   r   idr   r?  r   r(  r   r   r   rc  r   rP  r  r   r   r_   r   )rU   r*  rA  r   r8   r7   r7   r;   $test_user_cannot_escalate_privileges'  s(   zDTestUserEditViewForNonSuperuser.test_user_cannot_escalate_privilegesN)r?   r@   rA   r   r-  r7   r7   r7   r;   r%    s    r%  c                   @   (   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 )	Nrx   ry   r  r   rz   r  r  r   )r   r   r   r   r   r  r7   r7   r;   r  Q  s   z!TestUserHistoryView.setUpTestDatac                 C   r  rS   r  rs   r7   r7   r;   r   \  r  zTestUserHistoryView.setUpc                 C   X   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   r   r8   r   r   r   r   r   r   r7   r7   r;   r   _     
zTestUserHistoryView.test_simpleNr?   r@   rA   r  r  r   r   r7   r7   r7   r;   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   r7  rS   r8  rs   r7   r7   r;   r   i  r9  zTestGroupIndexView.setUpc                 C   r   )Nwagtailusers_groups:indexr   r   r7   r7   r;   r   l  r   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   r7   r7   r;   r   o  s   zTestGroupIndexView.test_simplec                 C   :   |  ddi}| |jd | |jd d  d d S Nr   r   r   search_formr   r   r   r   r  r   r7   r7   r;   r   z     zTestGroupIndexView.test_searchc                 C   s>   t jjdd |  }dd |jd D }| |g d d S )NPhotographersr   c                 S   s   g | ]}|j qS r7   r   )r   r   r7   r7   r;   r     s    z<TestGroupIndexView.test_default_ordering.<locals>.<listcomp>r   )Editors
Moderatorsr=  )r   r   r   r   r   r   )rU   r   namesr7   r7   r;   test_default_ordering  s   z(TestGroupIndexView.test_default_orderingN)r?   r@   rA   r   r   r   r   rA  r7   r7   r7   r;   r5  h  s    r5  c                   @   0   e Zd Zdd Zi fddZdd Zdd Zd	S )
TestGroupIndexResultsViewc                 C   r7  rS   r8  rs   r7   r7   r;   r     r9  zTestGroupIndexResultsView.setUpc                 C   r   )Nz!wagtailusers_groups:index_resultsr   r   r7   r7   r;   r     r   zTestGroupIndexResultsView.getc                 C   s2   |   }| |jd | |d | |j d S )Nr   z)wagtailadmin/generic/listing_results.html)r   r   r   r   r5  r   r   r7   r7   r;   r     s   z%TestGroupIndexResultsView.test_simplec                 C   r8  r9  r;  r   r7   r7   r;   r     r<  z%TestGroupIndexResultsView.test_searchN)r?   r@   rA   r   r   r   r   r7   r7   r7   r;   rC    s
    rC  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_documentr  change_document)r   r   r   r   add_doc_permissionchange_doc_permissionrs   r7   r7   r;   r     s   zTestGroupCreateView.setUpc                 C   r   )Nwagtailusers_groups:addr   r   r7   r7   r;   r     r   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 )Nr   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_FORMSrJ  )r   r   r   r?  r   )rU   rA  post_defaultskvr7   r7   r;   r?    s    zTestGroupCreateView.postc                 C   sX   |   }| |jd | |d | ddddddg|j td}| || d S )	Nr   zwagtailusers/groups/create.html/admin/groups/r7  r   r   z
New: Groupwagtailadmin/js/page-chooser.js)r   r   r   r   r   r   r   r   )rU   r   page_chooser_jsr7   r7   r;   r     s   zTestGroupCreateView.test_simplec                 C   @   |    | d |    W d    d S 1 sw   Y  d S )N   r   r  rs   r7   r7   r;   r       
"z$TestGroupCreateView.test_num_queriesc                 C   s@   |  ddi}| |td tjjdd}| | d d S )Nr   
test groupr6  r   r   )r?  r   r   r   r   rP  r   rQ  )rU   r   r   r7   r7   r;   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 )Nrb  r   change_pagepublish_page)r   page_permissions-0-pagepage_permissions-0-permissionsrL  !document_permissions-0-collection"document_permissions-0-permissionsrR  r6  r   r!  
permissionr   )r?  r   get_first_root_noder   rH  r   r   r   r   r   r   page_permissionsallrQ  collection_permissionsrP  rU   r   	new_groupr7   r7   r;   $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 )
Nrb  r   re  rd  2)r   rf  rg  page_permissions-1-pagepage_permissions-1-permissionsrL  r   permission_panelsr   )r?  r   r   rc  r   non_form_errorsr   r7   r7   r;   %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 )Nrb  rs  )r   rh  ri  !document_permissions-1-collection"document_permissions-1-permissionsrR  r   c                 s        | ]}t |d o|jV  qdS rw  Nhasattrrw  r   panelr7   r7   r;   	<genexpr>  
    
zPTestGroupCreateView.test_duplicate_document_permissions_error.<locals>.<genexpr>rv  )r   rl  r?  r   rH  rI  r   r   rc  anyr   )rU   root_collectionr   r7   r7   r;   )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 )	Nrb  r   r   )r   rf  rL  rh  rR  r6  r   r   rj  )r?  r   r   r   r   r   r   rm  rn  rQ  ro  rP  rH  rp  r7   r7   r;   %test_can_submit_blank_permission_form!  s$   
z9TestGroupCreateView.test_can_submit_blank_permission_formc                 C   sb   t jtddtddB tddB   t jjdddd  |  }| jd	|j	 d
d d S )Nr   )codename__startswithchangedeletechange_texttestscustompermissionmodelr  r  content_type__modelCustom permissionsr   rQ  )
r   r   excluder   r  rP  r   assertInHTMLr   decoder   r7   r7   r;   test_custom_permissions_hidden9  s    z2TestGroupCreateView.test_custom_permissions_hiddenc                 C   s   |   }| d|j  d S )Nr  )r   r  r   r  r   r7   r7   r;   test_custom_permissions_shownL  s   z1TestGroupCreateView.test_custom_permissions_shownc              	   C   2  |   }| |j}|d}| | | dd |dD h d@  dtfdtfdtff}|D ]d\}}| j	|d	R t
jj|d
dd}| t|d |D ]4}|d|j d}	| |	 |	j}
| |
jd | |
j d|  |j}| t| | qRW d    n1 sw   Y  q2d S )N#object-permissions-sectionc                 S      h | ]}|j  qS r7   r   r   r   thr7   r7   r;   	<setcomp>Z      zBTestGroupCreateView.test_show_mixin_permissions.<locals>.<setcomp>r  >   LockUnlockPublishpublishlockunlockr  r  r  r  content_typer   td > fieldset input[value="r  rG   Can r   r   r   r$  r%  r!  r   r    r#   r   r   r   rP  select_relatedassertGreaterr'  r   parentr   r   r   r   r  rc  
issubclassmodel_classrU   r   r   object_permissionsmixin_permissionsr  mixinr  rk  checkboxrG   r  r7   r7   r;   test_show_mixin_permissionsQ  H   


z/TestGroupCreateView.test_show_mixin_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 textManagezCan bulk_updatez)Can bulk update ADVANCED permission modelz)Cause chaos for advanced permission modelzManage custom permission modelN)r   r   r  r   r7   r7   r;   -test_strip_model_name_from_custom_permissionsz  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.
        change_custompermissionmodelr  r  r  r  ztd > input[value="r  r  N)	r   r   r   r   r   r%  r$  r   r&  )rU   r   r   main_change_permissioncustom_change_permissionr7   r7   r;    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 d   n1 s(w   Y  | |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)r  r   r  register_permissionsc                      s   t jjd dS )Nr  )r  r  )r   r   rP  r7   admin_ctr7   r;   <lambda>  s    zcTestGroupCreateView.test_custom_other_permissions_with_wagtail_admin_content_type.<locals>.<lambda>Nz#other-permissions-sectionzinput[value="r  zlabel[for="r,  Tr  )r	   r   get_for_modelr   r   r   r#  r   r   r   r$  r%  r   r  r   r  )rU   custom_permissionr   r   other_permissionscustom_checkboxcustom_labelr7   r  r;   =test_custom_other_permissions_with_wagtail_admin_content_type  s4   





zQTestGroupCreateView.test_custom_other_permissions_with_wagtail_admin_content_typec                 C   s   |   }| |j}|jdd}| d|jd  | d|jddjd  | d|djd  | d	|d
djd  |jdd}| d|jd  | d|jddjd  | d|djd  | d	|d
djd  d S )Npage-permissions-sectionr,  	w-formsetdata-controllertotalFormsInputid_page_permissions-TOTAL_FORMSdata-w-formset-targettemplater   tabletbody)collection-management-permissions-section%id_collection_permissions-TOTAL_FORMSr   r   r   r(  r   r  r   )rU   r   r   r  r7   r7   r;   test_formset_data_attributes  sD   z0TestGroupCreateView.test_formset_data_attributesN)r?   r@   rA   r   r   r?  r   r  rc  rr  rx  r  r  r  r  r  r  r  r  r  r7   r7   r7   r;   rD    s$    	
)''rD  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 )Nrb  r   r   r   r   r   permission_typer   r!  r  r   r   z
Evil plansrE  rF  r  rG  )r   
collectionrk  )r   r   r   r   r$   r   	root_pager"   root_add_permission	home_pager   noneregistered_permissionsr   	get_hooksr   existing_permissionanother_permissionr  r   r   rl  r  	add_childevil_plans_collectionrH  rI  r!   r   r8   )rU   fnr7   r7   r;   r     s4   

zTestGroupEditView.setUpNc                 C   r   )Nwagtailusers_groups:editr   r   r   r7   r7   r;   r   +  r  zTestGroupEditView.getc                 C   s   i ddd| j jgddgddgddgd	| jjgd
dgddgddgddgd| jjgd| jjgddgddgddgddgddgddgi}| D ]\}}|||||< qV| jt	d|pm| j
jfd|S )Nr   rb  r  rL  r   rM  rK  rN  rf  rg  add_pagerR  rS  rT  rh  ri  rU  r   rV  rW  rO  rP  rQ  r  r   )r  r   r  r  rH  r   r   r   r?  r   r   )rU   rA  r   rX  rY  rZ  r7   r7   r;   r?  1  sV   

	


zTestGroupEditView.postc                 C   s2   t jj| jd| _| jd | _| jj| j d S )N)pk__inr   )	r   r   r  r  non_registered_permsnon_registered_permr   r  r   rs   r7   r7   r;   add_non_registered_permM  s
   z)TestGroupEditView.add_non_registered_permc           	      C   s   |   }| |jd | |d | ddddt| jdg|j 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[  r7  r   r   r\  r  wagtailusers_groups:historyr   r   r   r"  z/admin/groups/edit/%d/)r   r   r   r   r   r   r   r   r   r   r   r$  r   r   r(  r%  r   r8   r,  r  )	rU   r   r]  r   r  r  r  r  expected_urlr7   r7   r;   r   Y  s*   


zTestGroupEditView.test_simplec                 C   r^  )N    r`  rs   r7   r7   r;   r  u  ra  z"TestGroupEditView.test_num_queriesc                 C   s   |  | jddjd d S )Nr  r   r   )r   r   r   rs   r7   r7   r;   test_nonexistent_group_redirect{  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 )Nr   ztest group editedr6  r   r  r  Tr  r  r  r   r  r  )r?  r   r   r   r   r   r   r   r   r   r   r   r   r$  r%  r  r  r8   r  )rU   r   r   r   r  r  r  r  r7   r7   r;   test_group_edit~  s$   




z!TestGroupEditView.test_group_editc                 C   s    |  ddi}| |jd d S )Nr   r   r   r  r   r7   r7   r;    test_group_edit_validation_error  s   z2TestGroupEditView.test_group_edit_validation_errorc                 C   sN   |  | jj d | dg di}| |td |  | jj d d S )Nr   rg  )r  re  rd  r6     r   r   rm  rQ  r?  r   r   r   r7   r7   r;   1test_group_edit_adding_page_permissions_same_page  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 )NrE  #permission__content_type__app_labelr   ri  r6  r!  )r   r   ro  rP  rQ  r?  rH  r   rI  r   r   r   r7   r7   r;   ;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 )NrE  r  r   rs  )rR  ry  rz  r6  r  )r   r   ro  rP  rQ  r?  r  r   rH  rI  r   r   r   r7   r7   r;   @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   r6  r   r  r   r7   r7   r;   )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 )NrE  r  r   zdocument_permissions-0-DELETEr   r6  r   )r   r   ro  rP  rQ  r?  r   r   r   r7   r7   r;   -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)allow_extra_attrs)r   assertTagInHTMLr  r,  r   r  r   r7   r7   r;   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 Plansr   )instancez->&nbsp;&nbsp;&nbsp;&nbsp;&#x21b3 Eviler Plans   r  )r  r  r   r   r   r   r7   r7   r;   +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   rv  r   INITIAL_FORMSr   r  r  r  r  r!  rd  r  )r   r   rm  rQ  r   r   management_formr  r   r  r   r"   r   r   r'  setr  )rU   r   page_permissions_formsetr7   r7   r;   1test_group_edit_loads_with_page_permissions_shown*	  sf   

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 )Nrd  rs  )rt  ru  rL  r   rv  r   )r?  r  r   r   r   rc  r   rw  r   r7   r7   r;   rx  n	  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 )Nrs  )zdocument_permissions-1-pagerz  rR  r   c                 s   r{  r|  r}  r  r7   r7   r;   r  	  r  zNTestGroupEditView.test_duplicate_document_permissions_error.<locals>.<genexpr>rv  )	r?  r  r   rI  r   r   rc  r  r   r   r7   r7   r;   r  |	  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   r  r6  r!  )
r   r   r  rQ  r?  r  r   r  r   r   r   r7   r7   r;   ,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!  )r  listr   r  rn  r?  r   rQ  )rU   original_permissionsr7   r7   r;   :test_group_retains_non_registered_permissions_when_editing	  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 )Nr  r  )r  r?  r  r   r  r   r   r  rQ  r   r  rn  rs   r7   r7   r;   9test_group_retains_non_registered_permissions_when_adding	  s   zKTestGroupEditView.test_group_retains_non_registered_permissions_when_addingc                 C   sH   |    | dg i | | jj d | | jj d | j d S )Nr  r   r   )r  r?  r   r   r  rQ  rn  r  rs   r7   r7   r;   ;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 )Nview_fullfeaturedsnippetr  inputr  Tw-bulk#togglecustomitem)r   checkedr  data-actionzdata-w-bulk-group-paramzdata-w-bulk-targetr"  r   )r   r   r   r   r  r   r   r   find_allr,  r   r'  )rU   r  r   r   r  r7   r7   r;   !test_is_custom_permission_checked	  s   z3TestGroupEditView.test_is_custom_permission_checkedc              	   C   r  )Nr  c                 S   r  r7   r  r  r7   r7   r;   r  	  r  z@TestGroupEditView.test_show_mixin_permissions.<locals>.<setcomp>r  >   r  r  r  r  r  r  r  r  r  r  r   r  r  rG   r  r  r  r7   r7   r;   r  	  r  z-TestGroupEditView.test_show_mixin_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   s0    |   D ]}t|tr|E d H  q|V  qd S rS   )values
isinstancer  )perm_setrZ  r7   r7   r;   flatten
  s   
zrTestGroupEditView.test_group_edit_loads_with_django_permissions_in_order.<locals>.object_position.<locals>.flattenc                    s6   g | ]}t d d  |D d }|jj|jjfqS )c                 s   s&    | ]}t |trd |v r|V  qdS )permN)r  dict)r   rZ  r7   r7   r;   r  
  s    zTestGroupEditView.test_group_edit_loads_with_django_permissions_in_order.<locals>.object_position.<locals>.<listcomp>.<genexpr>r  )nextr  	app_labelmodel)r   r  r  r  r7   r;   r   	
  s    zuTestGroupEditView.test_group_edit_loads_with_django_permissions_in_order.<locals>.object_position.<locals>.<listcomp>r7   )object_permsr7   r  r;   object_position	  s   
zaTestGroupEditView.test_group_edit_loads_with_django_permissions_in_order.<locals>.object_positionzsnippetstests.fancysnippetd   )orderzsnippetstests.standardsnippetn   r  r   )snippetstestsfancysnippetz/Configured object permission order is incorrect)msgr   )r"  standardsnippetZ   r!  z,Default object permission order is incorrect)register_permission_orderr   r   r   sorted)rU   r  r   object_positionsr7   r7   r;   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 )Nr  listingr  zw-bulkz(tfoot th input[data-w-bulk-target="all"]r   r   r  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  r  )	r   r   r   r(  r   r   r   r'  assertGreaterEqual)rU   r   r   r  
toggle_alltoggle_all_addtoggle_add_itemsr7   r7   r;   'test_data_attributes_for_bulk_selection@
  s"   
z9TestGroupEditView.test_data_attributes_for_bulk_selectionc                 C   s.  |   }| |j}|jdd}| d|jd  | d|jddjd  | d|djd  |d	d
}| d|jd  |d}| d|jd  | d|jddjd  |jdd}| d|jd  | d|jddjd  | d|djd  | d|d	d
jd  d S )Nr  r  r  r  r  r  r  r  r  r  r   trchilddeleteInputzid_page_permissions-0-DELETEr  r  r  )rU   r   r   r  r  r)  r7   r7   r;   r  Z
  sX   
z.TestGroupEditView.test_formset_data_attributes)r?   r@   rA   r   r   r?  r  r   r  r  r  r  r  r  r  r  r  r  r  r  rx  r  r  r  r  r	  r  r  r*  r0  r  r7   r7   r7   r;   r    s:    $D		)Fr  c                   @   r.  )TestGroupHistoryViewc                 C   s(   t jjdd| _td| jjfd| _d S )Nrb  r   r  r   )r   r   r   r   r   r   r   r  r7   r7   r;   r  
  s   z"TestGroupHistoryView.setUpTestDatac                 C   r  rS   r  rs   r7   r7   r;   r   
  r  zTestGroupHistoryView.setUpc                 C   r0  r1  )r   r   r8   r   r   r   r   r   r   r7   r7   r;   r   
  r3  z TestGroupHistoryView.test_simpleNr4  r7   r7   r7   r;   r4  
  s
    
r4  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 )Nwagtailusers)r   get_app_config
app_configrs   r7   r7   r;   r   
     zTestGroupViewSet.setUpc                 C   s   |  t| j| j| j d S rS   )r_   r0   r9  app_config_attrdefault_viewset_clsrs   r7   r7   r;   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 d    n1 s#w   Y  | 	|| j | 
|jd | }| 	|jdd| j | 	|jdd| j d S )Nzwagtail.users.tests.newrR   F)rV   T)r1  mockpatchobjectr9  r;  custom_viewset_clsr?   r0   r_   r   rZ   rW   create_form_clsedit_form_cls)rU   r6  viewsetr7   r7   r;   %test_get_viewset_cls_with_custom_form
  s   z6TestGroupViewSet.test_get_viewset_cls_with_custom_formc              	   C      t jjj| j| jdd3 | td| j d t| j| j W d    n1 s*w   Y  W d    d S W d    d S 1 sBw   Y  d S )Nasdfasdfr>  *Invalid setting for WagtailUsersAppConfig.z*: asdfasdf doesn't look like a module path	r1  r@  rA  rB  r9  r;  assertRaisesMessager
   r0   rs   r7   r7   r;   .test_get_viewset_cls_custom_form_invalid_value
  s   
"z?TestGroupViewSet.test_get_viewset_cls_custom_form_invalid_valuec              	   C   rH  )Nz+wagtail.users.tests.CustomClassDoesNotExistr>  rJ  zZ: Module "wagtail.users.tests" does not define a "CustomClassDoesNotExist" attribute/classrK  rs   r7   r7   r;   /test_get_viewset_cls_custom_form_does_not_exist
  s   "z@TestGroupViewSet.test_get_viewset_cls_custom_form_does_not_existN)r?   r@   rA   r;  r,   r<  rQ   rC  r>   rD  rE  r   r=  rG  rM  rN  r7   r7   r7   r;   r5  
  s    r5  c                   @   s(   e Zd ZdZeZeZeZ	e
Zdd ZdS )TestUserViewSetuser_viewsetc                 C   s^   t jt}tj }tdD ]}|| O }q|j|d}| 	t
|jdddh d d S )Nr  r  r  Tflat>   	add_groupchange_groupdelete_group)r	   r   r  r   r   r  r   r  rP  r   r  values_list)rU   group_ctqsr  registered_user_permissionsr7   r7   r;   test_registered_permissions
  s   
z+TestUserViewSet.test_registered_permissionsN)r?   r@   rA   r;  r-   r<  r\   rC  rC   rD  rO   rE  r[  r7   r7   r7   r;   rO  
  s    rO  c                   @   rB  )
TestAuthorisationIndexViewc                 C   :   | j ddd| _| jjtjjdd | jddd d S N	auth_userrz   r^  r  r  r   _userr  r   r   r   r   r   rs   r7   r7   r;   r   
     z TestAuthorisationIndexView.setUpc                 C   s   | j tdS r   r   r   r7   r7   r;   r   
  r:  zTestAuthorisationIndexView.getc                 C   .   |   }| |td | |jd d d S Nr  message6Sorry, you do not have permission to access this area.r   r   r   r   r   r   r7   r7   r;   r   
     z&TestAuthorisationIndexView.test_simplec                 C   sx   dD ]7}| dt   }tjj|d}| jj| |  }| |j	d | 
|d | |d | jj| qd S )N)r   r  r  _r  r   r   r_  )r   lowerr   r   r   ra  r  r   r   r   r   r   remove)rU   rk  permission_namepermission_objectr   r7   r7   r;   test_authorised
  s   z*TestAuthorisationIndexView.test_authorisedN)r?   r@   rA   r   r   r   rn  r7   r7   r7   r;   r\  
  s
    	r\  c                   @   T   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   r]  r^  r`  rs   r7   r7   r;   r     rb  z!TestAuthorisationCreateView.setUpc                 C   r   r:  r   r   r7   r7   r;   r     r   zTestAuthorisationCreateView.getc                 C   r   r:  r>  rU   rA  r7   r7   r;   r?    r   z TestAuthorisationCreateView.postc                 C   (   | j jtjjtdt  d d S )Nr3   r  	ra  r  r   r   r   r   r   r   rj  rs   r7   r7   r;   gain_permissions     z,TestAuthorisationCreateView.gain_permissionsc                 C   rc  rd  rg  r   r7   r7   r;   r   !  rh  z'TestAuthorisationCreateView.test_simplec                 C   .   |    |  }| |jd | |d d S )Nr   rB  rt  r   r   r   r   r   r7   r7   r;   rn  *     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 )Nrx   rI  rJ  r   rz   rK  r  re  rf  rN  )
r?  r   r   r   r   r   r   rP  r!  r  r  r7   r7   r;   test_unauthorised_post0  s    z2TestAuthorisationCreateView.test_unauthorised_postc              	   C   sR   |    | ddddddd}| |td t jjdd}| |  d S )	Nrx   rI  rJ  r   rz   rK  r   rN  )	rt  r?  r   r   r   r   rP  rc  r  r  r7   r7   r;   test_authorised_postD  s   
z0TestAuthorisationCreateView.test_authorised_postN)r?   r@   rA   r   r   r?  rt  r   rn  ry  rz  r7   r7   r7   r;   rp    s    	rp  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_  rz   r^  r  r  rx   ry   r  r   r  	r   ra  r  r   r   r   r   r   r   rs   r7   r7   r;   r   V  s   zTestAuthorisationEditView.setUpNc                 C   r   r  r  r  r7   r7   r;   r   b  r  zTestAuthorisationEditView.getc                 C   r   r  r  )rU   rA  r  r7   r7   r;   r?  h  r  zTestAuthorisationEditView.postc                 C   rr  )Nr5   r  rs  rs   r7   r7   r;   rt  n  ru  z*TestAuthorisationEditView.gain_permissionsc                 C   rc  rd  rg  r   r7   r7   r;   r   v  rh  z%TestAuthorisationEditView.test_simplec                 C   rv  )Nr   r  rw  r   r7   r7   r;   test_authorised_get  rx  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 )Nrx   rI  r  r   r  r  r  r  re  rf  r   )r?  r   r   r   r   r   r   r   r   r   assertNotEqualr   r!  r{  r  r7   r7   r;   ry    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 )
Nrx   rI  r  r   r  r  r  r   r   )rt  r?  r   r   r   r   r   r   r   r   r   rc  r{  r  r7   r7   r;   rz    s   z.TestAuthorisationEditView.test_authorised_postr?   r@   rA   r   r   r?  rt  r   r}  ry  rz  r7   r7   r7   r;   r{  U  s    	r{  c                   @   ro  )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_  rz   r^  r  r  r   test_user@email.comr  r|  rs   r7   r7   r;   r     s   z!TestAuthorisationDeleteView.setUpc                 C   r  r  r  r   r7   r7   r;   r     r  zTestAuthorisationDeleteView.getc                 C   r  r  r  rq  r7   r7   r;   r?    r  z TestAuthorisationDeleteView.postc                 C   rr  )Nr4   r  rs  rs   r7   r7   r;   rt    ru  z,TestAuthorisationDeleteView.gain_permissionsc                 C   rc  rd  rg  r   r7   r7   r;   r     rh  z'TestAuthorisationDeleteView.test_simplec                 C   rv  )Nr   r  rw  r   r7   r7   r;   r}    rx  z/TestAuthorisationDeleteView.test_authorised_getc                 C   sL   |   }| |td | |jd d t jjdd}| |	  d S )Nr  re  rf  r  rN  )
r?  r   r   r   r   r   r   rP  rc  r  r  r7   r7   r;   ry    s   z2TestAuthorisationDeleteView.test_unauthorised_postc                 C   sB   |    |  }| |td t jjdd}| |  d S )Nr   r  rN  )	rt  r?  r   r   r   r   rP  r!  r  r  r7   r7   r;   rz    s
   z0TestAuthorisationDeleteView.test_authorised_postNr  r7   r7   r7   r;   r    s    
	r  c                   @   r.  )TestTemplateTagsc                 C   s4   |  d| _t | _| j| j_| jdddd| _d S )Nadminrx   ry   rz   r  )r  r8   r   r  r   r   r  r7   r7   r;   r    s   
zTestTemplateTags.setUpTestDatac              	      s   d} fdd}  d|-  td t|t jd jgi}W d    n1 s/w   Y  W d    n1 s>w   Y   |}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   s:      |  j   | j tdd| j ddV  d S Nr  r  r  r  )r   r   r8   r1   r   r  rs   r7   r;   r    s   
z8TestTemplateTags.test_user_listing_buttons.<locals>.hookr  2`user_listing_buttons` template tag is deprecated.r   r  r  r   r  )r#  rj   r2   r   renderr   r  r   r   r   r$  r%  r   r   r   )rU   r  r  htmlr   r*  r,  r7   rs   r;   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 d    n1 s.w   Y  W d    n1 s=w   Y   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   r   r  r8   r1   r   )r   r8   rs   r7   r;   deprecated_hook)  s   
zXTestTemplateTags.test_user_listing_buttons_with_deprecated_hook.<locals>.deprecated_hookr  r   c                 S   s   g | ]}t |jqS r7   )r   re  )r   wr7   r7   r;   r   9  r  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#  assertWarnsr2   r   r  r   r  r   r   warningsr   r   r$  r%  r   r   )rU   r  r  warning_managerr  r   r*  r,  r7   rs   r;   .test_user_listing_buttons_with_deprecated_hook  s0   		

z?TestTemplateTags.test_user_listing_buttons_with_deprecated_hookN)r?   r@   rA   r  r  r  r  r7   r7   r7   r;   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 )	Nr  rQ  r  TrR  r3   r5   r4   )r	   r   r  r   rF  
model_namer   r  r   r  rP  r   r  rW  )rU   user_ctr  rY  r  rZ  r7   r7   r;    test_registered_user_permissionsO  s   
z5TestAdminPermissions.test_registered_user_permissionsN)r?   r@   rA   r  r7   r7   r7   r;   r  N  s    r  )r6   ){unittest.mockr1  djangor   django.appsr   django.confr   django.contrib.admin.utilsr   django.contrib.authr   django.contrib.auth.modelsr   r   "django.contrib.contenttypes.modelsr	   django.core.exceptionsr
   django.core.files.uploadedfiler   django.db.modelsr   django.httpr   r   django.templater   r   django.testr   r   django.urlsr   django.utilsr   django.utils.textr   wagtailr   wagtail.admin.admin_url_finderr   wagtail.admin.modelsr   wagtail.admin.staticfilesr   wagtail.admin.widgets.buttonr   wagtail.compatr   r   wagtail.coreutilsr   wagtail.log_actionsr   wagtail.modelsr   r    r!   r"   r#   r$   wagtail.test.utilsr%   !wagtail.test.utils.template_testsr&   wagtail.users.formsr'   r(   r)   wagtail.users.modelsr*   wagtail.users.permission_orderr+   r'  wagtail.users.views.groupsr,   wagtail.users.views.usersr-   r.   r/   wagtail.users.wagtail_hooksr0   wagtail.users.widgetsr1   wagtail.utils.deprecationr2   rj  r  r  r)  r   r<   r>   rC   rO   rQ   r\   r]   rw   r   r4  r6  r  r  r  r  r  r%  r/  r5  rC  rD  r  r4  r5  rO  r\  rp  r{  r  r  r  r7   r7   r7   r;   <module>   s     
	6) v  X 
C   j77!  k     6 HY?a