o
    ho                    @   s  d dl Z d dlZd dlZd dlmZmZ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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!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-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC dd ZDG dd de?eZEG dd deAe?eZFG dd de?eZGG dd  d eGZHG d!d" d"eAe?eZIG d#d$ d$eAe?eZJG d%d& d&e?eZKG d'd( d(eAe?eZLG d)d* d*eAe?eZMG d+d, d,e?eZNG d-d. d.eAe?eZOG d/d0 d0eAe?eZPG d1d2 d2ePZQG d3d4 d4ePZRG d5d6 d6eReQZSG d7d8 d8eSZTed9G d:d; d;ePZUG d<d= d=eUeQZVG d>d? d?eVZWed9G d@dA dAePZXG dBdC dCeXZYG dDdE dEeXeQZZG dFdG dGeYeQZ[G dHdI dIeXeQZ\G dJdK dKeYeQZ]G dLdM dMePZ^edNdOG dPdQ dQe^Z_G dRdS dSe^eQZ`edNdOG dTdU dUe`ZaG dVdW dWePZbG dXdY dYebeQZcG dZd[ d[ePZdG d\d] d]edeQZeG d^d_ d_e?eZfG d`da dae?eZgG dbdc dce?eZheddG dedf dfePZiG dgdh dheieQZjG didj djejZkG dkdl dlePZlG dmdn dneleQZmG dodp dpemZnG dqdr drePZodS )s    N)expectedFailuremockskip)settings)quote)Group
Permission)ContentType)mail)EmailMultiAlternatives)TestCaseoverride_settings)reverse)freeze_time)load_workbook)AdminURLFinder)BaseWorkflowStateEmailNotifier"WorkflowStateApprovalEmailNotifier#WorkflowStateRejectionEmailNotifier)versioned_static)get_admin_base_urlget_latest_strget_user_display_name)GroupApprovalTaskGroupPagePermissionPagePageViewRestrictionTask	TaskStateWorkflowWorkflowContentTypeWorkflowPageWorkflowStateWorkflowTask)page_published	published)FullFeaturedSnippetModeratedModelMultiPreviewModesPage
SimplePage
SimpleTask)WagtailTestUtils)AdminTemplateTestUtils)UserProfilec                   C   s<   t j   tj   tj   tj   d S N)r!   objectsalldeleter   r   r#    r2   r2   b/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/admin/tests/test_workflows.pydelete_existing_workflows7   s   r4   c                   @   s6   e Zd Zdd Zdd Zdd Zeddd	d
 ZdS )TestWorkflowMenusc                 C   s:   |    | jdddd| _tjjdd}|j| j d S )Neditoreditor@email.compasswordusernameemailr8   Editorsname)logincreate_userr6   r   r/   getuser_setadd)selfeditorsr2   r2   r3   setUp?   s   zTestWorkflowMenus.setUpc                 C   @   | j d}| |d | |d | |d | |d d S N/admin/"url": "/admin/workflows/list/"&"url": "/admin/workflows/tasks/index/"!"url": "/admin/reports/workflow/"'"url": "/admin/reports/workflow_tasks/")clientrA   assertContainsrD   responser2   r2   r3   ;test_workflow_settings_and_reports_menus_are_shown_to_adminJ   s
   zMTestWorkflowMenus.test_workflow_settings_and_reports_menus_are_shown_to_adminc                 C   sN   | j | jd | jd}| |d | |d | |d | |d d S )NuserrI   rJ   rK   rL   rM   )r?   r6   rN   rA   assertNotContainsrO   rP   r2   r2   r3   4test_workflow_settings_menus_are_not_shown_to_editorQ   s   zFTestWorkflowMenus.test_workflow_settings_menus_are_not_shown_to_editorF)WAGTAIL_WORKFLOW_ENABLEDc                 C   rG   rH   )rN   rA   rU   rP   r2   r2   r3   :test_workflow_menus_are_hidden_when_workflows_are_disabledY   s
   zLTestWorkflowMenus.test_workflow_menus_are_hidden_when_workflows_are_disabledN)__name__
__module____qualname__rF   rR   rV   r   rX   r2   r2   r2   r3   r5   >   s    r5   c                   @   sp   e Zd Zdd Z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S )TestWorkflowsIndexViewc                 C      t   |   | jdddd| _tjjdd}|j| j | jdddd| _	tjjd	d}|j| j	 |j
tjjd
d d S )Nr6   r7   r8   r9   r<   r=   	moderatormoderator@email.com
Moderatorsadd_workflowcodenamer4   r?   r@   r6   r   r/   rA   rB   rC   r^   permissionsr   rD   rE   
moderatorsr2   r2   r3   rF   c   "   zTestWorkflowsIndexView.setUpc                    sn   t jjdd dd tdD }tjjddfdd|D }tj|  fd	d|D }tj| d S )
N   depthc                 S   s"   g | ]}t jjd | ddqS )test_workflow_Tr>   activer   r/   create.0ir2   r2   r3   
<listcomp>z   s    z;TestWorkflowsIndexView.create_workflows.<locals>.<listcomp>   	test_taskr=   c                    s   g | ]}t | d qS )workflowtaskr#   rr   rx   ry   r2   r3   rt      s    c              	      s(   g | ]}t | jtd ddddqS )SimplezVery simpletitlecontentinstancerx   page)r!   	add_childr)   r{   )	home_pager2   r3   rt      s    
)	r   r/   rA   ranger*   rp   r#   bulk_creater!   )rD   	workflowsworkflow_tasksworkflow_pagesr2   )r   ry   r3   create_workflowsx   s   

	z'TestWorkflowsIndexView.create_workflowsc                 C      | j td|S )Nwagtailadmin_workflows:indexrN   rA   r   rD   paramsr2   r2   r3   rA         zTestWorkflowsIndexView.getc                 C      |   }| |jd | |d | dddg|j | |d tjj	ddd	 |   }| |jd | |d | 
|d | |d d S )
N   !wagtailadmin/workflows/index.html 	WorkflowsurllabelThere are no enabled workflows.test_workflowTrm   )rA   assertEqualstatus_codeassertTemplateUsedassertBreadcrumbsItemsRenderedr   rO   r   r/   rp   rU   rP   r2   r2   r3   test_simple      
z"TestWorkflowsIndexView.test_simplec                    s   t jjdd t jjdd}ttfD ]}tjj|tj|d q|  }| 	|j
d | |j} fdd|dD }| 	|g d	 d S )
NNocontenttypesr=   Multicontenttypesrx   content_typer   c                    s"   g | ]}|j d dd  r qS )z | T	separatorstripget_text)rr   tdtextr2   r3   rt      s    zVTestWorkflowsIndexView.test_multiple_snippets_assigned_to_workflow.<locals>.<listcomp>r   )r   z0 pages | 2 snippet typesr   z0 pages | 0 snippet types)r   r/   rp   r&   r'   r    r	   get_for_modelrA   r   r   get_soupr   select)rD   multi_ct_workflowmodelrQ   soupcellsr2   r   r3   +test_multiple_snippets_assigned_to_workflow   s"   

zBTestWorkflowsIndexView.test_multiple_snippets_assigned_to_workflowc                 C   s   |    |   | d |   W d    n1 sw   Y  |    | d |   W d    d S 1 s:w   Y  d S )N   !   )r   rA   assertNumQueriesrD   r2   r2   r3   test_num_queries   s   

"z'TestWorkflowsIndexView.test_num_queriesc                 C   s  t jjddd | jddid}| |jd | |d | |d | j|d	d
d | |j	}|
d}| | | |jdd
dd |
d}| | | |d | ji d}| |jd | |d | |j	}|
d}| | |
d}| | | |d d S )Nr   Frm   show_disabledtruer   r   zNo workflows have been created.&<span class="w-status">Disabled</span>Thtml,[data-w-active-filter-id="id_show_disabled"] r   Show disabled: Yes)input[name="show_disabled"][value="true"]checkedr   *input[name="show_disabled"][value="false"])r   r/   rp   rA   r   r   rU   rO   r   r   
select_oneassertIsNotNoner   
assertTruehas_attrassertIsNonerD   rQ   r   active_filtershow_disabled_yesshow_disabled_nor2   r2   r3   test_deactivated   s6   







z'TestWorkflowsIndexView.test_deactivatedc                 C   l   | j | jd |  }| |jd dd |jD }| |d d | j | jd |  }| |jd d S )NrS   .  c                 S   $   i | ]}|  D ]\}}||qqS r2   itemsrr   contextkeyvaluer2   r2   r3   
<dictcomp>   
    
z;TestWorkflowsIndexView.test_permissions.<locals>.<dictcomp>message6Sorry, you do not have permission to access this area.r   r?   r6   rA   r   r   r   r^   rD   rQ   full_contextr2   r2   r3   test_permissions      z'TestWorkflowsIndexView.test_permissionsc                 C     t tjjddtjjddtjjddgdd d}|  }| |jd | |jd	 | | |jd	 j	j
d | jd
did}| |jd | |jd	 | | |jd	 j	j
d | jd
did}| |jd | |jd	 |d d d  | |jd	 j	j
d d S )N
workflow_1r=   
workflow_3
workflow_2c                 S      | j S r.   r=   rx   r2   r2   r3   <lambda>      z6TestWorkflowsIndexView.test_ordering.<locals>.<lambda>r   r   object_listorderingr>   r   -namer   )sortedr   r/   rp   rA   r   r   assertSequenceEqualr   queryorder_byrD   r   rQ   r2   r2   r3   test_ordering   &   
z$TestWorkflowsIndexView.test_orderingc                 C   p   t jjdd t jjdd t jjdd | jddid}| |jd | |d | |d | |d d S )	Nfoo workflowr=   bar workflowbar world workflowqbArr   r   )r   r/   rp   rA   r   r   rO   rU   rP   r2   r2   r3   test_search     z"TestWorkflowsIndexView.test_searchc                 C      t jjdd t jjdd t jjdd | jtdddi}| |jd | |j	 | 
|d | 
|d | |d d S )	Nr   r=   r   r   z$wagtailadmin_workflows:index_resultsr   ARr   )r   r/   rp   rN   rA   r   r   r   assertBreadcrumbsNotRenderedr   rO   rU   rP   r2   r2   r3   test_search_results#     z*TestWorkflowsIndexView.test_search_resultsc                 C      t jdd tddD  td}| ddi}| |jd | t|j	d	 d
 | 
||d  | ||d  | 
||d  | ddi}| |jd | |d | |j	d j|j	d j d S )Nc                 S      g | ]
}t d | dqS 	workflow_r=   )r   rq   r2   r2   r3   rt   4      z:TestWorkflowsIndexView.test_pagination.<locals>.<listcomp>   2   r   pri   r   r      ?p=1?p=2?p=3   r   page_obj	paginator)r   r/   r   r   r   rA   r   r   lenr   rO   rU   r   number	num_pagesrD   r   rQ   r2   r2   r3   test_pagination2  s"   

z&TestWorkflowsIndexView.test_paginationN)rY   rZ   r[   rF   r   rA   r   r   r   r   r   r   r   r  r  r2   r2   r2   r3   r\   b   s    	$r\   c                   @   s<   e Zd ZdZdd Zi fddZdd Zdd	 Zd
d ZdS )TestWorkflowPermissionswagtailadmin_reports:workflowc                 C   s   |   | _d S r.   )r?   rT   r   r2   r2   r3   rF   O     zTestWorkflowPermissions.setUpc                 C   s   | j t| j|S r.   )rN   rA   r   url_namer   r2   r2   r3   rA   R     zTestWorkflowPermissions.getc                 C   s   |   }| |jd d S )Nr   rA   r   r   rP   r2   r2   r3   r   U  s   z#TestWorkflowPermissions.test_simplec                 C   sr   t jjdd}d| j_| j  | jj| | jjt	jj
ddd | 
 }| |jd | |td d S )	N
test groupr=   Fwagtailadminaccess_admincontent_type__app_labelrc   r   wagtailadmin_home)r   r/   rp   rT   is_superusersavegroupsrC   user_permissionsr   rA   r   r   assertRedirectsr   rD   grouprQ   r2   r2   r3   test_get_with_no_permissionY  s   
z3TestWorkflowPermissions.test_get_with_no_permissionc                 C   sz   t jjdd}d| j_| j  | jj| | jjt	jj
ddd tjj|tj dd | 
 }| |jd	 d S )
Nr   r=   Fr!  r"  r#  changer,  r   permission_typer   )r   r/   rp   rT   r&  r'  r(  rC   r)  r   rA   r   r   firstr   r   r+  r2   r2   r3   !test_get_with_minimal_permissionsi  s    
z9TestWorkflowPermissions.test_get_with_minimal_permissionsN)	rY   rZ   r[   r  rF   rA   r   r-  r2  r2   r2   r2   r3   r  L  s    r  c                   @   s   e Zd ZdZdS )TestWorkflowTaskPermissions#wagtailadmin_reports:workflow_tasksN)rY   rZ   r[   r  r2   r2   r2   r3   r3  ~      r3  c                   @   sT   e Zd Zdd Zi fddZi fddZdd Zd	d
 Zdd Zdd Z	dd Z
