o
    ÌÉhc  ã                   @   s  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mZmZ d d
lmZmZmZmZ d dlmZ G dd„ deeƒZG dd„ dƒZG dd„ deƒZ G dd„ dee ƒZ!G dd„ deƒZ"G dd„ dee"ƒZ#G dd„ deƒZ$dS )é    )Úquote)Úget_permission_codename)ÚGroupÚ
Permission)ÚTestCaseÚoverride_settings)ÚNoReverseMatchÚreverse)Útimezone)Úget_user_display_name)ÚWorkflowLock)ÚGroupApprovalTaskÚWorkflowÚWorkflowTask)ÚAdvertÚDraftStateModelÚFullFeaturedSnippetÚLockableModel)ÚWagtailTestUtilsc                   @   sJ   e Zd ZeZdd„ Zedd„ ƒZddd„Zddd	„Z	d
d„ Z
ddd„ZdS )ÚBaseLockingTestCasec                 C   s    |   ¡ | _| jjjdd| _d S )NúI'm a lockable snippet!©Útext)ÚloginÚuserÚmodelÚobjectsÚcreateÚsnippet©Úself© r!   úc/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/snippets/tests/test_locking.pyÚsetUp   s   
zBaseLockingTestCase.setUpc                 C   s
   | j jjS ©N)r   Ú_metaÚverbose_namer   r!   r!   r"   Ú
model_name   s   
zBaseLockingTestCase.model_nameNc                 C   s0   |d ur|nt | jjƒg}t| jj |¡|dS )N©Úargs)r   r   Úpkr	   Úsnippet_viewsetÚget_url_name)r    Únamer)   r!   r!   r"   Úget_url   s   zBaseLockingTestCase.get_urlc                 C   s*   d| j _|| j _t ¡ | j _| j  ¡  d S )NT)r   ÚlockedÚ	locked_byr
   ÚnowÚ	locked_atÚsave)r    r   r!   r!   r"   Úlock_snippet#   s   z BaseLockingTestCase.lock_snippetc                 C   s   | j  ¡  d S r$   )r   Úrefresh_from_dbr   r!   r!   r"   Úrefresh_snippet)   s   z#BaseLockingTestCase.refresh_snippetc                 C   sh   |d u r| j }d|_tjjdddg}|D ]}| tjjdt|| jjƒd¡ q|j	 
|¡ | ¡  d S )NFÚwagtailadminÚaccess_admin)Úcontent_type__app_labelÚcodenameÚtests)r   Úis_superuserr   r   ÚgetÚappendr   r   r%   Úuser_permissionsÚsetr3   )r    Úpermission_namesr   Úpermissionsr-   r!   r!   r"   Úset_permissions,   s"   þÿþÿz#BaseLockingTestCase.set_permissionsr$   )Ú__name__Ú
__module__Ú__qualname__r   r   r#   Úpropertyr'   r.   r4   r6   rC   r!   r!   r!   r"   r      s    


