a
    Døg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!   úb/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/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 u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 u 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ÚcodenameÚ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 )NrC   é•  )rF   r7   r+   r3   rJ   Ústatus_codeÚassertFalser   r,   ÚassertIsNoner-   r/   rL   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 rB   )r1   r   rF   rG   r+   r3   rH   rI   r   r,   rJ   r-   rK   r/   rL   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'   rC   Únext)r+   rF   rG   r3   rH   rI   r   r,   rJ   r-   r   rK   r/   ©r    Znext_urlrM   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 )NrC   rV   úhttp://www.google.co.ukrD   rE   rL   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 )NrD   é–˜ r'   é”  )rF   rG   r+   r   r3   rJ   rP   rQ   r   r,   rR   r-   r/   rL   r!   r!   r"   Útest_lock_post_bad_snippet‘   s    z&TestLocking.test_lock_post_bad_snippetc                 C   sP   t jjdd| _|  t¡" | j |  d¡¡ W d   ƒ n1 sB0    Y  d S )NúI'm a non-lockable snippet!r   rC   ©	r   r   r   r   ÚassertRaisesr   rF   rG   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 )NrC   Úwagtailadmin_home)r;   rF   rG   r+   r3   rH   r	   rQ   r   r,   rR   r-   r/   rL   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ÚunlockrD   ©r1   r   rF   rG   r+   r3   rH   rQ   r   r,   rR   r-   r/   rL   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 )Nre   rO   )r1   r   rF   r7   r+   r3   rJ   rP   rI   r   r,   r-   rK   r/   rL   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 rd   )rF   rG   r+   r3   rH   rQ   r   r,   rR   r-   r/   rL   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 )NrU   r'   re   rV   )r1   r   r+   rF   rG   r3   rH   rQ   r   r,   rR   r-   r/   rW   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 )Nre   rV   rY   rD   rf   rL   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 )Nre   r[   r'   r\   )r1   r   rF   rG   r+   r   r3   rJ   rP   rI   r   r,   r-   rK   r/   rL   r!   r!   r"   Útest_unlock_post_bad_snippetþ   s    z(TestLocking.test_unlock_post_bad_snippetc                 C   sP   t jjdd| _|  t¡" | j |  d¡¡ W d   ƒ n1 sB0    Y  d S )Nr^   r   re   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*   Úuser2re   i.  )r   r6   ÚgroupsÚaddr   r   r7   r0   r1   Úcreate_userrF   rG   r+   r3   rJ   rP   rI   r   r,   rK   r/   rL   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.Frn   ro   rb   re   rV   N)r   r6   rq   rr   r   r   r7   r0   r1   r	   rF   rG   r+   r3   rH   rQ   r   r,   rR   r-   r/   rW   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>   rN   rS   rT   rX   rZ   r]   ra   rc   rg   rh   ri   rj   rk   rl   rm   rt   ru   r!   r!   r!   r"   rA   M   s"   rA   c                   @   s   e Zd ZdS )ÚTestLockingWithDraftStateN)r<   r=   r>   r!   r!   r!   r"   rv   =  s   rv   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.rp   rD   r   úEdited while lockedúThe ú# could not be saved as it is lockedr   N)r1   rs   rF   rG   r+   r3   ÚassertContainsr&   rI   r   r,   rJ   r   rL   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.rD   r   rx   T)Úfollowry   rz   N)r1   r   rF   rG   r+   r3   ÚassertNotContainsr&   rI   r   r,   rJ   r   rL   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.rD   r   rx   ry   rz   r   N)r1   r   rF   rG   r+   r3   r{   r&   rI   r   r,   rJ   r   rL   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 d  ƒ q1 sø0    Y  qdS )zBA user can edit and unlock a snippet that is locked by themselves.Úchangere   z3User can edit and unlock an object they have locked)r:   rD   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;   rF   r7   r+   ÚcontentÚdecoder{   Úsave_button_labelÚassertTagInHTMLr&   )r    Zcasesr:   rM   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.rp   r   re   rD   ú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©rs   r1   r;   rF   r7   r+   r   r   r   r{   r&   r~   r‘   r’   ©r    r   rM   r…   r“   Z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.
        rp   r   rD   re   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   rD   rC   ú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;   rF   r7   r+   r   r   r~   r{   r&   r‘   r’   ©r    rM   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   rC   rD   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‘   r|   r   r   r€   r”   r›   rœ   r¢   r£   r!   r!   r!   r"   rw   A  s   
A9>:rw   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
Moderatorsro   r   )r   Úpublish)Úsuperr#   r   Zsave_revisionrs   r¦   r   r   r7   Ú
moderatorsrq   rr   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_workflowro   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   rq   rr   r©   r   Ústartr   r   Zget_lockZassertIsInstancer   rI   Zfor_userrQ   r¦   rJ   Zget_messagerR   )r    r¬   r­   rC   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@   rA   rv   rw   r¤   r¥   r!   r!   r!   r"   Ú<module>   s(   1 q  o