dS )TestWorkflowsCreateViewc                 C   s   t   |   tjjdd| _tjjdd| _| jdddd| _t	jj
dd}|j| j | jd	d
dd| _t	jj
dd}|j| j |jtjj
dd tjj
dd| _tjjdd| _tjt| _d S )N
first_taskr=   second_taskr6   r7   r8   r9   r<   r^   r_   r`   ra   rb   r  rj   foor   )r4   r?   r*   r/   rp   task_1task_2r@   r6   r   rA   rB   rC   r^   re   r   r   	root_pager&   snippetr	   r   snippet_content_typerf   r2   r2   r3   rF     s0   
zTestWorkflowsCreateView.setUpc                 C   r   Nzwagtailadmin_workflows:addr   r   r2   r2   r3   rA     r   zTestWorkflowsCreateView.getc                 C   r   r?  )rN   postr   rD   	post_datar2   r2   r3   r@    r   zTestWorkflowsCreateView.postc                 C   s   |   }| |jd | |d | ddddddg|j | |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  d S )Nr   z"wagtailadmin/workflows/create.htmlr   /admin/workflows/list/r   r   zNew: Workflowr   workflow-pages-sectionid	w-formsetdata-controllertotalFormsInputid_pages-TOTAL_FORMSdata-w-formset-targettemplatetabletbodyformstrchilddeleteInputid_pages-0-DELETE)
rA   r   r   r   r   r   r   findassertInattrsrD   rQ   r   workflow_pages_panelrO  rowr2   r2   r3   test_get  sN   	
z TestWorkflowsCreateView.test_getc              
   C   s  |  i ddgddgddgddgd	dgd
dgdt| jjgddgddgddgdt| jjgddgddgddgddgddgddgdgt| jjgdgdgdgt| jjgd}| |td t	j
jddd}| | d | }| | jj| jjgt|j | tj
j|| jjdjd | tj
j|| jjdjd | | j | | t | | | j | d S ) Nr>   r   rn   onworkflow_tasks-TOTAL_FORMS2workflow_tasks-INITIAL_FORMS0workflow_tasks-MIN_NUM_FORMSworkflow_tasks-MAX_NUM_FORMS1000workflow_tasks-0-taskworkflow_tasks-0-idr   workflow_tasks-0-ORDER1workflow_tasks-0-DELETEworkflow_tasks-1-taskworkflow_tasks-1-idworkflow_tasks-1-ORDERworkflow_tasks-1-DELETEpages-TOTAL_FORMSpages-INITIAL_FORMSpages-MIN_NUM_FORMSpages-MAX_NUM_FORMSpages-0-pagepages-0-DELETEpages-1-pagepages-1-DELETEcontent_typesr   Trm   r  rw   r   )r@  strr:  rG  r;  r<  r>  r*  r   r   r/   filterr   countr1  task_ptrlisttasksr#   rA   
sort_orderget_workflowr&   get_default_workflowr=  )rD   rQ   r   rx   r2   r2   r3   	test_post  s   	
z!TestWorkflowsCreateView.test_postc                 C   r   )NrS   r   c                 S   r   r2   r   r   r2   r2   r3   r     r   z<TestWorkflowsCreateView.test_permissions.<locals>.<dictcomp>r   r   r   r   r   r2   r2   r3   r     r   z(TestWorkflowsCreateView.test_permissionsc              	   C   s  t jjdd}tjj|| jd | i ddgddgdd	gd
dgddgddgdt| jjgddgddgddgdt| j	jgddgdd	gddgdd	gddgddgdgt| jjgdgdgdgd}| 
|jd | |jd dd d!g d S )"Nexisting_workflowr=   r   r>   r   rn   r\  r]  r^  r_  r`  ra  rb  rc  rd  re  r   rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rq  rr  rs  rt  ru  r   pages_formsetr   r   z<This page already has workflow 'existing_workflow' assigned.)r   r/   rp   r!   r<  r@  rw  r:  rG  r;  r   r   assertFormSetErrorr   )rD   rx   rQ   r2   r2   r3   $test_page_already_has_workflow_check&  sh   	
z<TestWorkflowsCreateView.test_page_already_has_workflow_checkc              
   C   s2  t jjdd}tjj|| jd | i ddgddgdd	gd
dgddgddgdt| jjgddgddgddgdt| j	jgddgdd	gddgdd	gddgddgdgt| j
jgdgdgdgt| jjgd}| |jd | j|ddd d! tjj| jd"}| |j| d S )#Nr  r=   r   r>   r   rn   r\  r]  r^  r_  r`  ra  rb  rc  rd  re  r   rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  r   zRSnippet 'Full-featured snippet' already has workflow 'existing_workflow' assigned.r  Try  r   r   )r   r/   rp   r    r>  r@  rw  r:  rG  r;  r<  r   r   rO   rA   rx   )rD   rx   rQ   linkr2   r2   r3   'test_snippet_already_has_workflow_checkM  sr   	
z?TestWorkflowsCreateView.test_snippet_already_has_workflow_checkN)rY   rZ   r[   rF   rA   r@  r[  r  r   r  r  r2   r2   r2   r3   r6    s    .B'r6  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S )TestWorkflowsEditViewc                 C   s$  t   |  | _tjjdd| _tjjdd| _tjjdd| _	tjjddd| _
tjj| j| jjdd	| _tj | _tjt| _tjj| j| jd
 tjj| j| jd | jdddd| _tjjdd}|j| j | jdddd| _tjjdd}|j| j |jtjjdd d S )Nworkflow_to_editr=   r7  r8  inactive_taskFrm   r   rx   ry   r}  r   r   r6   r7   r8   r9   r<   r^   r_   r`   change_workflowrb   ) r4   r?   rT   r   r/   rp   rx   r*   r:  r;  r  r#   rz  workflow_taskr   r1  r   r	   r   r&   r>  r!   r    r@   r6   r   rA   rB   rC   r^   re   r   rf   r2   r2   r3   rF   }  sD   
zTestWorkflowsEditView.setUpc                 C      | j td| jjgd|S Nzwagtailadmin_workflows:editargs)rN   rA   r   rx   rG  r   r2   r2   r3   rA        zTestWorkflowsEditView.getc                 C   r  r  )rN   r@  r   rx   rG  rA  r2   r2   r3   r@    r  zTestWorkflowsEditView.postc                 C   s  |   }| |jd | |d | ddddt| jdg|j | || j	j
 | |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  d S )Nr   z wagtailadmin/workflows/edit.htmlrC  r   r   r   rE  rF  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  )rA   r   r   r   r   rw  rx   r   rO   r   r   r   rU  rV  rW  rX  r2   r2   r3   r[    sP   	
zTestWorkflowsEditView.test_getc              
   C   s  |  i ddgddgddgddgd	d
gddgdt| jjgdt| jjgddgddgdt| jjgddgddgddgddgddgdd
gdgt| jjgdgdgdgt| jjgd}| |t	d t
jjddd}| | d | }| | jj| jjgt|j | tjj|| jjdjd | tjj|| jjdjd | | j | | t | tjjd d!}| | | d S )"Nr>   zEdited workflowrn   r\  r]  r^  r_  rg  ra  r`  rb  rc  rd  re  rf  rh  r   ri  rj  rk  rl  rm  rn  ro  rp  r   Trm   r  rw   r   r9  r   )r@  rw  r:  rG  r  r;  r   r>  r*  r   r   r/   rx  r   ry  r1  rz  r{  r|  r#   rA   r}  r~  r&   r  rp   )rD   rQ   r   rx   r=  r2   r2   r3   r    s   	
zTestWorkflowsEditView.test_postc                 C   r   )NrS   r   c                 S   r   r2   r   r   r2   r2   r3   r   &  r   z:TestWorkflowsEditView.test_permissions.<locals>.<dictcomp>r   r   r   r   r   r2   r2   r3   r   "  r   z&TestWorkflowsEditView.test_permissionsc                 C   J   t | j}| || j t | j}d| jj }| || j| d S )Nz/admin/workflows/edit/%d/)r   r6   r   get_edit_urlrx   r^   pkr   rD   editor_url_findermoderator_url_finderexpected_urlr2   r2   r3   test_admin_url_finder2  
   

z+TestWorkflowsEditView.test_admin_url_finderc              	   C   s  |  i dt| jjgddgddgddgdd	gd
dgdt| jjgdt| jjgddgddgdt| jjgddgddgddgddgddgdd	gdgt| jjgdgt| jjgdgd}| 	|j
d | |jd d d dg d S )Nr>   rn   r\  r]  r^  r_  rg  ra  r`  rb  rc  rd  re  rf  rh  r   ri  rj  rk  rl  rm  rn  ro  r  r   r  z@You cannot assign this workflow to the same page multiple times.)r@  rw  rx   r>   r:  rG  r  r;  r   r   r   r  r   rP   r2   r2   r3   test_duplicate_page_check9  sd   	
z/TestWorkflowsEditView.test_duplicate_page_checkc              
   C   sH  t jjdd}tjj| jdj|d | i dt| j	j
gddgdd	gd
dgddgddgdt| jjgdt| jjgddgddgdt| jjgddgdd	gddgdd	gddgddgdgt| jjgdgdgdgt| jjgd}| |jd | j|ddd d! tjj| jd}| |j	| d S )"Nother_workflowr=   r  r   r>   rn   r\  r]  r^  r_  rg  ra  r`  rb  rc  rd  re  rf  rh  r   ri  rj  rk  rl  rm  rn  ro  rp  r   zOSnippet 'Full-featured snippet' already has workflow 'other_workflow' assigned.r  Tr  )r   r/   rp   r    rx  r>  updater@  rw  rx   r>   r:  rG  r  r;  r   r   r   rO   rA   )rD   r  rQ   r  r2   r2   r3   r  ]  sv   	
z=TestWorkflowsEditView.test_snippet_already_has_workflow_checkc                 C   V   d| j _| j   |  }| |j}td| j jfd}|dd|i}| 	| d S )NFwagtailadmin_workflows:enabler  buttondata-w-action-url-value)
rx   rn   r'  rA   r   r   r   r  rU  r   rD   rQ   r   
enable_urlenable_buttonr2   r2   r3   .test_render_enable_button_if_workflow_disabled     
zDTestWorkflowsEditView.test_render_enable_button_if_workflow_disabledc                 C      d| j _| j   | j jtjjdddtjjddtjjdd d| j_	| j  |  }| 
|j}td| jjfd	}|d
d|i}| | d S )NFr!  r"  r#  ra   rb   r  r  r  r  r  )rT   r&  r'  r)  rC   r   r/   rA   rx   rn   r   r   r   r  rU  r   r  r2   r2   r3   Btest_render_enable_button_if_workflow_disabled_minimal_permissions  "   

zXTestWorkflowsEditView.test_render_enable_button_if_workflow_disabled_minimal_permissionsc                 C      d| j _| j   | j jtjjdddtjjdd d| j_	| j  |  }| 
|j}td| jjfd}|d	d
|i}| | d S )NFr!  r"  r#  r  rb   r  r  r  r  )rT   r&  r'  r)  rC   r   r/   rA   rx   rn   r   r   r   r  rU  r   r  r2   r2   r3   =test_render_enable_button_if_workflow_disabled_no_permissions      

zSTestWorkflowsEditView.test_render_enable_button_if_workflow_disabled_no_permissionsc              
   C   sT  d| j _| j   | j j   | j j   | i dt| j j	gddgddgddgd	d
gddgdt| j
jgdt| jjgddgddgdt| jjgddgddgddgddgddgdd
gdgt| jjgdgdgdgt| jjgd}| |td | j   | | j j  | | j j  d S )NFr>   rn   r\  r]  r^  r_  rg  ra  r`  rb  rc  rd  re  rf  rh  r   ri  rj  rk  rl  rm  rn  ro  rp  r   )rx   rn   r'  r   r0   r1   workflow_content_typesr@  rw  r>   r:  rG  r  r;  r   r>  r*  r   refresh_from_dbassertFalseexistsrP   r2   r2   r3   9test_pages_and_content_types_ignored_if_workflow_disabled  sh   
	

zOTestWorkflowsEditView.test_pages_and_content_types_ignored_if_workflow_disabledN)rY   rZ   r[   rF   rA   r@  r[  r  r   r  r  r  r  r  r  r  r2   r2   r2   r3   r  |  s    &2C$0	r  c                   @   s>   e Zd ZdgZdd Zi fddZdd Zdd	 Zd
d ZdS )TestRemoveWorkflowz	test.jsonc                 C   s   t   |   tjjdd| _tj | _t	jj| j| jd | j
dddd| _tjjdd}|j| j | j
d	d
dd| _tjjdd}|j| j |jtjjdd d S )Nrx   r=   r   r6   r7   r8   r9   r<   r^   r_   r`   r  rb   )r4   r?   r   r/   rp   rx   r   r1  r   r!   r@   r6   r   rA   rB   rC   r^   re   r   rf   r2   r2   r3   rF     s(   zTestRemoveWorkflow.setUpc                 C   s"   | j td| jj| jjgd|S )Nzwagtailadmin_workflows:remover  )rN   r@  r   r   rG  rx   rA  r2   r2   r3   r@    s   zTestRemoveWorkflow.postc                 C   s,   |    | tjj| j| jd d d S )Nr   r   )r@  r   r!   r/   rx  rx   r   ry  r   r2   r2   r3   r    s
   zTestRemoveWorkflow.test_postc                 C   sH   | j | jd |  }| tjj| j| jd	 d | |j
d d S )NrS   r   r  r   )r?   r6   r@  r   r!   r/   rx  rx   r   ry  r   rP   r2   r2   r3   test_no_permissions  s   z&TestRemoveWorkflow.test_no_permissionsc                 C   s(   | j | jd |  }| |jd d S )NrS   r   )r?   r^   r@  r   r   rP   r2   r2   r3   test_post_with_permission  s   z,TestRemoveWorkflow.test_post_with_permissionN)	rY   rZ   r[   fixturesrF   r@  r  r  r  r2   r2   r2   r3   r    s    
r  c                   @   sp   e Zd Z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S )TestTaskIndexViewc                 C   r]   )Nr6   r7   r8   r9   r<   r=   r^   r_   r`   change_taskrb   rd   rf   r2   r2   r3   rF   $  rh   zTestTaskIndexView.setUpc                 C   r   )N!wagtailadmin_workflows:task_indexr   r   r2   r2   r3   rA   9  r   zTestTaskIndexView.getc                 C   r   )
Nr   &wagtailadmin/workflows/task_index.htmlr   Workflow tasksr   There are no enabled tasksrv   Trm   )rA   r   r   r   r   r   rO   r*   r/   rp   rU   rP   r2   r2   r3   r   <  r   zTestTaskIndexView.test_simplec                 C   s*  t jjddd | jddid}| |jd | |d | |d | j|d	d
d | |j	}|
d}| | | |jdd
dd |
d}| | | |d | ji d}| |jd | |d | |d | |j	}|
d}| | |
d}| | | |d d S )Nrv   Frm   r   r   r   r   zNo tasks have been created.r   Tr   r   r   r   r   r   r   r  r   )r   r/   rp   rA   r   r   rU   rO   r   r   r   r   r   r   r   r   r   r2   r2   r3   r   Q  s8   







z"TestTaskIndexView.test_deactivatedc                 C   r   )NrS   r   c                 S   r   r2   r   r   r2   r2   r3   r   {  r   z6TestTaskIndexView.test_permissions.<locals>.<dictcomp>r   r   r   r   r   r2   r2   r3   r   w  r   z"TestTaskIndexView.test_permissionsc                 C   r   )Nr:  r=   task_3r;  c                 S   r   r.   r=   r|   r2   r2   r3   r     r   z1TestTaskIndexView.test_ordering.<locals>.<lambda>r   r   r   r   r>   r   r   r   r   )r   r   r/   rp   rA   r   r   r   r   r   r   )rD   r|  rQ   r2   r2   r3   r     r   zTestTaskIndexView.test_orderingc                 C   r   )	Nfoo taskr=   bar taskbar world taskr   r   r   r   )r   r/   rp   rA   r   r   rO   rU   rP   r2   r2   r3   r     r   zTestTaskIndexView.test_searchc                 C   r  )	Nr  r=   r  r  z)wagtailadmin_workflows:task_index_resultsr   r  r   )r   r/   rp   rN   rA   r   r   r   r  r   rO   rU   rP   r2   r2   r3   r    r  z%TestTaskIndexView.test_search_resultsc           	      C   s  t jjdd t jjdd tjjdd tjt j}tjtj}| jd|gid}| |j	d | 
|d | 
|d | |d | |j}|d}| | | |jd	d
dd |d| d}| | | |d |d| d}| | | |d | jd||gid}| |j	d | 
|d | 
|d | 
|d | |j}|d}| dd |D ddh |d| d}| | | |d |d| d}| | | |d d S )N	easy taskr=   medium taskcomplex taskr   r   r   z+[data-w-active-filter-id="id_content_type"]r   Tr   zType: Simple taskz"input[name="content_type"][value="z"]r   c                 S   s   g | ]	}|j d ddqS )r   Tr   r   )rr   rx  r2   r2   r3   rt     s    z;TestTaskIndexView.test_task_type_filter.<locals>.<listcomp>zType: Group approval task)r*   r/   rp   r   r	   r   r  rA   r   r   rO   rU   r   r   r   r   r   r   r   r  r   assertCountEqual)	rD   	simple_ctgroup_approval_ctrQ   r   r   simple_ct_boxgroup_approval_ct_boxactive_filtersr2   r2   r3   test_task_type_filter  s`   










