U
    |®Þ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!   úk/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/snippets/tests/test_locking.pyÚsetUp   s    
zBaseLockingTestCase.setUpc                 C   s
   | j jjS ©N)r   Ú_metaZverbose_namer   r!   r!   r"   Ú
model_name   s    zBaseLockingTestCase.model_nameNc                 C   s0   |d k	r|nt | jjƒg}t| jj |¡|dS )N©Úargs)r   r   Úpkr	   Zsnippet_viewsetZ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 kr| j }d|_tjjdddg}|D ]$}| tjjdt|| jjƒd¡ q*|j	 
|¡ | ¡  d S )NFZwagtailadminZaccess_admin)Zcontent_type__app_labelÚcodenameZtests)r   Úis_superuserr   r   ÚgetÚappendr   r   r%   Zuser_permissionsÚsetr0   )r    Zpermission_namesr   Úpermissionsr*   r!   r!   r"   Úset_permissions,   s"    þÿþÿz#BaseLockingTestCase.set_permissions)N)N)N)Ú__name__Ú
__module__Ú__qualname__r   r   r#   Úpropertyr&   r+   r1   r3   r:   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   r2   Zget_latest_revision_as_objectr   r!   r!   r"   r3   H   s    
z'DraftStateModelTestCase.refresh_snippetN)r;   r<   r=   r   r   r3   r!   r!   r!   r"   r?   E   s   r?   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+   r3   ÚassertRedirectsÚ
assertTruer   r,   ÚassertEqualr-   r   ÚassertIsNotNoner/   ©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 )NrB   é•  )rE   r6   r+   r3   rI   Ústatus_codeÚassertFalser   r,   ÚassertIsNoner-   r/   rK   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 rA   )r1   r   rE   rF   r+   r3   rG   rH   r   r,   rI   r-   rJ   r/   rK   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'   rB   Únext)r+   rE   rF   r3   rG   rH   r   r,   rI   r-   r   rJ   r/   ©r    Znext_urlrL   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 )NrB   rU   úhttp://www.google.co.ukrC   rD   rK   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 )NrC   é–˜ r'   é”  )rE   rF   r+   r   r3   rI   rO   rP   r   r,   rQ   r-   r/   rK   r!   r!   r"   Útest_lock_post_bad_snippet‘   s    z&TestLocking.test_lock_post_bad_snippetc              	   C   s<   t jjdd| _|  t¡ | j |  d¡¡ W 5 Q R X d S )NúI'm a non-lockable snippet!r   rB   ©	r   r   r   r   ZassertRaisesr   rE   rF   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 )NrB   Úwagtailadmin_home)r:   rE   rF   r+   r3   rG   r	   rP   r   r,   rQ   r-   r/   rK   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ÚunlockrC   ©r1   r   rE   rF   r+   r3   rG   rP   r   r,   rQ   r-   r/   rK   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 )Nrc   rN   )r1   r   rE   r6   r+   r3   rI   rO   rH   r   r,   r-   rJ   r/   rK   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 rb   )rE   rF   r+   r3   rG   rP   r   r,   rQ   r-   r/   rK   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 )NrT   r'   rc   rU   )r1   r   r+   rE   rF   r3   rG   rP   r   r,   rQ   r-   r/   rV   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 )Nrc   rU   rX   rC   rd   rK   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 )Nrc   rZ   r'   r[   )r1   r   rE   rF   r+   r   r3   rI   rO   rH   r   r,   r-   rJ   r/   rK   r!   r!   r"   Útest_unlock_post_bad_snippetþ   s    z(TestLocking.test_unlock_post_bad_snippetc              	   C   s<   t jjdd| _|  t¡ | j |  d¡¡ W 5 Q R X d S )Nr]   r   rc   r^   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*   Úuser2rc   i.  )r   r5   ÚgroupsÚaddr   r   r6   r0   r1   Úcreate_userrE   rF   r+   r3   rI   rO   rH   r   r,   rJ   r/   rK   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.Frl   rm   r`   rc   rU   N)r   r5   ro   rp   r   r   r6   r0   r1   r	   rE   rF   r+   r3   rG   rP   r   r,   rQ   r-   r/   rV   r!   r!   r"   Ú1test_unlock_post_own_snippet_with_bad_permissions%  s    
z=TestLocking.test_unlock_post_own_snippet_with_bad_permissionsN)r;   r<   r=   rM   rR   rS   rW   rY   r\   r_   ra   re   rf   rg   rh   ri   rj   rk   rr   rs   r!   r!   r!   r"   r@   M   s"   r@   c                   @   s   e Zd ZdS )ÚTestLockingWithDraftStateN)r;   r<   r=   r!   r!   r!   r"   rt   =  s   rt   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 )ÚTestEditLockedSnippetZ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.rn   rC   r   úEdited while lockedúThe ú# could not be saved as it is lockedr   N)r1   rq   rE   rF   r+   r3   ÚassertContainsr&   rH   r   r,   rI   r   rK   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.rC   r   rv   T)Úfollowrw   rx   N)r1   r   rE   rF   r+   r3   ÚassertNotContainsr&   rH   r   r,   rI   r   rK   r!   r!   r"   Útest_edit_post_locked_by_self\  s    ýþz3TestEditLockedSnippet.test_edit_post_locked_by_selfT)Z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.rC   r   rv   rw   rx   r   N)r1   r   rE   rF   r+   r3   ry   r&   rH   r   r,   rI   r   rK   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 ]Ü}| j d|dÄ |  | 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 5 Q R X qdS )zBA user can edit and unlock a snippet that is locked by themselves.Úchangerc   z3User can edit and unlock an object they have locked)r9   rC   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   ©ÚcountZ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)ZsubTestr1   r   r:   rE   r6   r+   ÚcontentÚdecodery   Úsave_button_labelÚassertTagInHTMLr&   )r    Zcasesr9   rL   rƒ   Ú
unlock_urlr!   r!   r"   Útest_edit_get_locked_by_selfŽ  sX    þþ


þýüþ
ü
ü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.rn   r   rc   rC   ú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©rq   r1   r:   rE   r6   r+   r   rŽ   r   ry   r&   r|   r   r   ©r    r   rL   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.
        rn   r   rC   rc   r“   r”   r•   r–   r‡   Z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   rC   rB   ú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©r:   rE   r6   r+   r   rŽ   r|   ry   r&   r   r   ©r    rL   rƒ   Z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   rB   rC   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)r;   r<   r=   r   rz   r}   r   r~   r’   rš   r›   r¡   r¢   r!   r!   r!   r"   ru   A  s   
A9>:ru   c                   @   s   e Zd ZdZdS )ÚTestEditLockedDraftStateSnippetz
Save draftN)r;   r<   r=   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Ú	moderatorZ
Moderatorsrm   r   )r   Úpublish)Úsuperr#   r   Zsave_revisionrq   r¥   r   r   r6   Ú
moderatorsro   rp   r:   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 )
NZtest_workflowrm   Z	test_taskrŠ   )ÚworkflowÚtaskZ
sort_orderz}This full-featured snippet is currently awaiting moderation. Only reviewers for this task can edit the full-featured snippet.Z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   ro   rp   r¨   r   Ústartr   r   Zget_lockZassertIsInstancer   rH   Zfor_userrP   r¥   rI   Zget_messagerQ   )r    r«   r¬   rB   Z
other_taskr!   r!   r"   Útest_when_locked_by_workflow¾  s*    

þ

þz-TestWorkflowLock.test_when_locked_by_workflow)r;   r<   r=   r   r   r#   r¯   Ú__classcell__r!   r!   r©   r"   r¤   ²  s   	r¤   N)%Zdjango.contrib.admin.utilsr   Zdjango.contrib.authr   Zdjango.contrib.auth.modelsr   r   Zdjango.testr   r   Zdjango.urlsr   r	   Zdjango.utilsr
   Zwagtail.admin.utilsr   Zwagtail.locksr   Zwagtail.modelsr   r   r   Zwagtail.test.testapp.modelsr   r   r   r   Zwagtail.test.utilsr   r   r?   r@   rt   ru   r£   r¤   r!   r!   r!   r"   Ú<module>   s(   1 q  o