r   c                   @   s   e Zd ZeZdd„ ZdS )ÚDraftStateModelTestCasec                 C   s   | j  ¡  | j  ¡ | _ d S r$   )r   r5   Úget_latest_revision_as_objectr   r!   r!   r"   r6   H   s   
z'DraftStateModelTestCase.refresh_snippetN)rD   rE   rF   r   r   r6   r!   r!   r!   r"   rH   E   s    rH   c                   @   s”   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
d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 )$ÚTestLockingc                 C   s^   | j  |  d¡¡}|  ¡  |  ||  d¡¡ |  | jj¡ |  | jj	| j
¡ |  | jj¡ d S ©NÚlockÚedit©ÚclientÚpostr.   r6   ÚassertRedirectsÚ
assertTruer   r/   ÚassertEqualr0   r   ÚassertIsNotNoner2   ©r    Úresponser!   r!   r"   Útest_lock_postN   s   zTestLocking.test_lock_postc                 C   sV   | j  |  d¡¡}|  ¡  |  |jd¡ |  | jj¡ |  	| jj
¡ |  	| jj¡ d S )NrL   é•  )rO   r=   r.   r6   rS   Ústatus_codeÚassertFalser   r/   ÚassertIsNoner0   r2   rU   r!   r!   r"   Útest_lock_getZ   s   zTestLocking.test_lock_getc                 C   sj   |   | j¡ | j |  d¡¡}|  ¡  |  ||  d¡¡ |  | jj	¡ |  
| jj| j¡ |  | jj¡ d S rK   )r4   r   rO   rP   r.   r6   rQ   rR   r   r/   rS   r0   rT   r2   rU   r!   r!   r"   Útest_lock_post_already_lockedf   s   z)TestLocking.test_lock_post_already_lockedc                 C   sl   | j dg d}| j |   d¡d|i¡}|  ¡  |  ||¡ |  | jj¡ |  | jj	| j
¡ |  | jj¡ d S )NÚlistr(   rL   Únext)r.   rO   rP   r6   rQ   rR   r   r/   rS   r0   r   rT   r2   ©r    Únext_urlrV   r!   r!   r"   Ú!test_lock_post_with_good_redirectu   s   z-TestLocking.test_lock_post_with_good_redirectc                 C   sd   | j  |  d¡ddi¡}|  ¡  |  ||  d¡¡ |  | jj¡ |  | jj	| j
¡ |  | jj¡ d S )NrL   r_   úhttp://www.google.co.ukrM   rN   rU   r!   r!   r"   Ú test_lock_post_with_bad_redirect‚   s   þz,TestLocking.test_lock_post_with_bad_redirectc                 C   s`   | j  | jdtdƒgd¡}|  ¡  |  |jd¡ |  | jj	¡ |  
| jj¡ |  
| jj¡ d S )NrM   é–˜ r(   é”  )rO   rP   r.   r   r6   rS   rY   rZ   r   r/   r[   r0   r2   rU   r!   r!   r"   Útest_lock_post_bad_snippet‘   s   z&TestLocking.test_lock_post_bad_snippetc                 C   óR   t jjdd| _|  t¡ | j |  d¡¡ W d   ƒ d S 1 s"w   Y  d S )NúI'm a non-lockable snippet!r   rL   ©	r   r   r   r   ÚassertRaisesr   rO   rP   r.   r   r!   r!   r"   Ú"test_lock_post_not_enabled_snippet   s   "ÿz.TestLocking.test_lock_post_not_enabled_snippetc                 C   sb   |   g ¡ | j |  d¡¡}|  ¡  |  |tdƒ¡ |  | jj	¡ |  
| jj¡ |  
| jj¡ d S )NrL   Úwagtailadmin_home)rC   rO   rP   r.   r6   rQ   r	   rZ   r   r/   r[   r0   r2   rU   r!   r!   r"   Útest_lock_post_bad_permissions£   s   
z*TestLocking.test_lock_post_bad_permissionsc                 C   sf   |   | j¡ | j |  d¡¡}|  ¡  |  ||  d¡¡ |  | jj	¡ |  
| jj¡ |  
| jj¡ d S ©NÚunlockrM   ©r4   r   rO   rP   r.   r6   rQ   rZ   r   r/   r[   r0   r2   rU   r!   r!   r"   Útest_unlock_post²   s   zTestLocking.test_unlock_postc                 C   sf   |   | j¡ | j |  d¡¡}|  ¡  |  |jd¡ |  | j	j
¡ |  | j	j| j¡ |  | j	j¡ d S )Nrp   rX   )r4   r   rO   r=   r.   r6   rS   rY   rR   r   r/   r0   rT   r2   rU   r!   r!   r"   Útest_unlock_getÁ   s   zTestLocking.test_unlock_getc                 C   sZ   | j  |  d¡¡}|  ¡  |  ||  d¡¡ |  | jj¡ |  | jj	¡ |  | jj
¡ d S ro   )rO   rP   r.   r6   rQ   rZ   r   r/   r[   r0   r2   rU   r!   r!   r"   Ú!test_unlock_post_already_unlockedÐ   s   z-TestLocking.test_unlock_post_already_unlockedc                 C   st   |   | j¡ | jdg d}| j |  d¡d|i¡}|  ¡  |  ||¡ |  | jj	¡ |  
| jj¡ |  
| jj¡ d S )Nr^   r(   rp   r_   )r4   r   r.   rO   rP   r6   rQ   rZ   r   r/   r[   r0   r2   r`   r!   r!   r"   Ú#test_unlock_post_with_good_redirectÜ   s   z/TestLocking.test_unlock_post_with_good_redirectc                 C   sl   |   | j¡ | j |  d¡ddi¡}|  ¡  |  ||  d¡¡ |  | jj	¡ |  
| jj¡ |  
| jj¡ d S )Nrp   r_   rc   rM   rq   rU   r!   r!   r"   Ú"test_unlock_post_with_bad_redirectì   s   þz.TestLocking.test_unlock_post_with_bad_redirectc                 C   sp   |   | j¡ | j | jdtdƒgd¡}|  ¡  |  |jd¡ |  	| j
j¡ |  | j
j| j¡ |  | j
j¡ d S )Nrp   re   r(   rf   )r4   r   rO   rP   r.   r   r6   rS   rY   rR   r   r/   r0   rT   r2   rU   r!   r!   r"   Útest_unlock_post_bad_snippetþ   s   z(TestLocking.test_unlock_post_bad_snippetc                 C   rh   )Nri   r   rp   rj   r   r!   r!   r"   Ú$test_unlock_post_not_enabled_snippet  s   "ÿz0TestLocking.test_unlock_post_not_enabled_snippetc                 C   s‚   d| j _| j j tjjdd¡ | j  ¡  |  |  	d¡¡ | j
 |  d¡¡}|  ¡  |  |jd¡ |  | jj¡ |  | jj¡ d S )NFÚEditors©r-   Úuser2rp   i.  )r   r<   ÚgroupsÚaddr   r   r=   r3   r4   Úcreate_userrO   rP   r.   r6   rS   rY   rR   r   r/   rT   r2   rU   r!   r!   r"   Ú test_unlock_post_bad_permissions  s   
z,TestLocking.test_unlock_post_bad_permissionsc                 C   s˜   d| j _| j j tjjdd¡ | j  ¡  |  | j ¡ t	dƒ}| j
 |  d¡d|i¡}|  ¡  |  ||¡ |  | jj¡ |  | jj¡ |  | jj¡ dS )zIUser can unlock a snippet they have locked without the unlock permission.Fry   rz   rm   rp   r_   N)r   r<   r|   r}   r   r   r=   r3   r4   r	   rO   rP   r.   r6   rQ   rZ   r   r/   r[   r0   r2   r`   r!   r!   r"   Ú1test_unlock_post_own_snippet_with_bad_permissions%  s   
z=TestLocking.test_unlock_post_own_snippet_with_bad_permissionsN)rD   rE   rF   rW   r\   r]   rb   rd   rg   rl   rn   rr   rs   rt   ru   rv   rw   rx   r   r€   r!   r!   r!   r"   rJ   M   s$    rJ   c                   @   s   e Zd ZdS )ÚTestLockingWithDraftStateN)rD   rE   rF   r!   r!   r!   r"   r   =  s    r   c                   @   sZ   e Zd ZdZdd„ Zdd„ Zedddd	„ ƒZd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚTestEditLockedSnippetÚSavec                 C   sh   |   |  d¡¡ | j |  d¡ddi¡}|  ¡  |  |d| j› d¡ |  | j	j
¡ |  | j	jd¡ dS )	z<A user cannot edit a snippet that is locked by another user.r{   rM   r   úEdited while lockedúThe ú# could not be saved as it is lockedr   N)r4   r~   rO   rP   r.   r6   ÚassertContainsr'   rR   r   r/   rS   r   rU   r!   r!   r"   Ú%test_edit_post_locked_by_another_userD  s   þþz;TestEditLockedSnippet.test_edit_post_locked_by_another_userc                 C   sh   |   | j¡ | jj|  d¡ddidd}|  ¡  |  |d| j› d¡ |  | j	j
¡ |  | j	jd¡ dS )	z7A user can edit a snippet that is locked by themselves.rM   r   r„   T)Úfollowr…   r†   N)r4   r   rO   rP   r.   r6   ÚassertNotContainsr'   rR   r   r/   rS   r   rU   r!   r!   r"   Útest_edit_post_locked_by_self\  s   ýþz3TestEditLockedSnippet.test_edit_post_locked_by_selfT)ÚWAGTAILADMIN_GLOBAL_EDIT_LOCKc                 C   sd   |   | j¡ | j |  d¡ddi¡}|  ¡  |  |d| j› d¡ |  | j	j
¡ |  | j	jd¡ dS )zTA user cannot edit a snippet that is locked by themselves if the setting is enabled.rM   r   r„   r…   r†   r   N)r4   r   rO   rP   r.   r6   r‡   r'   rR   r   r/   rS   r   rU   r!   r!   r"   Ú6test_edit_post_locked_by_self_with_global_lock_enabledu  s   þþzLTestEditLockedSnippet.test_edit_post_locked_by_self_with_global_lock_enabledc              	   C   s  ddgdgg}|D ]x}| j d|dg |  | j¡ |  |¡ | j |  d¡¡}|j ¡ }|  d¡}|  	|d¡ | j	|d| j
› dd	d
 | jd|dd	d |  	|d| j› d¡ | jd|› d|dd	d | jd|› d|dd	d W d  ƒ n1 s|w   Y  q	dS )zBA user can edit and unlock a snippet that is locked by themselves.Úchangerp   z3User can edit and unlock an object they have locked)rB   rM   zA<b>'I&#x27;m a lockable snippet!' was locked</b> by <b>you</b> onú#<em data-w-progress-target="label">ú</em>T©Úhtmlú.<button type="submit" disabled>Locked</button>r   ©ÚcountÚallow_extra_attrsz$Only you can make changes while the ú
 is lockedúv<input type="checkbox" checked data-action="click->w-action#post" data-controller="w-action" data-w-action-url-value="ú">é   úf<button type="button" data-action="w-action#post" data-controller="w-action" data-w-action-url-value="ú">Unlock</button>N)ÚsubTestr4   r   rC   rO   r=   r.   ÚcontentÚdecoder‡   Úsave_button_labelÚassertTagInHTMLr'   )r    ÚcasesrB   rV   r’   Ú