z'TestTaskIndexView.test_task_type_filterc                 C   s   t jjdd t jjdd tjjdd tjt j}td}t g|_	| 
d|gi}W d    n1 s8w   Y  | |d | |d | |d | |j}|d}| | |d}| | d S )	Nr  r=   r  r  ,wagtail.admin.views.workflows.get_task_typesr   z.w-active_filterszinput[name="content_type"])r*   r/   rp   r   r	   r   r  r   patchreturn_valuerA   rO   r   r   r   r   )rD   r  get_task_typesrQ   r   r  content_type_filterr2   r2   r3   0test_task_type_filter_hidden_if_single_task_type  s&   


zBTestTaskIndexView.test_task_type_filter_hidden_if_single_task_typec                 C   r  )Nc                 S   r  task_r=   )r   rq   r2   r2   r3   rt     r
  z5TestTaskIndexView.test_pagination.<locals>.<listcomp>r  x   r  r  ri   r   r   r  r  r  r  r  r  r  r  )r   r/   r   r   r   rA   r   r   r  r   rO   rU   r   r  r  r  r2   r2   r3   r    s   

z!TestTaskIndexView.test_paginationc                    s   dd t dD }dd t dD  tj fdd|D  |   | d |  }W d    n1 s7w   Y  | j|ddd	 d
d t ddD  tj fdd|D  | d |  }W d    n1 sow   Y  | j|ddd	 d S )Nc                 S       g | ]}t jjd | dqS r  ro   rq   r2   r2   r3   rt   &       z6TestTaskIndexView.test_num_queries.<locals>.<listcomp>   c                 S   r  r  r   r/   rp   rq   r2   r2   r3   rt   '  r  r  c                    $   g | ]} D ]	}t ||d dqqS r   r  rz   rr   rx   ry   r|  r2   r3   rt   )         z+2 morery  c                 S   r  r  r  rq   r2   r2   r3   rt   5  r     )   c                    r  r  rz   r  r  r2   r3   rt   7  r  (   )r   r#   r/   r   rA   r   rO   r   r2   r  r3   r   %  s,   



z"TestTaskIndexView.test_num_queriesN)rY   rZ   r[   rF   rA   r   r   r   r   r   r  r  r  r  r   r2   r2   r2   r3   r  #  s    &:r  c                   @   sV   e Zd Zdd Zd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 )TestCreateTaskViewc                 C   r]   )Nr6   r7   r8   r9   r<   r=   r^   r_   r`   add_taskrb   rd   rf   r2   r2   r3   rF   D  rh   zTestCreateTaskView.setUpNc                 C   s>   |pi }| dtjj | dtjj | jtd|d|S )N	app_label
model_namewagtailadmin_workflows:add_taskkwargs)
setdefaultr*   _metar  r  rN   rA   r   )rD   
url_kwargsr   r2   r2   r3   rA   Y  s   zTestCreateTaskView.getc                 C   s$   | j tdtjjtjjdd|S )Nr  r  r  r  )rN   r@  r   r*   r  r  r  rA  r2   r2   r3   r@  a  s   zTestCreateTaskView.postc                 C   sD   |   }| |jd | |d | ddddddg|j d S )Nr   z'wagtailadmin/workflows/create_task.htmlTasks/admin/workflows/tasks/index/rD  zNew: Simple taskr   )rA   r   r   r   r   r   rP   r2   r2   r3   r[  m  s   zTestCreateTaskView.test_getc                 C   $   | j dddd}| |jd d S )NwagtailcoreSiter  r    r  rP   r2   r2   r3   test_get_with_non_task_modely     z/TestCreateTaskView.test_get_with_non_task_modelc                 C   r  )Nr  r   r  r  r  r  rP   r2   r2   r3   test_get_with_base_task_model  r  z0TestCreateTaskView.test_get_with_base_task_modelc                 C   sD   |  ddd}| |td tjjddd}| | d d S )Nrv   r\  rm   r  Tr  )r@  r*  r   r   r/   rx  r   ry  )rD   rQ   r|  r2   r2   r3   r    s   zTestCreateTaskView.test_postc                 C   r   )NrS   r   c                 S   r   r2   r   r   r2   r2   r3   r     r   z7TestCreateTaskView.test_permissions.<locals>.<dictcomp>r   r   r   r   r   r2   r2   r3   r     r   z#TestCreateTaskView.test_permissions)rY   rZ   r[   rF   rA   r@  r[  r  r  r  r   r2   r2   r2   r3   r  C  s    
r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestSelectTaskTypeViewc                 C   s   t   |   d S r.   )r4   r?   r   r2   r2   r3   rF     s   zTestSelectTaskTypeView.setUpc                 C   s   | j tdS )Nz'wagtailadmin_workflows:select_task_typer   r   r2   r2   r3   rA        zTestSelectTaskTypeView.getc                 C   sV   |   }| |jd | |d | |t  | |t  | |t  d S )Nr   z,wagtailadmin/workflows/select_task_type.html)	rA   r   r   r   rO   r*   get_verbose_namer   get_descriptionrP   r2   r2   r3   r[    s   zTestSelectTaskTypeView.test_getc                 C   s^   t d}tg|_|  }W d    n1 sw   Y  | |tdtjjtjj	fd d S )Nr  r  r  )
r   r  r   r  rA   r*  r   r  r  r  rD   r  rQ   r2   r2   r3   test_get_single_task_type  s    
z0TestSelectTaskTypeView.test_get_single_task_typeN)rY   rZ   r[   rF   rA   r[  r  r2   r2   r2   r3   r    s
    r  c                   @   sd   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S )TestEditTaskViewc                 C   s   t   |  | _tjjdd| _| jdddd| _t	jj
dd}|j| j | jdd	dd| _t	jj
d
d}|j| j |jtjj
dd d S )Nrv   r=   r6   r7   r8   r9   r<   r^   r_   r`   r  rb   )r4   r?   rT   r   r/   rp   ry   r@   r6   r   rA   rB   rC   r^   re   r   rf   r2   r2   r3   rF     s$   
zTestEditTaskView.setUpc                 C   r  N wagtailadmin_workflows:edit_taskr  )rN   rA   r   ry   rG  r   r2   r2   r3   rA     r  zTestEditTaskView.getc                 C   r  r   )rN   r@  r   ry   rG  rA  r2   r2   r3   r@    r  zTestEditTaskView.postc                 C   sJ   |   }| |jd | |d | ddddt| jdg|j d S )Nr   z%wagtailadmin/workflows/edit_task.htmlr  r  r   r   )rA   r   r   r   r   rw  ry   r   rP   r2   r2   r3   r[    s   zTestEditTaskView.test_getc                 C   s   |  | jj d tjjdd}| ddt|j	gd}| 
|td tjj| jj	d}|  |jd	 |  |j d
 | |jj|j	d  d S )Nr   r<   r=   test_task_modifiedr\  )r>   rn   r(  r  rF  rv   r  )r   ry   r(  ry  r   r/   rA   r@  rw  rG  r*  r   r   r>   r   rx  r  )rD   rE   rQ   ry   r2   r2   r3   r    s   zTestEditTaskView.test_postc                 C   r   )NrS   r   c                 S   r   r2   r   r   r2   r2   r3   r     r   z5TestEditTaskView.test_permissions.<locals>.<dictcomp>r   r   r   r   r   r2   r2   r3   r   
  r   z!TestEditTaskView.test_permissionsc                 C   r  )NF"wagtailadmin_workflows:enable_taskr  r  r  )
ry   rn   r'  rA   r   r   r   r  rU  r   r  r2   r2   r3   *test_render_enable_button_if_task_disabled  r  z;TestEditTaskView.test_render_enable_button_if_task_disabledc                 C   r  )NFr!  r"  r#  r  rb   r  r  r  r  r  )rT   r&  r'  r)  rC   r   r/   rA   ry   rn   r   r   r   r  rU  r   r  r2   r2   r3   >test_render_enable_button_if_task_disabled_minimal_permissions#  r  zOTestEditTaskView.test_render_enable_button_if_task_disabled_minimal_permissionsc                 C   r  )NFr!  r"  r#  r  rb   r  r  r  r  )rT   r&  r'  r)  rC   r   r/   rA   ry   rn   r   r   r   r  rU  r   r  r2   r2   r3   9test_render_enable_button_if_task_disabled_no_permissions6  r  zJTestEditTaskView.test_render_enable_button_if_task_disabled_no_permissionsc                 C   r  )Nz/admin/workflows/tasks/edit/%d/)r   r6   r   r  ry   r^   r  r   r  r2   r2   r3   r  H  r  z&TestEditTaskView.test_admin_url_finderN)rY   rZ   r[   rF   rA   r@  r[  r  r   r  r  r  r  r2   r2   r2   r3   r    s    	r  c                   @   sZ   e Zd ZdZdd Zdd Zdd Zdd	d
ZdddZdddZ	dddZ
dddZdS )BasePageWorkflowTestsr   c                 C   s   t   | jdddd| _tjjdd}|j| j | jdddd| _tjjd	d}|j| j | j	d
ddd| _
| j| jd |   |   d S )N	submitterzsubmitter@email.comr8   r9   r<   r=   r^   r_   r`   	superuserzsuperuser@email.comrS   )r4   r@   r  r   r/   rA   rB   rC   r^   create_superuserr	  r?   setup_workflow_and_taskssetup_objectrf   r2   r2   r3   rF   S  s.   zBasePageWorkflowTests.setUpc                 C   s   t jjdd| _tjjdd| _tjjdd| _| jjt	jj
dd | jjt	jj
dd tjj| j| jdd tjj| j| jdd d S )	Nr   r=   test_task_1test_task_2r`   r  r  ri   )r   r/   rp   rx   r   r:  r;  r(  setr   rx  r#   r   r2   r2   r3   r  o  s   


z.BasePageWorkflowTests.setup_workflow_and_tasksc                 C   sR   t jjdd}tdddddd| _|j| jd	 | jj| _tjj	| j
| jd
 d S )Nri   rF  Hello world!zhello-worldhelloFT)r   slugr   livehas_unpublished_changesr   r   )r   r/   rA   r)   objectr   specific_classobject_classr!   rp   rx   )rD   r<  r2   r2   r3   r  |  s   
z"BasePageWorkflowTests.setup_objectNc                 C   s(   t d| |d u r| jjfdS |dS )Nzwagtailadmin_pages:r  )r   r  rG  rD   viewr  r2   r2   r3   get_url  s   zBasePageWorkflowTests.get_urlc                 K   s\   dt | jjdt | jjdt | jjd| di}|r || | jj| d|fi |S )Nr   r  r   action-Trueedit)	rw  r  r   r  r   r  rN   r@  r  rD   actiondatar  rB  r2   r2   r3   r@    s   

zBasePageWorkflowTests.postc                 K   s8   | j j| jdt| jj|| jjjfd|fddi|S )Nworkflow_actionr  followT)rN   r@  r  r   r  r  current_workflow_task_staterG  )rD   r  r   r  r2   r2   r3   r!    s   

z%BasePageWorkflowTests.workflow_actionc                 K      | j d|fi |S )Napprover!  rD   r   r  r2   r2   r3   r%    r  zBasePageWorkflowTests.approvec                 K   r$  )Nrejectr&  r'  r2   r2   r3   r(    r  zBasePageWorkflowTests.rejectr.   )rY   rZ   r[   r  rF   r  r  r  r@  r!  r%  r(  r2   r2   r2   r3   r  P  s    



r  c                       sH   e Zd ZeZ fddZedd Zdd Zddd	Z	dd
dZ
  ZS )BaseSnippetWorkflowTestsc                    s   t    tjjdd| jjj d| _tjjdd| jjj d| _	tjj
dd| jjj d | _| jj| j | jj| j| j	 | jrS| jj| j d S d S )Ntestschange_r#  publish_lock_)superrF   r   r/   rA   r   r  r  edit_permissionpublish_permissionrx  r1  lock_permissionr  r)  rC   r^   r   	__class__r2   r3   rF     s,   
zBaseSnippetWorkflowTests.setUpc                 C   s
   | j jjS r.   )r   r  verbose_namer   r2   r2   r3   r    s   
z#BaseSnippetWorkflowTests.model_namec                 C   sB   | j jjdddd| _t| j| _tjj| jtj	| j d d S )Nr  FT)r   r  r  r   )
r   r/   rp   r  typer  r    rx   r	   r   r   r2   r2   r3   r    s   
z%BaseSnippetWorkflowTests.setup_objectNc                 C   s0   t | jj||d u rt| jjfdS |dS )Nr  )r   r   snippet_viewsetget_url_namer   r  r  r  r2   r2   r3   r    s   z BaseSnippetWorkflowTests.get_urlc                 K   s@   d| j jd| di}|r|| | jj| d|fi |S )Nr   r  r  r  )r  r   r  rN   r@  r  r  r2   r2   r3   r@    s   

zBaseSnippetWorkflowTests.postr.   )rY   rZ   r[   r&   r   rF   propertyr  r  r  r@  __classcell__r2   r2   r2  r3   r)    s    

r)  c                       s   e Zd Z 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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jjed"ed#d$d%d& Zd'd( Zd)d* Zd+d, Zd-d. Zeddd/d0 Z  ZS )1TestSubmitPageToWorkflowc                       t    | j  d S r.   r.  rF   r  save_revisionr   r2  r2   r3   rF        
zTestSubmitPageToWorkflow.setUpc                 C   s   |  d | jj}| t|t | |j| j | |j|j | |j	| j
 |j}| t|t | |jj| j | |j|j dS )zlTest that WorkflowState and TaskState objects are correctly created when an object is submitted for approvalsubmitN)r@  r  current_workflow_stater   r5  r"   rx   statusSTATUS_IN_PROGRESSrequested_byr  current_task_stater   ry   specificr:  rD   workflow_state
task_stater2   r2   r3   'test_submit_for_approval_creates_states  s   
z@TestSubmitPageToWorkflow.test_submit_for_approval_creates_statesc                 C   sx   |  d}| j|}| j|ddd | d | j|}| |jdd| jj	j
  | |d | |d d S )	Nr  Draftr  r  r?  utf-8Sent to[\s|\n]+zIn Moderation)r  rN   rA   rO   r@  assertRegexr   decoder  current_workflow_taskr>   rU   rD   edit_urlrQ   r2   r2   r3   Atest_submit_for_approval_changes_status_in_status_side_panel_meta  s   


zZTestSubmitPageToWorkflow.test_submit_for_approval_changes_status_in_status_side_panel_metac                 C   s   |  d}| j|}| j|ddd | j|d| j dd | |d | |d| j  | ||  d | d	 | j|}| j|ddd | j|d| j dd | |d | |d| j  | ||  d
 d S )Nr  Unlockedr  r  Anyone can edit this Locked by workflow(Only reviewers can edit and approve the lockr?  unlock)r  rN   rA   rO   r  rU   r@  rP  r2   r2   r3   ,test_submit_for_approval_changes_lock_status  s4   




zETestSubmitPageToWorkflow.test_submit_for_approval_changes_lock_statusc                 C   s   |  d}| d | | j | j|}| j|ddd | j|d| j ddd | j||  ddd | |d	 | |d
| j  | ||  d d S )Nr  r?  rS  r  r  Reviewers can edit this 4    – lock it to prevent other reviewers from editingrW  rU  rV  rX  	r  r@  r?   r^   rN   rA   rO   r  rU   rP  r2   r2   r3   &test_can_manual_lock_while_in_workflow?  s"   


z?TestSubmitPageToWorkflow.test_can_manual_lock_while_in_workflowc                 C   s   |  d}| d | | j | j|  d | j|}| j|ddd | j|d| j ddd | j||  d	d
d | |d | |d| j  | ||  d d S )Nr  r?  rW  zLocked by your  r  z$Only you can make changes while the 
 is lockedrX  ri   rU  rV  r\  rP  r2   r2   r3   -test_can_unlock_manual_lock_while_in_workflowY  s$   


zFTestSubmitPageToWorkflow.test_can_unlock_manual_lock_while_in_workflowc                 C   s   |  d}| d | | j | j|  d | | j | j|}t| j}| j|ddd | j|d| d| j	 d	dd | j||  d
dd | 
|d | 
|d| j	  | 
||  d d S )Nr  r?  rW  Locked by another userr  r  Only  can make changes while the r^  rX  ri   rU  rV  )r  r@  r?   r^   rN   r	  rA   r   rO   r  rU   rD   rQ  rQ   display_namer2   r2   r3   9test_can_unlock_other_users_manual_lock_while_in_workfloww  s(   



zRTestSubmitPageToWorkflow.test_can_unlock_other_users_manual_lock_while_in_workflowc                 C   s   |  d}| d | | j | j|  d | | j | j|}t| j}| j|ddd | j|d| d| j	 d	dd | 
||  d
 | 
|d | 
|d| j	  | 
||  d d S )Nr  r?  rW  r`  r  r  ra  rb  r^  rX  rU  rV  )r  r@  r?   r	  rN   r^   rA   r   rO   r  rU   rc  r2   r2   r3   <test_cannot_unlock_other_users_manual_lock_while_in_workflow  s(   



zUTestSubmitPageToWorkflow.test_cannot_unlock_other_users_manual_lock_while_in_workflowc                 C   s  |  d}| j|}| |d | |d | |d | |d | |d | |d | |d | d	 | j|}| |d | |d | |d | |d | |d | |d | |d | | j | j|}| |d | |d | |d | |d | |d | |d | |d |   | | j	 | j|}| |d | |d | |d | |d | |d | |d | |d | jd
dd}| |d | |d | |d | |d | |d | |d | |d d S )Nr  
Save draftSubmit to test_workflowCancel workflowRestart workflowApproveRequest changes:<button type="submit" class="button action-save" disabled>r?  cancel-workflowTr"  
r  rN   rA   rO   rU   r@  r?   r^   r(  r  rP  r2   r2   r3   test_workflow_action_menu_items  sx   

z8TestSubmitPageToWorkflow.test_workflow_action_menu_itemsc                 C   s<  | j j}| jdt| j j|jfd}| j|}| |d | 	|d | 	|d | 	|d | 	|d | 	|d | 	|d	 | 
d
 | j|}| 	|d | 	|d | 	|d | 	|d | 	|d | 	|d | |d	 | | j | j|}| |d | 	|d | 	|d | 	|d | 	|d | 	|d | 	|d	 |   | | j | j|}| |d | 	|d | 	|d | 	|d | 	|d | 	|d | 	|d	 | 
d | j|}| |d | 	|d | 	|d | 	|d | 	|d | 	|d | 	|d	 d S )Nrevisions_revertr  Replace current draftrh  ri  rj  rk  rl  rm  r?  rn  r  latest_revisionr  r   r  rG  rN   rA   rO   rU   r@  r?   r^   r(  r  rD   old_revision
revert_urlrQ   r2   r2   r3   .test_workflow_action_menu_items_when_reverting  s   

zGTestSubmitPageToWorkflow.test_workflow_action_menu_items_when_revertingzhttp://admin.example.com)WAGTAILADMIN_BASE_URLc                 C   s   |  d | ttjd d }d| j dt| j d}tjD ]}|j|kr+|} nq | 	| | 
d| j dt| j d|j | 
d|j d S )Nr?     The  "0" has been submitted to workflow "test_workflow"L" has been submitted for moderation to workflow "test_workflow" by submitterzhttp://admin.example.com/admin/r@  r   r  r
   outboxr  r   r  subjectr   rV  bodyrD   workflow_messageemail_subjectmsgr2   r2   r3   test_submit_sends_mailW  s    



z/TestSubmitPageToWorkflow.test_submit_sends_mailT"WAGTAILADMIN_NOTIFICATION_USE_HTMLc                 C      |    d S r.   )r  r   r2   r2   r3   test_submit_sends_html_mailu     z4TestSubmitPageToWorkflow.test_submit_sends_html_mailNc                 C   s   |  d | ttjd d }d| j dt| j d}tjD ]}|j|kr+|} nq | 	| | 
d| j dt| j d|j d S )Nr?  r{  r|  r}  r~  r  r  r  r2   r2   r3   'test_submit_sends_mail_without_base_urly  s   



z@TestSubmitPageToWorkflow.test_submit_sends_mail_without_base_urlc                 C   r  r.   )r  r   r2   r2   r3   ,test_submit_sends_html_mail_without_base_url  r  zETestSubmitPageToWorkflow.test_submit_sends_html_mail_without_base_urlsendzServer down)side_effectc                 C   sD   t t j | d}t t j | |jd | jt	d d S )Nr?  r   r%  )
loggingdisableCRITICALr@  NOTSETr   r   rN   rA   r   )rD   mock_fnrQ   r2   r2   r3   test_email_send_error  s
   
z.TestSubmitPageToWorkflow.test_email_send_errorc                 C   s   | j j| j| jd | jj}|jj| jd |  |jj	| jd |  | 
|jjj| j | 
|jtj | d |  | 
|jtj | 
|jjj| j d S )NrS   r?  )rx   startr  r  r@  rD  r%  r	  r  r(  r   ry   rE  r;  rA  r"   STATUS_NEEDS_CHANGESr@  rB  )rD   rG  r2   r2   r3   test_resume_rejected_workflow  s   
z6TestSubmitPageToWorkflow.test_resume_rejected_workflowc                 C   s   | j j| j| jd | jj}|jj| jd |  |jj	| jd |  | 
|jjj| j | 
|jtj | d |  | 
|jtj | jj}| 
|jtj | 
|jjj| j d S )NrS   restart-workflow)rx   r  r  r  r@  rD  r%  r	  r  r(  r   ry   rE  r;  rA  r"   r  r@  STATUS_CANCELLEDrB  r:  )rD   rG  new_workflow_stater2   r2   r3   test_restart_rejected_workflow  s    
z7TestSubmitPageToWorkflow.test_restart_rejected_workflowc                 C   s   | j j| j| jd | jj}| |jjj| j	 | |j
tj | jddd}|  | |j
tj | |jj
tj | |d | |d| j d | |d| j d | |d| j d	 d S )
NrS   rn  Tro  rm  r|  z# could not be saved as it is lockedz, could not be saved due to validation errorsz! could not be saved due to errors)rx   r  r  r  r@  r   rD  ry   rE  r:  rA  r"   rB  r@  r  r  r   rU   r  )rD   rG  rQ   r2   r2   r3   test_cancel_workflow  s4   
z-TestSubmitPageToWorkflow.test_cancel_workflowc                 C   sP   |  d tjd  }t| }dh}| j||dd | |	  d S Nr?  r   )zAuto-Submittedzauto-generatedz-Message is missing the Auto-Submitted header.r  )
r@  r
   r  r   r  r   r   issubsetr  is_multipartrD   r   msg_headersheadersr2   r2   r3   test_email_headers  s   
z+TestSubmitPageToWorkflow.test_email_headersc                 C   sZ   |  d tjd  }t| }dh}| j||dd | tjd    d S r  )	r@  r
   r  r   r  r   r   r  r  r  r2   r2   r3   test_html_email_headers	  s   
z0TestSubmitPageToWorkflow.test_html_email_headers)rY   rZ   r[   rF   rI  rR  rY  r]  r_  re  rf  rq  ry  r   r  r  r  r  r   r  r  r   IOErrorr  r  r  r  r  r  r9  r2   r2   r2  r3   r:    s:    '"#KP






 r:  c                   @      e Zd ZdS )TestSubmitSnippetToWorkflowNrY   rZ   r[   r2   r2   r2   r3   r  	      r  c                   @   sh   e Zd ZeZdd Zdd Zdd Zeddd	 Z	edd
d Z
eddd Zeddd ZdS )&TestSubmitSnippetToWorkflowNotLockablec                 C   s  |  d}| j|}| |d | |d | |d | |d | |d | |d | |d | d	 | j|}| |d | |d | |d | |d | |d | |d | |d | | j | j|}| |d | |d | |d | |d | |d | |d | |d |   | | j	 | j|}| |d | |d | |d | |d | |d | |d | |d d S )
Nr  rg  rh  ri  rj  rk  rl  rm  r?  rp  rP  r2   r2   r3   rq  	  sb   

zFTestSubmitSnippetToWorkflowNotLockable.test_workflow_action_menu_itemsc                 C   s  | j j}| jdt| j j|jfd}| j|}| |d | 	|d | 	|d | 	|d | 	|d | 	|d | 	|d	 | 
d
 | j|}| |d | 	|d | 	|d | 	|d | 	|d | 	|d | 	|d	 | | j | j|}| |d | 	|d | 	|d | 	|d | 	|d | 	|d | 	|d	 |   | | j | j|}| |d | 	|d | 	|d | 	|d | 	|d | 	|d | 	|d	 d S )Nrr  r  rs  rh  ri  rj  rk  rl  rm  r?  rt  rv  r2   r2   r3   ry  Z	  sj   
zUTestSubmitSnippetToWorkflowNotLockable.test_workflow_action_menu_items_when_revertingc                 C   s   |  d}| d | | j | j|}| |d | |d| j  | |d| j d | |d | |d| j  | |d	 d S )
Nr  r?  rS  rT  rZ  r[  rU  rV  r`  )r  r@  r?   r^   rN   rA   rU   r  rP  r2   r2   r3   rY  	  s    


zSTestSubmitSnippetToWorkflowNotLockable.test_submit_for_approval_changes_lock_statuszModel is not lockablec                 C      d S r.   r2   r   r2   r2   r3   r]  	     zMTestSubmitSnippetToWorkflowNotLockable.test_can_manual_lock_while_in_workflowc                 C   r  r.   r2   r   r2   r2   r3   r_  	  r  zTTestSubmitSnippetToWorkflowNotLockable.test_can_unlock_manual_lock_while_in_workflowc                 C   r  r.   r2   r   r2   r2   r3   re  	  r  z`TestSubmitSnippetToWorkflowNotLockable.test_can_unlock_other_users_manual_lock_while_in_workflowc                 C   r  r.   r2   r   r2   r2   r3   rf  	  r  zcTestSubmitSnippetToWorkflowNotLockable.test_cannot_unlock_other_users_manual_lock_while_in_workflowN)rY   rZ   r[   r'   r   rq  ry  rY  r   r]  r_  re  rf  r2   r2   r2   r3   r  	  s    ?C


r  z2020-03-31 12:00:00c                       s   e Zd ZeZdZ fddZdd Zedddd	 Z	d
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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  ZS )0TestApproveRejectPageWorkflowr   c                    s@   t    d| j_d| j_| j  | d | j| jd d S )N	SebastianMitterr?  rS   	r.  rF   r  
first_name	last_namer'  r@  r?   r^   r   r2  r2   r3   rF   	  s   