unlock_urlr!   r!   r"   Útest_edit_get_locked_by_selfŽ  s^   þþ


þýüþ
ü
üÎ€ÿz2TestEditLockedSnippet.test_edit_get_locked_by_selfc                 C   sä   |   d¡}|  |¡ |  ddg¡ | j |  d¡¡}|j ¡ }|  d¡}t|ƒ}|  	|d|› d¡ |  	|d|› d| j
› d	¡ | j|d
| j› ddd | jd|ddd | jd|› d|ddd | jd|› d|ddd dS )zSA user needs to unlock a snippet that's locked by another user in order to edit it.r{   rŽ   rp   rM   ú7<b>'I&#x27;m a lockable snippet!' was locked</b> by <b>ú</b> onúOnly ú can make changes while the r—   r   r   Tr‘   r“   rš   r”   r˜   r™   r›   rœ   N©r~   r4   rC   rO   r=   r.   rž   rŸ   r   r‡   r'   rŠ   r    r¡   ©r    r   rV   r’   r£   Údisplay_namer!   r!   r"   Ú:test_edit_get_locked_by_another_user_has_unlock_permissionÏ  sL   




þþýü
ü

üzPTestEditLockedSnippet.test_edit_get_locked_by_another_user_has_unlock_permissionc                 C   sî   |   d¡}|  |¡ |  dg¡ | j |  d¡¡}|j ¡ }|  d¡}t|ƒ}|  	|d|› d¡ |  	|d|› d| j
› d	¡ |  |d
¡ | j|d| j› ddd | jd|ddd | jd|› d|ddd | jd|› d|ddd dS )zZ
        A different user cannot unlock the object without the unlock permission.
        r{   rŽ   rM   rp   r¥   r¦   r§   r¨   r—   ÚUnlockr   r   Tr‘   r“   rš   r”   r˜   r™   r   r›   rœ   Nr©   rª   r!   r!   r"   Ú9test_edit_get_locked_by_another_user_no_unlock_permission  sN   




þþýü
ü

üzOTestEditLockedSnippet.test_edit_get_locked_by_another_user_no_unlock_permissionc                 C   sÂ   |   dg¡ | j |  d¡¡}|j ¡ }|  d¡}|  |d¡ |  |d| j› ¡ |  |d¡ | j|d| j	› dd	d
 | j
d|dd	d | j
d|› d|dd	d | j
d|› d|dd	d dS )z9A user cannot lock an object without the lock permission.rŽ   rM   rL   ú0<b>'I&#x27;m a lockable snippet!' was locked</b>úAnyone can edit this z&lock it to prevent others from editingr   r   Tr‘   r“   r   r”   ún<input type="checkbox" data-action="click->w-action#post" data-controller="w-action" data-w-action-url-value="r™   r›   z">Lock</button>N©rC   rO   r=   r.   rž   rŸ   rŠ   r‡   r'   r    r¡   ©r    rV   r’   Úlock_urlr!   r!   r"   Ú)test_edit_get_unlocked_no_lock_permissionF  sN   

þ
þþýü
ü

üz?TestEditLockedSnippet.test_edit_get_unlocked_no_lock_permissionc                 C   s    |   ddg¡ | j |  d¡¡}|j ¡ }|  d¡}|  |d¡ |  |d| j› d¡ | j|d| j	› dd	d
 | j
d|dd	d | j
d|› d|dd	d dS )z3A user can lock an object with the lock permission.rŽ   rL   rM   r¯   r°   u+    â€“ lock it to prevent others from editingr   r   Tr‘   r“   r   r”   r±   r™   rš   Nr²   r³   r!   r!   r"   Ú*test_edit_get_unlocked_has_lock_permission€  s:   