z#TestApproveRejectPageWorkflow.setUpc                 C   R   t jjdd| _tjjdd| _| jjtjj	dd t
jj| j| jdd d S Nr   r=   r  r`   r  r  r   r/   rp   rx   r   r:  r(  r  r   rx  r#   r   r2   r2   r3   r  	     

z6TestApproveRejectPageWorkflow.setup_workflow_and_tasksr   )WAGTAIL_FINISH_WORKFLOW_ACTIONc              	   C   s&  t `t }| j| z| ddi}| || d t	j
| jj| jd}| |j|j |j}| |j|j | |jd | j  | j| jjdd | j| jjdd | |jd |jd	 d
 }| |d | j | |d | j | |d | j W | j| dS | j| w )k
        This posts to the approve task view and checks that the object was approved and published
        comment
my commentr  rC  ,Approving moderation failed to set live=Truer  @Approving moderation failed to set has_unpublished_changes=Falser  r   ri   senderr   N)r   r  r   	MagicMockpublished_signalconnectr%  r*  r  r"   r/   for_instancer  rA   r  r   rA  STATUS_APPROVEDrD  r  r  r   r  r  r  
call_count
mock_callsr  assertIsInstance
disconnect)rD   mock_handlerrQ   rG  rH  	mock_callr2   r2   r3   test_approve_task_and_workflow	  s6   
z<TestApproveRejectPageWorkflow.test_approve_task_and_workflowc                 C   s   | j ddidd}| |j d| dd tj| jj	| j
d}| |j|j |j}| |j|j | |jd | j  | j| jjd	d
 | j| jjdd
 dS )r  r  r  XMLHttpRequestHTTP_X_REQUESTED_WITHsuccessr  )stepredirectr  r  r  r  N)r%  assertJSONEqualr   rN  r  r"   r/   r  r  rA   r  r   rA  r  rD  r  r  r   r  r  r  )rD   rQ   rG  rH  r2   r2   r3   (test_approve_task_and_workflow_with_ajax
  s,   

zFTestApproveRejectPageWorkflow.test_approve_task_and_workflow_with_ajaxc                 C   s   | j td}| |d | |j}td}|d| d}| t	|d |d }| 
| | |dd	 | |d
 d S )Nr%  Awaiting your review"wagtailadmin/js/workflow-action.jsscript[src='']r  r   data-activate	dashboard#ActivateWorkflowActionsForDashboard)rN   rA   r   rO   r   r   r   r   r   r  r   rU   rD   rQ   r   workflow_action_jsscriptsscriptr2   r2   r3   test_workflow_dashboard_panel>
  s   
z;TestApproveRejectPageWorkflow.test_workflow_dashboard_panelc                 C   s   | j | d}| |jd | |j}td}|d| d}| t	|d |d }| 
| | |dd	 | |d
| d | |d d S )Nr  r   r  r  r  r  r   r  r6   data-confirm-cancellation-urlconfirm_workflow_cancellation"ActivateWorkflowActionsForEditView)rN   rA   r  r   r   r   r   r   r   r  r   rU   r  r2   r2   r3   $test_workflow_action_script_includedL
  s   
zBTestApproveRejectPageWorkflow.test_workflow_action_script_includedF)"WAGTAIL_WORKFLOW_CANCEL_ON_PUBLISHc                 C   s   | j | d}| |jd | |j}td}|d| d}| t	|d |d }| 
| | |dd	 | |d
 | |d d S )Nr  r   r  r  r  r  r   r  r6   r  r  )rN   rA   r  r   r   r   r   r   r   r  r   r   rU   r  r2   r2   r3   @test_workflow_action_script_included_without_cancel_confirmation_
  s   
z^TestApproveRejectPageWorkflow.test_workflow_action_script_included_without_cancel_confirmationc                 C   s   | j | jdt| jjd| jjjfd}| |j	d | 
|d t|jd }| d| jdt| jjd| jjjfd d | | d	| d
S )z
        This tests that a GET request to the workflow action view (for the approve action) returns a modal with a form for extra data entry:
        adding a comment
        r!  r%  r  r   .wagtailadmin/shared/workflow_action_modal.htmlr   <form action="" method="POST" novalidate>CommentNrN   rA   r  r   r  r  r#  rG  r   r   r   jsonloadsr   assertTagInHTMLrV  rD   rQ   r   r2   r2   r3   test_workflow_action_getq
  s:   


	
z6TestApproveRejectPageWorkflow.test_workflow_action_getc                 C   s4   | j | jddd| jjjfd}| |jd dS )z_
        This tests that the workflow action view handles invalid object ids correctly
        r!  l   q(L w r%  r  r  N)rN   r@  r  r  r#  rG  r   r   rP   r2   r2   r3    test_workflow_action_view_bad_id
  s   z>TestApproveRejectPageWorkflow.test_workflow_action_view_bad_idc                 C   &   | j | jd |  }| |d dS )z
        This tests that the workflow action view for a GroupApprovalTask won't allow approval from a user not in the
        specified group/a superuser
        rS   rI   N)r?   r  r%  r*  rP   r2   r2   r3   &test_workflow_action_view_not_in_group
  s   zDTestApproveRejectPageWorkflow.test_workflow_action_view_not_in_groupc                 C   s   | j | jd | jj}| j| dddi}|  | j | jj| jdt| jj	d|j
fddd	}| || d | |d
| j dt| j d dS )z
        This tests that the workflow action view won't allow an action
        for an object that's not in moderation. For example, the submitter
        cancelled the workflow before the moderator could approve it.
        rS   r  action-cancel-workflowr  r!  r%  r  Tro  r|   &#x27;z,&#x27; is not currently awaiting moderation.N)r?   r  r  r#  rN   r@  r  r^   r   r  rG  r*  rO   r  r   )rD   r#  rQ   r2   r2   r3   +test_workflow_action_view_not_in_moderation
  s,   
zITestApproveRejectPageWorkflow.test_workflow_action_view_not_in_moderationc                 C   s`   | j | jd | j| dddi}| |jd tj	| j
j| jd}| |jtj dS )z
        This tests that the object edit view for a GroupApprovalTask, locked to a user not in the
        specified group/a superuser, still allows the submitter to cancel workflows
        rS   r  r  r  r   r  N)r?   r  rN   r@  r  r   r   r"   r/   r  r  rA   rA  r  )rD   rQ   rG  r2   r2   r3   1test_edit_view_workflow_cancellation_not_in_group
  s   zOTestApproveRejectPageWorkflow.test_edit_view_workflow_cancellation_not_in_groupc                 C   sb   |    tj| jj| jd}| |j|j	 |j
}| |j|j | j  | | jj dS )zn
        This posts to the reject task view and checks that the object was rejected and not published
        r  N)r(  r"   r/   r  r  rA   r  r   rA  r  rD  STATUS_REJECTEDr  r  r  rF  r2   r2   r3   test_reject_task_and_workflow
  s   
z;TestApproveRejectPageWorkflow.test_reject_task_and_workflowc                 C   s   t d}d|_|  }W d   n1 sw   Y  | || d tj| j	j
| jd}| |j|j |j}| |j|j | j	  | | j	j dS )z
        This posts to the reject task view for a task without a form and checks that the object can still be rejected and not published
        z'wagtail.models.Task.get_form_for_actionNr  r  )r   r  r  r(  r*  r  r"   r/   r  r  rA   r  r   rA  r  rD  r  r  r  r  )rD   get_formrQ   rG  rH  r2   r2   r3   *test_reject_task_and_workflow_without_form  s   

zHTestApproveRejectPageWorkflow.test_reject_task_and_workflow_without_formc                 C   s   t d}d|_| jdd}W d   n1 sw   Y  | |jd | |d tj	| j
j| jd}| |j|j |j}| |j|j | j
  | | j
j dS )	z
        This posts to the reject task view with invalid form data and checks that the object was not rejected and not published
        +wagtail.forms.TaskStateCommentForm.is_validFr  r  Nr   r  r  )r   r  r  r(  r   r   r   r"   r/   r  r  rA   r  assertNotEqualrA  r  rD  r  r  r  r  )rD   is_validrQ   rG  rH  r2   r2   r3   4test_reject_task_and_workflow_with_invalid_form_ajax(  s    
zRTestApproveRejectPageWorkflow.test_reject_task_and_workflow_with_invalid_form_ajaxc                 C   r  )z
        This tests that the workflow action view for a GroupApprovalTask won't allow rejection from a user not in the
        specified group/a superuser
        rS   rI   N)r?   r  r(  r*  rP   r2   r2   r3   0test_workflow_action_view_rejection_not_in_groupH  s   zNTestApproveRejectPageWorkflow.test_workflow_action_view_rejection_not_in_groupc                 C   s   | j | jdt| jjd| jjjfd}| |j	d | 
|d | 
|d t|jd }| d| jdt| jjd| jjjfd d	 | | d
| dS )z
        This tests that a GET request to the collect_workflow_action_data view (for the approve action) returns a modal with a form for extra data entry:
        adding a comment
        collect_workflow_action_datar%  r  r   r  z)wagtailadmin/shared/non_field_errors.htmlr   r  r  r  Nr  r  r2   r2   r3   %test_collect_workflow_action_data_getV  s<   


	
zCTestApproveRejectPageWorkflow.test_collect_workflow_action_data_getc                 C   sr   | j | jdt| jjd| jjjfdddi}| |j	d t
|j}| |d d | |d	 ddi d
S )z
        This tests that a POST request to the collect_workflow_action_data view (for the approve action) returns a modal response with the validated data
        r  r%  r  r  This is my commentr   r  r  cleaned_dataN)rN   r@  r  r   r  r  r#  rG  r   r   r  r  r   )rD   rQ   response_jsonr2   r2   r3   &test_collect_workflow_action_data_postz  s    
zDTestApproveRejectPageWorkflow.test_collect_workflow_action_data_postc                 C   sv   t d#}d|_| j| jdt| jjd| jj	j
fdddi}W d   n1 s+w   Y  | || d	 dS )
z
        This tests that a POST request to the collect_workflow_action_data view with an invalid form data returns a redirect
        r  Fr  r%  r  r  r  Nr  )r   r  r  rN   r@  r  r   r  r  r#  rG  r*  rD   r   rQ   r2   r2   r3   3test_collect_workflow_action_data_post_invalid_form  s   
zQTestApproveRejectPageWorkflow.test_collect_workflow_action_data_post_invalid_formc                 C   s   t d%}d|_| jj| jdt| jjd| jj	j
fdddidd	}W d
   n1 s-w   Y  | |jd | |d d
S )z
        This tests that a POST request to the collect_workflow_action_data view with an invalid form data returns the form with errors
        r  Fr  r%  r  r  r  r  r  Nr   r  )r   r  r  rN   r@  r  r   r  r  r#  rG  r   r   r   r	  r2   r2   r3   8test_collect_workflow_action_data_post_invalid_form_ajax  s$   
zVTestApproveRejectPageWorkflow.test_collect_workflow_action_data_post_invalid_form_ajaxc              	   C   s   |  d| jdddddi tj| jj| jd}| |j	|j
 |j}| |j	|j
 | |jd | j  | t| j | jd d	S )
z
        Posting to the 'edit' view with 'action-workflow-action' set should perform the given workflow action in addition to updating object content
        zworkflow-actionz%This title was edited while approvingzworkflow-action-namer%  zworkflow-action-extra-dataz{"comment": "my comment"}r  r  N)r@  title_fieldr"   r/   r  r  rA   r  r   rA  r  rD  r  r  getattrget_latest_revision_as_objectrF  r2   r2   r3   "test_workflow_action_via_edit_view  s&   
z@TestApproveRejectPageWorkflow.test_workflow_action_via_edit_view)rY   rZ   r[   r$   r  r  rF   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r9  r2   r2   r2  r3   r  	  s4    
6*
#( $r  c                   @   s   e Zd ZeZdZdS ) TestApproveRejectSnippetWorkflowr   N)rY   rZ   r[   r%   r  r  r2   r2   r2   r3   r    s    r  c                   @      e Zd ZeZdS )+TestApproveRejectSnippetWorkflowNotLockableNrY   rZ   r[   r'   r   r2   r2   r2   r3   r    r5  r  c                       s   e Zd ZddgZdZdZdZdZdZ fdd	Z	d
d Z
dd Z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  ZS ) TestPageWorkflowReportxlsxcsvr  r4  z#w-slim-header-buttonsz.w-drilldownr   c                    sD   t    d| j_d| j_| j  | jddd | j| jd d S )Nr  r  r?  Tro  rS   r  r   r2  r2   r3   rF     s   

zTestPageWorkflowReport.setUpc                 C   s   |  || d S r.   )r   rD   breadcrumbsr   r2   r2   r3   assertBreadcrumbs  r  z(TestPageWorkflowReport.assertBreadcrumbsc                 C   s   |  |dj | d S Nr   )r   r   r   r   rD   r   r   r2   r2   r3   assertPageTitle  s   z&TestPageWorkflowReport.assertPageTitleNc                 C   s   | j ||S r.   )rN   rA   rD   r   r   r2   r2   r3   rA     r  zTestPageWorkflowReport.getc                 C   r  r  r  r   r2   r2   r3   r    r  z/TestPageWorkflowReport.setup_workflow_and_tasksc                    sP   |dkr"t t| }|j d fddtd jd D S |  S )Nr  r   c                 3   s:    | ]}t d  jd  D ]}t j||djV  qqdS )r  )rZ  columnN)r   max_rowrw  cellr   )rr   jrs   	worksheetr2   r3   	<genexpr>  s    z:TestPageWorkflowReport.get_file_content.<locals>.<genexpr>r  )	r   ioBytesIOgetvaluern   joinr   
max_columnrN  )rD   rQ   formatworkbookr2   r"  r3   get_file_content  s   z'TestPageWorkflowReport.get_file_contentc                 C   s  |  t| j}| |jd | |d | |d | |d | |d | dddg|j | |j}|	| j
 d	}| | | | d
td | t|jd  d | |	d | |d |  t| j}| |jd | |d | dddg|j | |j}|	| j
 d	}| | | | d
td | t|jd  d | |	d | |d d S )Nr   r  r   Sebastian MitterMarch 31, 2020r   r   r   z .w-header-buttonhrefr4  r   zBy taskz.w-active-filterszWorkflows - Wagtailr  r  zBy workflowzWorkflow tasks - Wagtail)rA   r   workflow_url_namer   r   rO   r  r   r   r   header_buttons_parent_selectorr   r{  childrenr   r   r  workflow_tasks_url_name)rD   rQ   r   by_task_linkr2   r2   r3   test_workflow_report  sR   





z+TestPageWorkflowReport.test_workflow_reportc           	      C   sx  |  t| jddi}| |jd | |d | |d | |d | |d | |j}|| j	 d}t| j}| d	| j
 }| t|d
 | dd |D | d| dg |d}|d}| | | | | d|j d | |j dd || j d}| t|d
 | |d  dd | |d  d | |d  dd | |d  dd |  t| jddi}| |jd | |d | |j}|| j	 d}t| j}| d	| j
 }| t|d
 | dd |D | d| dg |d}|d}| | | | | d|j d | |j dd || j d}| t|d
 | |d  dd | |d  d | |d  dd | |d  dd | | j |  t| jddi}| |jd | |d | |d | |d |  t| jddi}| |jd | |d d S )N
reviewabler   r   r  r   r-  r.  z .w-dropdown az?reviewable=trueri   c                 S      g | ]}| d qS r/  rA   rr   r  r2   r2   r3   rt   X      zHTestPageWorkflowReport.test_workflow_report_filtered.<locals>.<listcomp>z&export=xlsxz&export=csvz".w-active-filters .w-pill__contentz!.w-active-filters .w-pill__removezdata-w-swap-src-valuezdata-w-swap-reflect-valuez' input[name='reviewable'][type='radio']r   r   r   r   r  c                 S   r7  r8  r9  r:  r2   r2   r3   rt   }  r;  )rA   r   r0  r   r   rO   r   r   r   r1  extra_paramsr  r   r   assertNotInrW  drilldown_selectorr   r3  r?   r  rU   )	rD   rQ   r   linksunfiltered_urlfiltered_urlr   clear_buttoninputsr2   r2   r3   test_workflow_report_filteredG  s   











z4TestPageWorkflowReport.test_workflow_report_filteredc              	   C   s   | j D ]f}| j|dV | t| jd|i}| ||}| |jd | d| | d| | d| | d| | t| j	d|i}| ||}| |jd | d| W d    n1 sdw   Y  qd S )Nexport_formatexportr   r  r   r  
2020-03-31)
export_formatssubTestrA   r   r0  r,  r   r   rV  r3  rD   rF  rQ   r   r2   r2   r3   test_workflow_report_export  s,   
z2TestPageWorkflowReport.test_workflow_report_exportc              	   C   s  | j D ]}| j|d | | j | t| jd|d}| ||}| |j	d | 
d| | 
d| | 
d| | 
d| | t| jd|d}| ||}| |j	d | 
d| | | j | t| jd|d}| ||}| |j	d | d| | d| | d| | t| jd|d}| ||}| |j	d | d| W d    n1 sw   Y  qd S )	NrE  r   )r6  rG  r   r  r   r  rH  )rI  rJ  r?   r^   rA   r   r0  r,  r   r   rV  r3  r  r=  rK  r2   r2   r3   $test_workflow_report_filtered_export  sP   
z;TestPageWorkflowReport.test_workflow_report_filtered_exportc                 C   s   | j   | t| j}| |jd | |d | j|ddd | |d | |d | t| j	}| |jd | |d d S )Nr   r  r   r  r  r-  r.  )
r  r1   rA   r   r0  r   r   rU   rO   r3  rP   r2   r2   r3   test_workflow_report_deleted  s   
z3TestPageWorkflowReport.test_workflow_report_deletedr.   )rY   rZ   r[   rI  r0  r3  r1  r>  r<  rF   r  r  rA   r  r,  r5  rD  rL  rM  rN  r9  r2   r2   r2  r3   r    s$    
,[,r  c                       sB   e Zd ZdZdZdZdZdZdd Zdd	 Z	d fdd	Z
  ZS )TestPageWorkflowReportResultsz%wagtailadmin_reports:workflow_resultsz+wagtailadmin_reports:workflow_tasks_resultszU[data-controller="w-teleport"][data-w-teleport-target-value="#w-slim-header-buttons"]zQ[data-controller="w-teleport"][data-w-teleport-target-value="#filters-drilldown"]z&_w_filter_fragment=truec                 C   s   |  | d S r.   )r  r  r2   r2   r3   r     r  z/TestPageWorkflowReportResults.assertBreadcrumbsc                 C   s   |  |d d S r  )r   r   r  r2   r2   r3   r    r  z-TestPageWorkflowReportResults.assertPageTitleNc                    s   |pi }d|d< t  ||S )Nr   _w_filter_fragment)r.  rA   r  r2  r2   r3   rA     s   z!TestPageWorkflowReportResults.getr.   )rY   rZ   r[   r0  r3  r1  r>  r<  r  r  rA   r9  r2   r2   r2  r3   rO    s    rO  c                   @   r  )TestSnippetWorkflowReportNr  r2   r2   r2   r3   rQ    r  rQ  c                   @   r  ) TestSnippetWorkflowReportResultsNr  r2   r2   r2   r3   rR    s    rR  c                   @   r  )$TestNonLockableSnippetWorkflowReportNr  r2   r2   r2   r3   rS    s    rS  c                   @   r  )+TestNonLockableSnippetWorkflowReportResultsNr  r2   r2   r2   r3   rT     s    rT  c                       s   e Zd Z fd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d Zdd Zdd Zdd Z  ZS )TestPageNotificationPreferencesc                    sf   t    | jdddd| _tjjdd}|j| j t	
| j| _t	
| j| _t	
| j| _d S )N
moderator2zmoderator2@email.comr8   r9   r`   r=   )r.  rF   r@   rV  r   r/   rA   rB   rC   r-   get_for_userr	  superuser_profilemoderator2_profiler  submitter_profile)rD   rg   r2  r2   r3   rF   '  s   
z%TestPageNotificationPreferences.setUpc                 C   r  r  r  r   r2   r2   r3   r  5  r  z8TestPageNotificationPreferences.setup_workflow_and_tasksc                 C   s$   |  | jjd |  | jjd d S )NT)assertIsrZ  rejected_notificationsapproved_notificationsr   r2   r2   r3   test_vanilla_profile=  s   z4TestPageNotificationPreferences.test_vanilla_profileT),WAGTAILADMIN_NOTIFICATION_INCLUDE_SUPERUSERSc                 C   s4  |  | j | d | ttjd dd tjD }dd |D }dd tjD }dd |D }|d j}| t|d	 | | j	j
| | | jj
| | | jj
| | | jj
| | t|d
 | | j	j
| | | jj
| | | jj
| | | jj
| t td d }| d| | dS )z[Test that 'submitted' notifications for WorkflowState and TaskState are both sent correctlyr?  r  c                 S      g | ]	}d |j v r|qS r|   r  rr   r;   r2   r2   r3   rt   L      z[TestPageNotificationPreferences.test_submitted_email_notifications_sent.<locals>.<listcomp>c                 S      g | ]
}|j D ]}|qqS r2   torr   r;   addressr2   r2   r3   rt   O  
    c                 S   r`  r   ra  rb  r2   r2   r3   rt   R  rc  c                 S   rd  r2   re  rg  r2   r2   r3   rt   U  ri  r   r{  r  wagtailadmin_accountz#tab-notificationsz+Edit your notification preferences here: %sN)r?   r  r@  r   r  r
   r  r  rV  r^   r;   rV  r	  r=  r   r   )rD   task_submission_emails!task_submission_emailed_addressesworkflow_submission_emails%workflow_submission_emailed_addressesworkflow_submission_email_bodyaccount_notifications_urlr2   r2   r3   'test_submitted_email_notifications_sentD  sH   

zGTestPageNotificationPreferences.test_submitted_email_notifications_sentFc                 C   sv   |  | j | d dd tjD }dd |D }dd tjD }dd |D }| | jj| | | jj| dS )zTest that 'submitted' notifications for WorkflowState and TaskState are not sent to superusers if
        `WAGTAILADMIN_NOTIFICATION_INCLUDE_SUPERUSERS=False`r?  c                 S   r`  r|   ra  rb  r2   r2   r3   rt   }  rc  ziTestPageNotificationPreferences.test_submitted_email_notifications_superuser_settings.<locals>.<listcomp>c                 S   rd  r2   re  rg  r2   r2   r3   rt     ri  c                 S   r`  r   ra  rb  r2   r2   r3   rt     rc  c                 S   rd  r2   re  rg  r2   r2   r3   rt     ri  N)r?   r  r@  r
   r  r=  r	  r;   )rD   rk  rl  rm  rn  r2   r2   r3   5test_submitted_email_notifications_superuser_settingsv  s    
zUTestPageNotificationPreferences.test_submitted_email_notifications_superuser_settingsc                 C   s   d| j _| j   d| j_| j  | | j | d dd tjD }dd |D }dd tjD }dd |D }| 	| j j
| | 	| jj
| | 	| jj
| d S )NFr?  c                 S   r`  r   ra  rb  r2   r2   r3   rt     rc  z^TestPageNotificationPreferences.test_submit_notification_active_users_only.<locals>.<listcomp>c                 S   rd  r2   re  rg  r2   r2   r3   rt     ri  c                 S   r`  r|   ra  rb  r2   r2   r3   rt     rc  c                 S   rd  r2   re  rg  r2   r2   r3   rt     ri  )rV  	is_activer'  r	  r?   r  r@  r
   r  r=  r;   rD   rm  rn  rk  rl  r2   r2   r3   *test_submit_notification_active_users_only  s*   


zJTestPageNotificationPreferences.test_submit_notification_active_users_onlyc                 C   s   d| j _| j   d| j_| j  | | j | d dd tjD }dd |D }dd tjD }dd |D }| 	| j
j| | 	| jj| | 	| jj| d S )NFr?  c                 S   r`  r   ra  rb  r2   r2   r3   rt     rc  zbTestPageNotificationPreferences.test_submit_notification_preferences_respected.<locals>.<listcomp>c                 S   rd  r2   re  rg  r2   r2   r3   rt     ri  c                 S   r`  r|   ra  rb  r2   r2   r3   rt     rc  c                 S   rd  r2   re  rg  r2   r2   r3   rt     ri  )rY  submitted_notificationsr'  rX  r?   r  r@  r
   r  r=  rV  r;   r	  rt  r2   r2   r3   .test_submit_notification_preferences_respected  s*   


zNTestPageNotificationPreferences.test_submit_notification_preferences_respectedc                 C   d   |  | j | d |  | j |   dd tjD }| t|d | 	| jj
|d j d S )Nr?  c                 S   $   g | ]}d |j v rd|j v r|qS rx   approvedra  rb  r2   r2   r3   rt     
    zOTestPageNotificationPreferences.test_approved_notifications.<locals>.<listcomp>r  r   )r?   r  r@  r^   r%  r
   r  r   r  rV  r;   rf  rD   workflow_approved_emailsr2   r2   r3   test_approved_notifications     
z;TestPageNotificationPreferences.test_approved_notificationsc                 C   `   d| j _| j   | | j | d | | j |   dd tj	D }| 
t|d d S )NFr?  c                 S   ry  rz  ra  rb  r2   r2   r3   rt     r|  zeTestPageNotificationPreferences.test_approved_notifications_preferences_respected.<locals>.<listcomp>r   )rZ  r]  r'  r?   r  r@  r^   r%  r
   r  r   r  r}  r2   r2   r3   1test_approved_notifications_preferences_respected     

zQTestPageNotificationPreferences.test_approved_notifications_preferences_respectedc                 C   rx  )Nr?  c                 S   ry  rx   rejectedra  rb  r2   r2   r3   rt     r|  zOTestPageNotificationPreferences.test_rejected_notifications.<locals>.<listcomp>r  r   )r?   r  r@  r^   r(  r
   r  r   r  rV  r;   rf  rD   workflow_rejected_emailsr2   r2   r3   test_rejected_notifications  r  z;TestPageNotificationPreferences.test_rejected_notificationsc                 C   r  )NFr?  c                 S   ry  r  ra  rb  r2   r2   r3   rt     r|  zdTestPageNotificationPreferences.test_rejected_notification_preferences_respected.<locals>.<listcomp>r   )rZ  r\  r'  r?   r  r@  r^   r(  r
   r  r   r  r  r2   r2   r3   0test_rejected_notification_preferences_respected  r  zPTestPageNotificationPreferences.test_rejected_notification_preferences_respected)rY   rZ   r[   rF   r  r^  r   rq  rr  ru  rw  r  r  r  r  r9  r2   r2   r2  r3   rU  &  s     
1

!
 rU  Tr  c                   @   r  )#TestPageNotificationPreferencesHTMLNr  r2   r2   r2   r3   r        r  c                       s   e Zd Z fddZ  ZS )"TestSnippetNotificationPreferencesc                    s"   t    | jj| j| j d S r.   )r.  rF   rV  r)  rC   r/  r0  r   r2  r2   r3   rF   "  s
   