þþýü

üz@TestEditLockedSnippet.test_edit_get_unlocked_has_lock_permissionN)rD   rE   rF   r    rˆ   r‹   r   r   r¤   r¬   r®   rµ   r¶   r!   r!   r!   r"   r‚   A  s    
A9>:r‚   c                   @   s   e Zd ZdZdS )ÚTestEditLockedDraftStateSnippetz
Save draftN)rD   rE   rF   r    r!   r!   r!   r"   r·   ®  s    r·   c                       s(   e Zd ZeZ‡ fdd„Zdd„ Z‡  ZS )ÚTestWorkflowLockc                    sj   t ƒ  ¡  | j ¡  |  d¡| _tjjdd| _	| jj
 | j	¡ | jdg| jd | jddg| jd d S )NÚ	moderatorÚ
Moderatorsrz   rŽ   )r   Úpublish)Úsuperr#   r   Úsave_revisionr~   r¹   r   r   r=   Ú
moderatorsr|   r}   rC   r   r   ©Ú	__class__r!   r"   r#   µ  s   

zTestWorkflowLock.setUpc                 C   sî   t jjdd}tjjdd}|j | j¡ tjj||dd | | j	| j
¡ | j	 ¡ }|  |t¡ |  | | j
¡¡ |  | | j¡¡ |  | | j
¡d¡ |  | | j¡¡ tjjdd}tjj||dd | j	 ¡ }|  | | j
¡d	¡ d S )
NÚtest_workflowrz   Ú	test_taskrš   )ÚworkflowÚtaskÚ
sort_orderz}This full-featured snippet is currently awaiting moderation. Only reviewers for this task can edit the full-featured snippet.Úanother_taské   z¢This full-featured snippet is awaiting <b>'test_task'</b> in the <b>'test_workflow'</b> workflow. Only reviewers for this task can edit the full-featured snippet.)r   r   r   r   r|   r}   r¾   r   Ústartr   r   Úget_lockÚassertIsInstancer   rR   Úfor_userrZ   r¹   rS   Úget_messager[   )r    rÃ   rÄ   rL   Ú
other_taskr!   r!   r"   Útest_when_locked_by_workflow¾  s*   

þ

þz-TestWorkflowLock.test_when_locked_by_workflow)rD   rE   rF   r   r   r#   rÎ   Ú__classcell__r!   r!   r¿   r"   r¸   ²  s    	r¸   N)%Údjango.contrib.admin.utilsr   Údjango.contrib.authr   Údjango.contrib.auth.modelsr   r   Údjango.testr   r   Údjango.urlsr   r	   Údjango.utilsr
   Úwagtail.admin.utilsr   Úwagtail.locksr   Úwagtail.modelsr   r   r   Úwagtail.test.testapp.modelsr   r   r   r   Úwagtail.test.utilsr   r   rH   rJ   r   r‚   r·   r¸   r!   r!   r!   r"   Ú<module>   s*    1 q  o