z(TestSnippetNotificationPreferences.setUp)rY   rZ   r[   rF   r9  r2   r2   r2  r3   r    s    r  c                   @   r  )&TestSnippetNotificationPreferencesHTMLNr  r2   r2   r2   r3   r  *  r  r  c                   @   sd   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S )TestDisableViewsc                 C   s   |  | j | d |  | j |   | jtd| jjfd}| 	|j
d | j  | | jjd tj| jj| jd}| 	|jtjd d | 	|jtjd d	 | 	tjj| jtjd
 d dS )zTTest that deactivating a workflow sets it to inactive and cancels in progress statesr?  wagtailadmin_workflows:disabler  r   Fr   rA  r   r  )workflow_state__workflowrA  N)r?   r  r@  r	  r%  rN   r   rx   r  r   r   r  r[  rn   r"   r/   r  r  rx  rB  ry  r  r   rD   rQ   statesr2   r2   r3   test_disable_workflow0  s6   

z&TestDisableViews.test_disable_workflowc                 C   sz   |  | j | d |  | j |   | jtd| jj	fd}| 
|jd | |d | |d | |j dS )zQTest that deactivating a workflow shows a warning if there are in progress statesr?  r  r  r   +wagtailadmin/workflows/confirm_disable.htmlztThis workflow is in progress on 1 page/snippet. Disabling this workflow will cancel moderation on this page/snippet.N)r?   r  r@  r	  r%  rN   rA   r   rx   r  r   r   r   rO   r  r   rP   r2   r2   r3   'test_get_disable_workflow_shows_warningO  s   
z8TestDisableViews.test_get_disable_workflow_shows_warningc                 C   sh   |  | j | jtd| jjfd}| |jd | 	|d | 
|d | 
|d | |j dS )z\Test that deactivating a workflow does not show a warning if there are no in progress statesr  r  r   r  zThis workflow is in progresszDDisabling this workflow will cancel moderation on this page/snippet.N)r?   r	  rN   rA   r   rx   r  r   r   r   rU   r  r   rP   r2   r2   r3   $test_get_disable_workflow_no_warninga  s   z5TestDisableViews.test_get_disable_workflow_no_warningc                 C   s   |  | j | d |  | j | jtd| jjfd}| 	|d | 
|jd d | |d | |j tjjdd}|jtjjd	d | jtd|jfd}| d|j | |d
 | |d | |j |  dS )zFTest that a view is shown before disabling a task that shows a warningr?  #wagtailadmin_workflows:disable_taskr  z0wagtailadmin/workflows/confirm_disable_task.htmlwarning_messagezThis task is in progress on 1 page/snippet. Disabling this task will cause it to be skipped in the moderation workflow and not be listed for selection when editing a workflow.unused_task_3r=   r`   zThis task is in progresszDisabling this task will cause it to be skipped in the moderation workflow and not be listed for selection when editing a workflow.N)r?   r  r@  r	  rN   rA   r   r:  r  r   r   r   rO   r  r   r   r/   rp   r(  r  r   rx  r=  rU   r1   )rD   rQ   unused_taskr2   r2   r3   test_disable_task_viewq  s>   
z'TestDisableViews.test_disable_task_viewc                 C   s   |  | j | d |  | j | jtd| jjfd}| |j	d | j
  | | jjd tj| jj| jjd}| |jtjd d | |jtjd d	 | | jjjjj| j d
S )zPTest that deactivating a task sets it to inactive and cancels in progress statesr?  r  r  r   Fr|   r  r   r  N)r?   r  r@  r	  rN   r   r:  r  r   r   r  r[  rn   r   r/   r  r  rx  rz  rB  ry  r  r@  rD  ry   rE  r;  r  r2   r2   r3   test_disable_task  s$   

z"TestDisableViews.test_disable_taskc                 C   d   |  | j d| j_| j  | jtd| jjfd}| 	|j
d | j  | | jjd d S )NFr  r  r   T)r?   r	  rx   rn   r'  rN   r@  r   r  r   r   r  r[  rP   r2   r2   r3   test_enable_workflow     

z%TestDisableViews.test_enable_workflowc                 C      d| j _| j   | j jtjjdddtjjdd | | j  d| j	_
| j	  | jtd| j	jfd}| |jd	 | j	  | | j	j
d
 d S )NFr!  r"  r#  ra   rb   r  r  r   T)r	  r&  r'  r)  rC   r   r/   rA   r?   rx   rn   rN   r@  r   r  r   r   r  r[  rP   r2   r2   r3   (test_enable_workflow_minimal_permissions  $   


z9TestDisableViews.test_enable_workflow_minimal_permissionsc                 C      d| j _| j   | j jtjjddd | | j  d| j	_
| j	  | jtd| j	jfd}| |td | j	  | | j	j
d d S )NFr!  r"  r#  r  r  r%  )r	  r&  r'  r)  rC   r   r/   rA   r?   rx   rn   rN   r@  r   r  r*  r  r[  rP   r2   r2   r3   #test_enable_workflow_no_permissions  "   


z4TestDisableViews.test_enable_workflow_no_permissionsc                 C   r  )NFr  r  r   T)r?   r	  r:  rn   r'  rN   r@  r   r  r   r   r  r[  rP   r2   r2   r3   test_enable_task  r  z!TestDisableViews.test_enable_taskc                 C   r  )NFr!  r"  r#  r  rb   r  r  r   T)r	  r&  r'  r)  rC   r   r/   rA   r?   r:  rn   rN   r@  r   r  r   r   r  r[  rP   r2   r2   r3   $test_enable_task_minimal_permissions  r  z5TestDisableViews.test_enable_task_minimal_permissionsc                 C   r  )NFr!  r"  r#  r  r  r%  )r	  r&  r'  r)  rC   r   r/   rA   r?   r:  rn   rN   r@  r   r  r*  r  r[  rP   r2   r2   r3   test_enable_task_no_permissions	  r  z0TestDisableViews.test_enable_task_no_permissionsN)rY   rZ   r[   r  r  r  r  r  r  r  r  r  r  r  r2   r2   r2   r3   r  /  s    *r  c                   @   r  )$TestDisableViewsWithSnippetWorkflowsNr  r2   r2   r2   r3   r    r  r  c                       sX   e Zd ZdZdZdZ fddZdd Zdd	 Zd
d Z	dd Z
dd Zdd Z  ZS )TestPageWorkflowPreviewztests/simple_page.htmlzSimple pagezNot-so-simple objectc                    s4   t    |   | j| j| j | | j d S r.   )	r.  rF   edit_objectrx   r  r  r  r?   r^   r   r2  r2   r3   rF   '  s   
zTestPageWorkflowPreview.setUpc                 C      | j | j_| j  d S r.   )new_contentr  r   r=  r   r2   r2   r3   r  -     
z#TestPageWorkflowPreview.edit_objectc                 C   sZ   | j dt| jj| jjjfd}| j|}| |j	d | 
|| j | || j d S )Nworkflow_previewr  r   )r  r   r  r  rO  rG  rN   rA   r   r   r   preview_templaterO   preview_contentrD   preview_urlrQ   r2   r2   r3   test_preview_workflow1  s   z-TestPageWorkflowPreview.test_preview_workflowc                 C   sZ   | j dt| jj| jjjfd}| j|}| |d | |t	dt| jjfd d S )Nr  r  zEdit this pagezwagtailadmin_pages:edit)
r  r   r  r  rO  rG  rN   rA   rO   r   r  r2   r2   r3   /test_preview_workflow_show_edit_link_in_userbar<  s   zGTestPageWorkflowPreview.test_preview_workflow_show_edit_link_in_userbarc                 C   sL   |  | j | jdt| jj| jjjfd}| j	|}| 
|td d S )Nr  r  r%  )r?   r  r  r   r  r  rO  rG  rN   rA   r*  r   r  r2   r2   r3   "test_preview_workflow_by_submitterJ  s   z:TestPageWorkflowPreview.test_preview_workflow_by_submitterc              
   C   s|   | j dt| jj| jjfd}| jj|dd}| |t	d | 
|d| j dt| j d| jj d	 | 
|| j d S )
Nr  r  Tro  r%  r|  r  z:&#x27; is not currently awaiting moderation in task &#x27;z&#x27;.)r  r   r  r  r;  rG  rN   rA   r*  r   rO   r  r   r>   r  r  r2   r2   r3   !test_preview_workflow_bad_task_idT  s   z9TestPageWorkflowPreview.test_preview_workflow_bad_task_idc                 C   sh   | j dt| jjdfd}| j|}| |jd | j dd| jj	fd}| j|}| |jd d S )Nr  {   r  r  )
r  r   r  r  rN   rA   r   r   r:  rG  r  r2   r2   r3   %test_preview_workflow_nonexistent_idsc  s   z=TestPageWorkflowPreview.test_preview_workflow_nonexistent_ids)rY   rZ   r[   r  r  r  rF   r  r  r  r  r  r  r9  r2   r2   r2  r3   r  "  s    
r  c                       s0   e Zd ZdZdZdd Ze fddZ  ZS )TestSnippetWorkflowPreviewztests/previewable_model.htmlz&Not-so-simple object (Default Preview)c                 C   r  r.   )r  r  r   r=  r   r2   r2   r3   r  v  r  z&TestSnippetWorkflowPreview.edit_objectc                    s   t    d S r.   )r.  r  r   r2  r2   r3   r  z  s   zJTestSnippetWorkflowPreview.test_preview_workflow_show_edit_link_in_userbar)	rY   rZ   r[   r  r  r  r   r  r9  r2   r2   r2  r3   r  r  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	e
ddd Zdd Zdd Ze
ddd Zdd Zdd Zdd ZdS )TestTaskChooserViewc                 C   s.   |    tjjdd| _tjjddd| _d S )NEnabled foor=   zDisabled fooFrm   )r?   r   r/   rp   task_enabledtask_disabledr   r2   r2   r3   rF     s
   zTestTaskChooserView.setUpc                 C   s   | j td}| |jd | |d | |d | |d | |d | |jd 	  | dd	 |jd
 j
D ddg d S )N#wagtailadmin_workflows:task_chooserr   0wagtailadmin/workflows/task_chooser/chooser.htmlBwagtailadmin/workflows/task_chooser/includes/select_task_type.html9wagtailadmin/workflows/task_chooser/includes/results.html=wagtailadmin/workflows/task_chooser/includes/create_form.htmlsearch_formc                 S      g | ]}|j qS r2   r=   rr   ry   r2   r2   r3   rt         z0TestTaskChooserView.test_get.<locals>.<listcomp>r|  r  zModerators approval)rN   rA   r   r   r   r   assertTemplateNotUsedr  r   is_searchingr   rP   r2   r2   r3   r[    s(   zTestTaskChooserView.test_getc                 C   s   | j tdd }| |jd | |d | |d | |jd 	  | |jd d | d	d
 |jd j
D dg d S )N+wagtailadmin_workflows:task_chooser_resultsz?q=foor   r  r  r  query_stringr9  c                 S   r  r2   r=   r  r2   r2   r3   rt     r  z3TestTaskChooserView.test_search.<locals>.<listcomp>r|  r  )rN   rA   r   r   r   r   r  r   r   r  r   rP   r2   r2   r3   r     s    
zTestTaskChooserView.test_searchc                 C   sR   | j tdd }| |jd | |d | |d | |jd 	  d S )Nr  r  r   r  r  r  )
rN   rA   r   r   r   r   r  r  r   r  rP   r2   r2   r3   r    s   
z#TestTaskChooserView.test_paginationc                 C   s>   | j tdd }| |jd | |d | |d d S )N*wagtailadmin_workflows:task_chooser_create+?create_model=wagtailcore.GroupApprovalTaskr   r  r  )rN   rA   r   r   r   r   r  rP   r2   r2   r3   #test_get_with_create_model_selected  s   z7TestTaskChooserView.test_get_with_create_model_selectedc                 C   &   | j tdd }| |jd d S )Nr  ?create_model=wagtailcore.Pager  rN   rA   r   r   r   rP   r2   r2   r3   ,test_get_with_non_task_create_model_selected  s   z@TestTaskChooserView.test_get_with_non_task_create_model_selectedc                 C   r  )Nr  ?create_model=wagtailcore.Taskr  r  rP   r2   r2   r3   -test_get_with_base_task_create_model_selected  s   zATestTaskChooserView.test_get_with_base_task_create_model_selectedr  c                 C   sN   t g|_| jtd}| |jd | |d | |d | |d d S )Nr  r   r  r  r  )	r   r  rN   rA   r   r   r   r   r  r  r2   r2   r3   test_get_with_single_task_model  s   z3TestTaskChooserView.test_get_with_single_task_modelc                 C   s   dt tjjddjgdS )NEditor approval taskr<   r=   )zcreate-task-namezcreate-task-groups)rw  r   r/   rA   rG  r   r2   r2   r3   get_post_data  s   z!TestTaskChooserView.get_post_datac              
   C   sh   | j tdd |  }| |jd tjjddd}| |	 d|j
dtd|j
gd	d
d d S )Nr  r  r   r  Trm   task_chosenr  r  rG  r>   rQ  r  result)rN   r@  r   r  r   r   r   r/   rA   r  rG  )rD   rQ   ry   r2   r2   r3   $test_post_with_create_model_selected	  s&   z8TestTaskChooserView.test_post_with_create_model_selectedc              
   C   sl   t g|_| jtd|  }| |jd tj	j
ddd}| | d|jdtd|jgdd	d
 d S )Nr  r   r  Trm   r  r  r  r  r  )r   r  rN   r@  r   r  r   r   r   r/   rA   r  rG  )rD   r  rQ   ry   r2   r2   r3    test_post_with_single_task_model$  s"   z4TestTaskChooserView.test_post_with_single_task_modelc                 C   sB   | j td|  }| |jd | tjj	ddd
  d S )Nr  i  r  Trm   rN   r@  r   r  r   r   r  r   r/   rx  r  rP   r2   r2   r3   'test_post_without_create_model_selectedA  s   z;TestTaskChooserView.test_post_without_create_model_selectedc                 C   F   | j tdd |  }| |jd | tjj	ddd
  d S )Nr  r  r  r  Trm   r  rP   r2   r2   r3   -test_post_with_non_task_create_model_selectedM  s   zATestTaskChooserView.test_post_with_non_task_create_model_selectedc                 C   r  )Nr  r  r  r  Trm   r  rP   r2   r2   r3   .test_post_with_base_task_create_model_selected[  s   zBTestTaskChooserView.test_post_with_base_task_create_model_selectedN)rY   rZ   r[   rF   r[  r   r  r  r  r  r   r  r  r  r  r  r  r  r  r2   r2   r2   r3   r    s"    	

r  c                   @   s   e Zd Zdd Zdd ZdS )TestTaskChooserChosenViewc                 C   s"   t   |   tjjdd| _d S )Nrv   r=   )r4   r?   r*   r/   rp   ry   r   r2   r2   r3   rF   l  s   zTestTaskChooserChosenView.setUpc                 C   sl   | j td| jjgd}| |jd | |d d | | td| jjgd| jjddd	d
 d S )Nz"wagtailadmin_workflows:task_chosenr  r   zContent-Typezapplication/jsonr  rv   )rQ  rG  r>   r  )r  r  )rN   rA   r   ry   rG  r   r   r  rP   r2   r2   r3   r[  q  s    
z"TestTaskChooserChosenView.test_getN)rY   rZ   r[   rF   r[  r2   r2   r2   r3   r  k  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 )TestWorkflowUsageViewc                 C   s   |   | _tj | _tjjdd| _tjjdd| _| jj	t
dddd| _| jj	t
dd	dd| _tjjd
d| _| jjj| jd d S )Nr  rj   ri   zA pagez
I'm a pager~   r   zAnother pagezI'm another pagezAnother workflowr=   )r   )r?   rT   r   r/   rA   rx   r   r<  r   r   r)    child_page_with_default_workflow child_page_with_another_workflowrp   another_workflowr   r   r2   r2   r3   rF     s   



zTestWorkflowUsageView.setUpc                 C   sd   | j td| jjgd}| |jd | |d dd |jd D }| || j	j| j
jh d S )Nwagtailadmin_workflows:usager  r   zwagtailadmin/pages/listing.htmlc                 S      h | ]}|j qS r2   rF  rr   r   r2   r2   r3   	<setcomp>  r  z1TestWorkflowUsageView.test_get.<locals>.<setcomp>r   )rN   rA   r   rx   rG  r   r   r   r   r   r  )rD   rQ   
object_setr2   r2   r3   r[    s   zTestWorkflowUsageView.test_getc                 C   s*  t jjdd}d| j_| j  | jj| |jt	jj
ddd | j
td| jjgd}| |jd	 | |td
 tjj|tj dd}| j
td| jjgd}| |jd	 | |td
 |  |jt	jj
ddd | j
td| jjgd}| |jd	 | |td
 d S )Nr   r=   Fr!  r"  r#  r  r  r   r%  r.  r/  r  r  )r   r/   rp   rT   r&  r'  r(  rC   re   r   rA   rN   r   rx   rG  r   r   r*  r   r   r1  r1   )rD   r,  rQ   
permissionr2   r2   r3   test_with_no_permission  sF   
z-TestWorkflowUsageView.test_with_no_permissionc                 C   s   t jjdd}d| j_| j  | jj| |jt	jj
dddt	jj
ddd tjj|tj d	d
 | j
td| jjgd}| |jd d S )Nr   r=   Fr!  r"  r#  r  r  r.  r/  r  r  r   )r   r/   rp   rT   r&  r'  r(  rC   re   r   rA   r   r   r1  rN   r   rx   rG  r   r   r+  r2   r2   r3   test_with_minimal_permissions  s*   
z3TestWorkflowUsageView.test_with_minimal_permissionsc                 C   s   t ddd}t ddd}| jj|d | jj|d | jjtddd | jtd| jjgd	t	j
t jd
d}| |jd | |d dd |jd D }| ||j|jh d S )NzHello wagtailtestr~   zHello djangor   zHello python)r   z$wagtailadmin_workflows:usage_resultsr  r  )r   r   r   z)wagtailadmin/generic/listing_results.htmlc                 S   r  r2   rF  r  r2   r2   r3   r    r  zMTestWorkflowUsageView.test_get_search_and_filtered_results.<locals>.<setcomp>r   )r)   r   r   r(   rN   rA   r   rx   rG  r	   r/   r   r   r   r   r   )rD   page_1page_2rQ   r  r2   r2   r3   $test_get_search_and_filtered_results  s   z:TestWorkflowUsageView.test_get_search_and_filtered_resultsN)rY   rZ   r[   rF   r[  r  r  r  r2   r2   r2   r3   r    s    -r  z2020-06-01 12:00:00c                       s`   e Zd Z fddZdd Z fddZdd Zd	d
 Zdd Zdd Z	dd Z
dd Z  ZS )TestPageWorkflowStatusc                    s   t    | | j d S r.   )r.  rF   r?   r	  r   r2  r2   r3   rF     s   
zTestPageWorkflowStatus.setUpc                 C   s   t jjdd| _tjjdd| _| jjtjj	dd t
jj| j| jdd tjjdd| _| jjtjj	dd t
jj| j| jd	d d S )
Nr   r=   r  r`   r  r  r  r<   ri   )r   r/   rp   rx   r   r:  r(  r  r   rx  r#   r;  r   r2   r2   r3   r    s   


z/TestPageWorkflowStatus.setup_workflow_and_tasksc                    s(   t  |||dkrdnd| ddS )Nr%  	good workneeds some changesr  )r  r  next)r.  r!  r  )rD   r  r2  r2   r3   r!    s   z&TestPageWorkflowStatus.workflow_actionc                 C   s   | j | d}|jd}| d| | d | j | d}|jd}| d| j	j
| | d| jj
| | | d| d S )Nr  rK  zid="workflow-status-dialog"r?  z6In progress
        </span>
                        {}z6Not started
        </span>
                        {}history)rN   rA   r  r   rN  r=  r@  rV  r*  r:  r>   r;  r  r2   r2   r3   test_workflow_status_modal'  s&   
z1TestPageWorkflowStatus.test_workflow_status_modalc                 C   s   |  | j | j| d}| |dd | j  | j| d}| |d | d | j| d}| 	|j
dd| jj  | d}| 	|j
dd| jj  | d	}| |d
 | d | j| d}| 	|j
dd| jj  | d}| |d d S )Nr  rJ  r  id="status-sidebar-draft"r?  rK  rL  r%  r(  zChanges requestedzid="status-sidebar-live")r?   r	  rN   rA   r  rO   r  r=  r@  rM  r   rN  r:  r>   r!  r;  rP   r2   r2   r3   "test_status_through_workflow_cycle@  s6   








z9TestPageWorkflowStatus.test_status_through_workflow_cyclec                 C   s6   |  d |  d | j| d}| |d d S )Nr?  rn  r  r  )r@  rN   rA   r  rO   rP   r2   r2   r3   test_status_after_canceld  s   

z/TestPageWorkflowStatus.test_status_after_cancelc                 C   sz   |  d | d}| |jdd| jj  | d |  d | j| 	d}| |jdd| j
j  d S )Nr?  r%  rK  rL  r(  r  r  )r@  r!  rM  r   rN  r;  r>   rN   rA   r  r:  rP   r2   r2   r3   test_status_after_restartk  s   





z0TestPageWorkflowStatus.test_status_after_restartc                 C   sx   |  d | d | j| d}| d|jd |  d | d | j| d}| d|jd d S )Nr?  r(  r  r  rK  r%  r  )r@  r!  rN   rA   r  rV  r   rN  rP   r2   r2   r3   (test_workflow_status_modal_task_commentsz  s   



z?TestPageWorkflowStatus.test_workflow_status_modal_task_commentsc                 C   s   |  d | | j | j| d}d| j d| j d}| j||dd | |d | | j	 | j| d}| || | |d d S )	Nr?  r  zThis zt is awaiting <b>'test_task_1'</b> in the <b>'test_workflow'</b> workflow. Only reviewers for this task can edit the .r  r  rg  )
r@  r?   r  rN   rA   r  r  rO   rU   r^   rD   rQ   needler2   r2   r3   !test_workflow_edit_locked_message  s   

z8TestPageWorkflowStatus.test_workflow_edit_locked_message)rY   rZ   r[   rF   r  r!  r  r  r  r  r  r  r9  r2   r2   r2  r3   r  	  s    
$r  c                   @   r  )TestSnippetWorkflowStatusNr  r2   r2   r2   r3   r    r  r  c                   @   s   e Zd ZeZdd ZdS )$TestSnippetWorkflowStatusNotLockablec                 C   s~   |  d | | j | j| d}d}| || | |d | | j | j| d}| || | |d d S )Nr?  r  z%Only reviewers for this task can editrg  )	r@  r?   r  rN   rA   r  rU   rO   r^   r  r2   r2   r3   r    s   
zFTestSnippetWorkflowStatusNotLockable.test_workflow_edit_locked_messageN)rY   rZ   r[   r'   r   r  r2   r2   r2   r3   r    s    r  c                       s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )TestDashboardWithPagesc                    s2   t    tjjdd }tjj|tjd d S )Nri   rj   )r   restriction_type)	r.  rF   r   r/   rx  r1  r   rp   LOGIN)rD   homepager2  r2   r3   rF     s
   

zTestDashboardWithPages.setUpc                 C   sD   |  | j | d | jtd}| |jd | |d d S )Nr?  r%  r   %Your pages and snippets in a workflow)	r?   r  r@  rN   rA   r   r   r   rO   rP   r2   r2   r3   test_dashboard_for_submitter  s
   
z3TestDashboardWithPages.test_dashboard_for_submitterc                 C   sh   |  | j | d |  | j | jtd}| |jd | 	|d | 
|d | 
|d d S )Nr?  r%  r   r  Compare with live versionCompare with previous version)r?   r  r@  r^   rN   rA   r   r   r   rO   rU   rP   r2   r2   r3   test_dashboard_for_moderator  s   
z3TestDashboardWithPages.test_dashboard_for_moderatorc           
      C   s   | j  }| j | | j  }| | j | d | j   | j j}| | j | j	
td}| |jd | |d | |j}| jd| j jd|jfd}| jd| j j|j|jfd}|d| d	}| | | |j d
 |d| d	}	| |	 | |	j d d S )Nr?  r%  r   r  revisions_comparer  r  za[href='r  r  r  )r  r=  publishr?   r  r@  r  ru  r^   rN   rA   r   r   r   rO   r   r   r  r  rG  r   r   r   r   )
rD   live_revisionprevious_revisionru  rQ   r   compare_with_live_urlcompare_with_previous_urlcompare_with_live_linkcompare_with_previous_linkr2   r2   r3   4test_dashboard_for_moderator_with_previous_revisions  sD   






zKTestDashboardWithPages.test_dashboard_for_moderator_with_previous_revisionsc                 C   s   |  | j | d | j  | jtd}| |j	d | 
|d |  | j | jtd}| |j	d | 
|d d S )Nr?  r%  r   r
  r  )r?   r  r@  r  r1   rN   rA   r   r   r   rU   r^   rP   r2   r2   r3   2test_dashboard_after_deleting_object_in_moderation  s   

zITestDashboardWithPages.test_dashboard_after_deleting_object_in_moderation)	rY   rZ   r[   rF   r  r  r  r  r9  r2   r2   r2  r3   r    s    	)r  c                   @   r  )TestDashboardWithSnippetsNr  r2   r2   r2   r3   r  	  r  r  c                   @   r  )$TestDashboardWithNonLockableSnippetsNr  r2   r2   r2   r3   r    s    r  c                       sN   e Zd Z fddZdd Zdd Zdd Zd	d
 Ze	ddd Z
  ZS )TestWorkflowStateEmailNotifierc                    r;  r.   r<  r   r2  r2   r3   rF     r>  z$TestWorkflowStateEmailNotifier.setUpc              	   C   sx   | j j| j| jd | jj}t t fD ]%}| d|  | |	|| jh W d    n1 s4w   Y  qd S NrS   Testing with )
rx   r  r  r  r@  r   r   rJ  assertSetEqualget_recipient_usersrD   rG  notifierr2   r2   r3   Ntest_workflowstate_email_notifier_get_recipient_users__without_triggering_user  s   zmTestWorkflowStateEmailNotifier.test_workflowstate_email_notifier_get_recipient_users__without_triggering_userc              	   C   s~   | j j| j| jd | jj}t t fD ](}| d|  | |j	|| j
d| jh W d    n1 s7w   Y  qd S r  )rx   r  r  r  r@  r   r   rJ  r  r  r^   r   r2   r2   r3   Ktest_workflowstate_email_notifier_get_recipient_users__with_triggering_user*  s   zjTestWorkflowStateEmailNotifier.test_workflowstate_email_notifier_get_recipient_users__with_triggering_userc              	   C   s   | j j| j| jd | jj}d |_|jdgd t t fD ]1}| 	d|  | 
||t  | 
|j|| jdt  W d    n1 sJw   Y  qd S NrS   rC  update_fieldsr  )rx   r  r  r  r@  rC  r'  r   r   rJ  r  r  r  r^   r   r2   r2   r3   Ktest_workflowstate_email_notifier_get_recipient_users__without_requested_by:      zjTestWorkflowStateEmailNotifier.test_workflowstate_email_notifier_get_recipient_users__without_requested_byc              	   C   s   | j j| j| jd | jj}d |_|jdgd t t fD ]1}| 	d|  | 
||t  | 
|j|| jdt  W d    n1 sJw   Y  qd S r$  )rx   r  r  r  r@  rC  r'  r   r   rJ  r  r  r  r   r2   r2   r3   atest_workflowstate_email_notifier_get_recipient_users__with_same_requested_by_and_triggering_userM  r(  zTestWorkflowStateEmailNotifier.test_workflowstate_email_notifier_get_recipient_users__with_same_requested_by_and_triggering_userzEwagtail.admin.mail.BaseWorkflowStateEmailNotifier.get_recipient_usersc              	   C   sP  t  }t |_| || jt  d h|_| || jt  | jh|_g d}|D ]*}| d| d ||_| || j| jh W d    n1 sQw   Y  q,t	
| j}g }|D ]}| d}t||d || qa|j|d |D ])}| d| d ||_| || jt  W d    n1 sw   Y  q|d S )N)r{  r  	submittedr  _notificationsFr%  )r   r  r  r  get_valid_recipientsr  r  rJ  notificationr-   rW  setattrappendr'  )rD   mock_get_recipient_usersr!  notificationsr-  userprofileupdated_fields	attributer2   r2   r3   ;test_base_workflowstate_email_notifier_get_valid_recipients`  s:   

zZTestWorkflowStateEmailNotifier.test_base_workflowstate_email_notifier_get_valid_recipients)rY   rZ   r[   rF   r"  r#  r'  r)  r   r  r5  r9  r2   r2   r2  r3   r    s    r  )pr%  r  r  unittestr   r   r   django.confr   django.contrib.admin.utilsr   django.contrib.auth.modelsr   r   "django.contrib.contenttypes.modelsr	   django.corer
   django.core.mailr   django.testr   r   django.urlsr   	freezegunr   openpyxlr   wagtail.admin.admin_url_finderr   wagtail.admin.mailr   r   r   wagtail.admin.staticfilesr   wagtail.admin.utilsr   r   r   wagtail.modelsr   r   r   r   r   r   r   r    r!   r"   r#   wagtail.signalsr$   r%   wagtail.test.testapp.modelsr&   r'   r(   r)   r*   wagtail.test.utilsr+   !wagtail.test.utils.template_testsr,   wagtail.users.modelsr-   r4   r5   r\   r  r3  r6  r  r  r  r  r  r  r  r)  r:  r  r  r  r  r  r  rO  rQ  rR  rS  rT  rU  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r2   r2   r2   r3   <module>   s    4$ k2 {  n;  "]( 	c:    * 1    
  



 u
 pP l  Y