U
    {h                    @   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< d dl=m>Z> d dl?m@Z@ d dlAmBZB dd ZCG dd de>eZDG dd de@e>eZEG dd de>eZFG dd  d eFZGG d!d" d"e@e>eZHG d#d$ d$e@e>eZIG d%d& d&e>eZJG d'd( d(e@e>eZKG d)d* d*e@e>eZLG d+d, d,e>eZMG d-d. d.e@e>eZNG d/d0 d0e@e>eZOG d1d2 d2eOZPG d3d4 d4eOZQG d5d6 d6eQePZRG d7d8 d8eRZSed9G d:d; d;eOZTG d<d= d=eTePZUG d>d? d?eUZVed9G d@dA dAeOZWG dBdC dCeWZXG dDdE dEeWePZYG dFdG dGeXePZZG dHdI dIeWePZ[G dJdK dKeXePZ\G dLdM dMeOZ]edNdOG dPdQ dQe]Z^G dRdS dSe]ePZ_edNdOG dTdU dUe_Z`G dVdW dWeOZaG dXdY dYeaePZbG dZd[ d[eOZcG d\d] d]ecePZdG d^d_ d_e>eZeG d`da dae>eZfG dbdc dce>eZgeddG dedf dfeOZhG dgdh dhehePZiG didj djeiZjG dkdl dleOZkG dmdn dnekePZlG dodp dpelZmG dqdr dreOZnd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
SimplePage
SimpleTask)WagtailTestUtils)AdminTemplateTestUtils)UserProfilec                   C   s<   t j   tj   tj   tj   d S N)r!   objectsalldeleter   r   r#    r1   r1   j/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/admin/tests/test_workflows.pydelete_existing_workflows6   s    r3   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emailr7   Editorsname)logincreate_userr5   r   r.   getuser_setadd)selfeditorsr1   r1   r2   setUp>   s    zTestWorkflowMenus.setUpc                 C   s@   | 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/")clientr@   assertContainsrC   responser1   r1   r2   ;test_workflow_settings_and_reports_menus_are_shown_to_adminI   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userrG   rH   rI   rJ   rK   )r>   r5   rL   r@   assertNotContainsrM   rN   r1   r1   r2   4test_workflow_settings_menus_are_not_shown_to_editorP   s    zFTestWorkflowMenus.test_workflow_settings_menus_are_not_shown_to_editorF)ZWAGTAIL_WORKFLOW_ENABLEDc                 C   s@   | j d}| |d | |d | |d | |d d S rF   )rL   r@   rS   rN   r1   r1   r2   :test_workflow_menus_are_hidden_when_workflows_are_disabledX   s
    zLTestWorkflowMenus.test_workflow_menus_are_hidden_when_workflows_are_disabledN)__name__
__module____qualname__rE   rP   rT   r   rU   r1   r1   r1   r2   r4   =   s
   r4   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   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
tjjd
d d S )Nr5   r6   r7   r8   r;   r<   	moderatormoderator@email.com
Moderatorsadd_workflowcodenamer3   r>   r?   r5   r   r.   r@   rA   rB   rZ   permissionsr   rC   rD   
moderatorsr1   r1   r2   rE   b   s"    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 )Ztest_workflow_Tr=   activer   r.   create.0ir1   r1   r2   
<listcomp>y   s   z;TestWorkflowsIndexView.create_workflows.<locals>.<listcomp>   	test_taskr<   c                    s   g | ]}t | d qS )workflowtaskr#   rl   rr   rs   r1   r2   rn   ~   s    c              	      s(   g | ] }t | jtd ddddqS )ZSimplezVery simpletitlecontentinstancerr   page)r!   	add_childr(   ru   )	home_pager1   r2   rn      s   
)	r   r.   r@   ranger)   rj   r#   bulk_creater!   )rC   	workflowsZworkflow_tasksworkflow_pagesr1   )r   rs   r2   create_workflowsw   s    

	z'TestWorkflowsIndexView.create_workflowsc                 C   s   | j td|S )Nwagtailadmin_workflows:indexrL   r@   r   rC   paramsr1   r1   r2   r@      s    zTestWorkflowsIndexView.getc                 C   s   |   }| |jd | |d | dddg|j | |d tjj	ddd	 |   }| |jd | |d | 
|d | |d d S )
N   z!wagtailadmin/workflows/index.html 	WorkflowsurllabelThere are no enabled workflows.test_workflowTrg   )r@   assertEqualstatus_codeassertTemplateUsedassertBreadcrumbsItemsRenderedry   rM   r   r.   rj   rS   rN   r1   r1   r2   test_simple   s    
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 }| 	|dd	dd
g d S )NZNocontenttypesr<   ZMulticontenttypesrr   content_typer   c                    s"   g | ]}|j d dd  r qS )z | T	separatorstripget_text)rl   tdtextr1   r2   rn      s   zVTestWorkflowsIndexView.test_multiple_snippets_assigned_to_workflow.<locals>.<listcomp>r   z0 pages | 2 snippet typesz0 pages | 0 snippet types)r   r.   rj   r&   r'   r    r	   get_for_modelr@   r   r   get_soupry   select)rC   Zmulti_ct_workflowmodelrO   soupcellsr1   r   r2   +test_multiple_snippets_assigned_to_workflow   s*    

zBTestWorkflowsIndexView.test_multiple_snippets_assigned_to_workflowc              	   C   sX   |    |   | d |   W 5 Q R X |    | d |   W 5 Q R X d S )N   !   )r   r@   assertNumQueriesrC   r1   r1   r2   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   Frg   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.   rj   r@   r   r   rS   rM   r   ry   
select_oneassertIsNotNoner   
assertTruehas_attrassertIsNonerC   rO   r   active_filterZshow_disabled_yesZshow_disabled_nor1   r1   r2   test_deactivated   s:      







z'TestWorkflowsIndexView.test_deactivatedc                 C   sl   | j | jd |  }| |jd dd |jD }| |d d | j | jd |  }| |jd d S )NrQ   .  c                 S   s$   i | ]}|  D ]\}}||qqS r1   itemsrl   contextkeyvaluer1   r1   r2   
<dictcomp>   s
    
   z;TestWorkflowsIndexView.test_permissions.<locals>.<dictcomp>message6Sorry, you do not have permission to access this area.r   r>   r5   r@   r   r   r   rZ   rC   rO   Zfull_contextr1   r1   r2   test_permissions   s    z'TestWorkflowsIndexView.test_permissionsc                 C   s  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 )NZ
workflow_1r<   Z
workflow_3Z
workflow_2c                 S   s   | j S r-   r<   rr   r1   r1   r2   <lambda>      z6TestWorkflowsIndexView.test_ordering.<locals>.<lambda>r   r   object_listorderingr=   r   -namer   )sortedr   r.   rj   r@   r   r   assertSequenceEqualr   queryorder_byrC   r   rO   r1   r1   r2   test_ordering   s&    
z$TestWorkflowsIndexView.test_orderingc                 C   sp   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.   rj   r@   r   r   rM   rS   rN   r1   r1   r2   test_search  s    z"TestWorkflowsIndexView.test_searchc                 C   s   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.   rj   rL   r@   r   r   r   assertBreadcrumbsNotRenderedry   rM   rS   rN   r1   r1   r2   test_search_results"  s    z*TestWorkflowsIndexView.test_search_resultsc                 C   s   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 S )Nc                 S   s   g | ]}t d | dqS Z	workflow_r<   )r   rk   r1   r1   r2   rn   3  s     z:TestWorkflowsIndexView.test_pagination.<locals>.<listcomp>   2   r   prd   r   r      ?p=1?p=2?p=3     )r   r.   r   r   r   r@   r   r   lenr   rM   rS   rC   r   rO   r1   r1   r2   test_pagination1  s    z&TestWorkflowsIndexView.test_paginationN)rV   rW   rX   rE   r   r@   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   rY   a   s   	$rY   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>   rR   r   r1   r1   r2   rE   F  s    zTestWorkflowPermissions.setUpc                 C   s   | j t| j|S r-   )rL   r@   r   url_namer   r1   r1   r2   r@   I  s    zTestWorkflowPermissions.getc                 C   s   |   }| |jd d S )Nr   r@   r   r   rN   r1   r1   r2   r   L  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Zcontent_type__app_labelr_   r   wagtailadmin_home)r   r.   rj   rR   is_superusersavegroupsrB   user_permissionsr   r@   r   r   assertRedirectsr   rC   grouprO   r1   r1   r2   test_get_with_no_permissionP  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   Zchange)r  r}   Zpermission_typer   )r   r.   rj   rR   r   r   r   rB   r   r   r@   r   r   firstr   r   r   r1   r1   r2   !test_get_with_minimal_permissions`  s"    
 z9TestWorkflowPermissions.test_get_with_minimal_permissionsN)	rV   rW   rX   r   rE   r@   r   r  r  r1   r1   r1   r2   r   C  s   r   c                   @   s   e Zd ZdZdS )TestWorkflowTaskPermissions#wagtailadmin_reports:workflow_tasksN)rV   rW   rX   r   r1   r1   r1   r2   r  u  s   r  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_taskr5   r6   r7   r8   r;   rZ   r[   r\   r]   r^   r   re   foor   )r3   r>   r)   r.   rj   task_1task_2r?   r5   r   r@   rA   rB   rZ   ra   r   r   	root_pager&   snippetr	   r   snippet_content_typerb   r1   r1   r2   rE   z  s0    zTestWorkflowsCreateView.setUpc                 C   s   | j td|S Nzwagtailadmin_workflows:addr   r   r1   r1   r2   r@     s    zTestWorkflowsCreateView.getc                 C   s   | j td|S r  )rL   postr   rC   	post_datar1   r1   r2   r    s    zTestWorkflowsCreateView.postc                 C   sD   |   }| |jd | |d | ddddddg|j d S )Nr   z"wagtailadmin/workflows/create.htmlr   /admin/workflows/list/r   r   zNew: Workflowr   r@   r   r   r   r   ry   rN   r1   r1   r2   test_get  s    z TestWorkflowsCreateView.test_getc                 C   sR  |  dgdgdgdgdgdgt| jjgdgdgdgt| jjgdgdgdgdgdg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   on201000r   1r=   rh   workflow_tasks-TOTAL_FORMSworkflow_tasks-INITIAL_FORMSworkflow_tasks-MIN_NUM_FORMSworkflow_tasks-MAX_NUM_FORMSworkflow_tasks-0-taskworkflow_tasks-0-idworkflow_tasks-0-ORDER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-DELETEZcontent_typesr   Trg   r   rq   r   )r  strr  idr  r  r  r   r   r   r.   filterr   countr  task_ptrlisttasksr#   r@   
sort_orderget_workflowr&   get_default_workflowr  )rC   rO   r   rr   r1   r1   r2   	test_post  sf       z!TestWorkflowsCreateView.test_postc                 C   sl   | j | jd |  }| |jd dd |jD }| |d d | j | jd |  }| |jd d S )NrQ   r   c                 S   s$   i | ]}|  D ]\}}||qqS r1   r   r   r1   r1   r2   r     s
    
   z<TestWorkflowsCreateView.test_permissions.<locals>.<dictcomp>r   r   r   r   r   r1   r1   r2   r     s    z(TestWorkflowsCreateView.test_permissionsc                 C   s   t jjdd}tjj|| jd | dgdgdgdgdgdgt| jjgd	gd
gd	gt| j	jgd	gdgd	gdgd
g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  r  r  r  r   r  r=   rh   r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r   pages_formsetr   r}   z<This page already has workflow 'existing_workflow' assigned.)r   r.   rj   r!   r  r  r2  r  r3  r  r   r   assertFormSetErrorr   )rC   rr   rO   r1   r1   r2   $test_page_already_has_workflow_check  sD    z<TestWorkflowsCreateView.test_page_already_has_workflow_checkc                 C   s   t jjdd}tjj|| jd | dgdgdgdgdgdgt| jjgd	gd
gd	gt| j	jgd	gdgd	gdgd
g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  r  r  r  r   r  r  r   zRSnippet 'Full-featured snippet' already has workflow 'existing_workflow' assigned.r   Tr5  r   r   )r   r.   rj   r    r  r  r2  r  r3  r  r  r   r   rM   r@   rr   )rC   rr   rO   linkr1   r1   r2   'test_snippet_already_has_workflow_check"  sP     z?TestWorkflowsCreateView.test_snippet_already_has_workflow_checkN)rV   rW   rX   rE   r@   r  r  r<  r   rA  rE  r1   r1   r1   r2   r  y  s   B'r  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 )NZworkflow_to_editr<   r  r	  inactive_taskFrg   r   rr   rs   r9  r|   r   r5   r6   r7   r8   r;   rZ   r[   r\   change_workflowr^   ) r3   r>   rR   r   r.   rj   rr   r)   r  r  rG  r#   r6  workflow_taskr   r  r}   r	   r   r&   r  r!   r    r?   r5   r   r@   rA   rB   rZ   ra   r   rb   r1   r1   r2   rE   R  sL    
    zTestWorkflowsEditView.setUpc                 C   s   | j td| jjgd|S Nzwagtailadmin_workflows:editargs)rL   r@   r   rr   r3  r   r1   r1   r2   r@   x  s     zTestWorkflowsEditView.getc                 C   s   | j td| jjgd|S rK  )rL   r  r   rr   r3  r  r1   r1   r2   r  }  s     zTestWorkflowsEditView.postc                 C   sZ   |   }| |jd | |d | ddddt| jdg|j | || j	j
 d S )Nr   z wagtailadmin/workflows/edit.htmlr  r   r   r   )r@   r   r   r   r   r2  rr   ry   rM   r}   rx   rN   r1   r1   r2   r    s    	zTestWorkflowsEditView.test_getc                 C   sf  |  dgdgdgdgdgdgt| jjgt| jjgdgdgt| jjgdgdgdgdgdg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 )NzEdited workflowr  r  r  r  r  r   r  r   Trg   r   rq   r   r
  r   )r  r2  r  r3  rJ  r  r}   r  r   r   r   r.   r4  r   r5  r  r6  r7  r8  r#   r@   r9  r:  r&   r;  rj   )rC   rO   r   rr   r  r1   r1   r2   r<    sh       zTestWorkflowsEditView.test_postc                 C   sl   | j | jd |  }| |jd dd |jD }| |d d | j | jd |  }| |jd d S )NrQ   r   c                 S   s$   i | ]}|  D ]\}}||qqS r1   r   r   r1   r1   r2   r     s
    
   z:TestWorkflowsEditView.test_permissions.<locals>.<dictcomp>r   r   r   r   r   r1   r1   r2   r     s    z&TestWorkflowsEditView.test_permissionsc                 C   sJ   t | j}| || j t | j}d| jj }| || j| d S )Nz/admin/workflows/edit/%d/)r   r5   r   get_edit_urlrr   rZ   pkr   rC   Zeditor_url_finderZmoderator_url_finderZexpected_urlr1   r1   r2   test_admin_url_finder  s
    

z+TestWorkflowsEditView.test_admin_url_finderc                 C   s   |  t| jjgdgdgdgdgdgt| jjgt| jjgdgdgt| jjgdgdgdgdgdg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  r  r  r  r  r   r>  r   r?  z@You cannot assign this workflow to the same page multiple times.)r  r2  rr   r=   r  r3  rJ  r  r}   r   r   r@  r   rN   r1   r1   r2   test_duplicate_page_check  s@    z/TestWorkflowsEditView.test_duplicate_page_checkc                 C   s   t jjdd}tjj| jdj|d | t| j	j
gdgdgdgdgd	gt| jjgt| jjgdgd
gt| jjgd
gdgd
gdgdg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<   rC  r   r  r  r  r  r  r   r  r   zOSnippet 'Full-featured snippet' already has workflow 'other_workflow' assigned.r   TrB  )r   r.   rj   r    r4  r  updater  r2  rr   r=   r  r3  rJ  r  r}   r   r   rM   r@   )rC   rS  rO   rD  r1   r1   r2   rE    sR    z=TestWorkflowsEditView.test_snippet_already_has_workflow_checkc                 C   sV   d| j _| j   |  }| |j}td| j jfd}|dd|i}| 	| d S )NFwagtailadmin_workflows:enablerL  buttondata-w-action-url-value)
rr   rh   r   r@   r   ry   r   rO  findr   rC   rO   r   Z
enable_urlZenable_buttonr1   r1   r2   .test_render_enable_button_if_workflow_disabled?  s    
zDTestWorkflowsEditView.test_render_enable_button_if_workflow_disabledc                 C   s   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   r]   r^   rI  rU  rL  rV  rW  )rR   r   r   r   rB   r   r.   r@   rr   rh   r   ry   r   rO  rX  r   rY  r1   r1   r2   Btest_render_enable_button_if_workflow_disabled_minimal_permissionsH  s"    

zXTestWorkflowsEditView.test_render_enable_button_if_workflow_disabled_minimal_permissionsc                 C   s   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   rI  r^   rU  rL  rV  rW  )rR   r   r   r   rB   r   r.   r@   rr   rh   r   ry   r   rO  rX  r   rY  r1   r1   r2   =test_render_enable_button_if_workflow_disabled_no_permissions[  s     

zSTestWorkflowsEditView.test_render_enable_button_if_workflow_disabled_no_permissionsc                 C   s  d| j _| j   | j j   | j j   | t| j j	gdgdgdgdgdgt| j
jgt| jjgdgdgt| jjgdgdgdgdgdg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  r  r  r  r  r   r  r   )rr   rh   r   r   r/   r0   Zworkflow_content_typesr  r2  r=   r  r3  rJ  r  r}   r  r   r   refresh_from_dbassertFalseexistsrN   r1   r1   r2   9test_pages_and_content_types_ignored_if_workflow_disabledm  sD    

zOTestWorkflowsEditView.test_pages_and_content_types_ignored_if_workflow_disabledN)rV   rW   rX   rE   r@   r  r  r<  r   rQ  rR  rE  rZ  r[  r\  r`  r1   r1   r1   r2   rF  Q  s   &C$0	rF  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 )Nrr   r<   r|   r5   r6   r7   r8   r;   rZ   r[   r\   rI  r^   )r3   r>   r   r.   rj   rr   r   r  r}   r!   r?   r5   r   r@   rA   rB   rZ   ra   r   rb   r1   r1   r2   rE     s(    zTestRemoveWorkflow.setUpc                 C   s"   | j td| jj| jjgd|S )Nzwagtailadmin_workflows:removerL  )rL   r  r   r}   r3  rr   r  r1   r1   r2   r    s     zTestRemoveWorkflow.postc                 C   s,   |    | tjj| j| jd d d S )Nr|   r   )r  r   r!   r.   r4  rr   r}   r5  r   r1   r1   r2   r<    s
    zTestRemoveWorkflow.test_postc                 C   sH   | j | jd |  }| tjj| j| jd	 d | |j
d d S )NrQ   r|   r   r   )r>   r5   r  r   r!   r.   r4  rr   r}   r5  r   rN   r1   r1   r2   test_no_permissions  s    z&TestRemoveWorkflow.test_no_permissionsc                 C   s(   | j | jd |  }| |jd d S )NrQ   r   )r>   rZ   r  r   r   rN   r1   r1   r2   test_post_with_permission  s    z,TestRemoveWorkflow.test_post_with_permissionN)	rV   rW   rX   ZfixturesrE   r  r<  rb  rc  r1   r1   r1   r2   ra    s   
ra  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   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
tjjd
d d S )Nr5   r6   r7   r8   r;   r<   rZ   r[   r\   change_taskr^   r`   rb   r1   r1   r2   rE     s"    zTestTaskIndexView.setUpc                 C   s   | j td|S )N!wagtailadmin_workflows:task_indexr   r   r1   r1   r2   r@     s    zTestTaskIndexView.getc                 C   s   |   }| |jd | |d | dddg|j | |d tjj	ddd	 |   }| |jd | |d | 
|d | |d d S )
Nr   z&wagtailadmin/workflows/task_index.htmlr   Tasksr   There are no enabled tasksrp   Trg   )r@   r   r   r   r   ry   rM   r)   r.   rj   rS   rN   r1   r1   r2   r     s    
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 )Nrp   Frg   r   r   r   r   zNo tasks have been created.r   Tr   r   r   r   r   r   r   rh  r   )r   r.   rj   r@   r   r   rS   rM   r   ry   r   r   r   r   r   r   r   r1   r1   r2   r     s<      







z"TestTaskIndexView.test_deactivatedc                 C   sl   | j | jd |  }| |jd dd |jD }| |d d | j | jd |  }| |jd d S )NrQ   r   c                 S   s$   i | ]}|  D ]\}}||qqS r1   r   r   r1   r1   r2   r   -  s
    
   z6TestTaskIndexView.test_permissions.<locals>.<dictcomp>r   r   r   r   r   r1   r1   r2   r   )  s    z"TestTaskIndexView.test_permissionsc                 C   s  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 )Nr  r<   Ztask_3r  c                 S   s   | j S r-   r<   rv   r1   r1   r2   r   A  r   z1TestTaskIndexView.test_ordering.<locals>.<lambda>r   r   r   r   r=   r   r   r   r   )r   r   r.   rj   r@   r   r   r   r   r   r   )rC   r8  rO   r1   r1   r2   r   9  s&    
zTestTaskIndexView.test_orderingc                 C   sp   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 taskr<   bar taskbar world taskr   r   r   r   )r   r.   rj   r@   r   r   rM   rS   rN   r1   r1   r2   r   S  s    zTestTaskIndexView.test_searchc                 C   s   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 )	Nri  r<   rj  rk  z)wagtailadmin_workflows:task_index_resultsr   r   r   )r   r.   rj   rL   r@   r   r   r   r   ry   rM   rS   rN   r1   r1   r2   r   ^  s    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   )rl   r4  r1   r1   r2   rn     s     z;TestTaskIndexView.test_task_type_filter.<locals>.<listcomp>zType: Group approval task)r)   r.   rj   r   r	   r   rO  r@   r   r   rM   rS   r   ry   r   r   r   r   r   r^  r   assertCountEqual)	rC   	simple_ctZgroup_approval_ctrO   r   r   Zsimple_ct_boxZgroup_approval_ct_boxactive_filtersr1   r1   r2   test_task_type_filterm  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 5 Q R X | |d | |d | |d | |j}|d}| | |d}| | d S )	Nrl  r<   rm  rn  ,wagtail.admin.views.workflows.get_task_typesr   z.w-active_filterszinput[name="content_type"])r)   r.   rj   r   r	   r   rO  r   patchreturn_valuer@   rM   r   ry   r   r   )rC   rp  get_task_typesrO   r   rq  Zcontent_type_filterr1   r1   r2   0test_task_type_filter_hidden_if_single_task_type  s$    


zBTestTaskIndexView.test_task_type_filter_hidden_if_single_task_typec                 C   s   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 S )Nc                 S   s   g | ]}t d | dqS Ztask_r<   )r   rk   r1   r1   r2   rn     s     z5TestTaskIndexView.test_pagination.<locals>.<listcomp>r   x   rf  r   rd   r   r   r   r   r   r   r   r   )r   r.   r   r   r   r@   r   r   r   r   rM   rS   r   r1   r1   r2   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 5 Q R X | j|ddd	 d
d t ddD  tj fdd|D  | d |  }W 5 Q R X | j|ddd	 d S )Nc                 S   s    g | ]}t jjd | dqS r   ri   rk   r1   r1   r2   rn     s     z6TestTaskIndexView.test_num_queries.<locals>.<listcomp>   c                 S   s    g | ]}t jjd | dqS rx  r   r.   rj   rk   r1   r1   r2   rn     s     r   c                    s$   g | ]} D ]}t ||d dqqS r   rH  rt   rl   rr   rs   r8  r1   r2   rn     s       z+2 morer5  c                 S   s    g | ]}t jjd | dqS rx  r{  rk   r1   r1   r2   rn     s        )   c                    s$   g | ]} D ]}t ||d dqqS r|  rt   r}  r~  r1   r2   rn     s    (   )r   r#   r.   r   r@   r   rM   r   r1   r~  r2   r     s(    

z"TestTaskIndexView.test_num_queriesN)rV   rW   rX   rE   r@   r   r   r   r   r   r   rr  rw  r   r   r1   r1   r1   r2   rd    s   &:rd  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   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
tjjd
d d S )Nr5   r6   r7   r8   r;   r<   rZ   r[   r\   add_taskr^   r`   rb   r1   r1   r2   rE     s"    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  rL   r@   r   )rC   
url_kwargsr   r1   r1   r2   r@     s    
 zTestCreateTaskView.getc                 C   s$   | j tdtjjtjjdd|S )Nr  r  r  r  )rL   r  r   r)   r  r  r  r  r1   r1   r2   r    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.htmlrg  /admin/workflows/tasks/index/r  zNew: Simple taskr   r  rN   r1   r1   r2   r    s    zTestCreateTaskView.test_getc                 C   s$   | j dddd}| |jd d S )NwagtailcoreZSiter  r  r   r   rN   r1   r1   r2   test_get_with_non_task_model#  s    z/TestCreateTaskView.test_get_with_non_task_modelc                 C   s$   | j dddd}| |jd d S )Nr  r   r  r  r   r   rN   r1   r1   r2   test_get_with_base_task_model)  s    z0TestCreateTaskView.test_get_with_base_task_modelc                 C   sD   |  ddd}| |td tjjddd}| | d d S )Nrp   r  rg   rf  Tr   )r  r   r   r   r.   r4  r   r5  )rC   rO   r8  r1   r1   r2   r<  /  s    zTestCreateTaskView.test_postc                 C   sl   | j | jd |  }| |jd dd |jD }| |d d | j | jd |  }| |jd d S )NrQ   r   c                 S   s$   i | ]}|  D ]\}}||qqS r1   r   r   r1   r1   r2   r   =  s
    
   z7TestCreateTaskView.test_permissions.<locals>.<dictcomp>r   r   r   r   r   r1   r1   r2   r   9  s    z#TestCreateTaskView.test_permissions)rV   rW   rX   rE   r@   r  r  r  r  r<  r   r1   r1   r1   r2   r    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-   )r3   r>   r   r1   r1   r2   rE   K  s    zTestSelectTaskTypeView.setUpc                 C   s   | j tdS )Nz'wagtailadmin_workflows:select_task_typer   r   r1   r1   r2   r@   O  s    zTestSelectTaskTypeView.getc                 C   sV   |   }| |jd | |d | |t  | |t  | |t  d S )Nr   z,wagtailadmin/workflows/select_task_type.html)	r@   r   r   r   rM   r)   Zget_verbose_namer   get_descriptionrN   r1   r1   r2   r  R  s     zTestSelectTaskTypeView.test_getc              	   C   sJ   t d}tg|_|  }W 5 Q R X | |tdtjjtjj	fd d S )Nrs  r  rL  )
r   rt  r   ru  r@   r   r   r  r  r  rC   rv  rO   r1   r1   r2   test_get_single_task_type^  s    z0TestSelectTaskTypeView.test_get_single_task_typeN)rV   rW   rX   rE   r@   r  r  r1   r1   r1   r2   r  J  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 )Nrp   r<   r5   r6   r7   r8   r;   rZ   r[   r\   re  r^   )r3   r>   rR   r   r.   rj   rs   r?   r5   r   r@   rA   rB   rZ   ra   r   rb   r1   r1   r2   rE   s  s$    
zTestEditTaskView.setUpc                 C   s   | j td| jjgd|S N wagtailadmin_workflows:edit_taskrL  )rL   r@   r   rs   r3  r   r1   r1   r2   r@     s     zTestEditTaskView.getc                 C   s   | j td| jjgd|S r  )rL   r  r   rs   r3  r  r1   r1   r2   r    s     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  rg  r   r   )r@   r   r   r   r   r2  rs   ry   rN   r1   r1   r2   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<   Ztest_task_modifiedr  )r=   rh   r   rf  r3  rp   r   )r   rs   r   r5  r   r.   r@   r  r2  r3  r   r   r   r=   r   r4  r_  )rC   rD   rO   rs   r1   r1   r2   r<    s    zTestEditTaskView.test_postc                 C   sl   | j | jd |  }| |jd dd |jD }| |d d | j | jd |  }| |jd d S )NrQ   r   c                 S   s$   i | ]}|  D ]\}}||qqS r1   r   r   r1   r1   r2   r     s
    
   z5TestEditTaskView.test_permissions.<locals>.<dictcomp>r   r   r   r   r   r1   r1   r2   r     s    z!TestEditTaskView.test_permissionsc                 C   sV   d| j _| j   |  }| |j}td| j jfd}|dd|i}| 	| d S )NF"wagtailadmin_workflows:enable_taskrL  rV  rW  )
rs   rh   r   r@   r   ry   r   rO  rX  r   rY  r1   r1   r2   *test_render_enable_button_if_task_disabled  s    
z;TestEditTaskView.test_render_enable_button_if_task_disabledc                 C   s   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   r  r^   re  r  rL  rV  rW  )rR   r   r   r   rB   r   r.   r@   rs   rh   r   ry   r   rO  rX  r   rY  r1   r1   r2   >test_render_enable_button_if_task_disabled_minimal_permissions  s"    

zOTestEditTaskView.test_render_enable_button_if_task_disabled_minimal_permissionsc                 C   s   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   re  r^   r  rL  rV  rW  )rR   r   r   r   rB   r   r.   r@   rs   rh   r   ry   r   rO  rX  r   rY  r1   r1   r2   9test_render_enable_button_if_task_disabled_no_permissions  s     

zJTestEditTaskView.test_render_enable_button_if_task_disabled_no_permissionsc                 C   sJ   t | j}| || j t | j}d| jj }| || j| d S )Nz/admin/workflows/tasks/edit/%d/)r   r5   r   rN  rs   rZ   rO  r   rP  r1   r1   r2   rQ    s
    

z&TestEditTaskView.test_admin_url_finderN)rV   rW   rX   rE   r@   r  r  r<  r   r  r  r  rQ  r1   r1   r1   r2   r  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.comr7   r8   r;   r<   rZ   r[   r\   	superuserzsuperuser@email.comrQ   )r3   r?   r  r   r.   r@   rA   rB   rZ   Zcreate_superuserr  r>   setup_workflow_and_taskssetup_objectrb   r1   r1   r2   rE     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   rH  rd   )r   r.   rj   rr   r   r  r  r   setr   r4  r#   r   r1   r1   r2   r    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 )Nrd   r  Hello world!zhello-worldZhelloFT)rx   slugry   livehas_unpublished_changesrz   r|   )r   r.   r@   r(   objectr~   Zspecific_classobject_classr!   rj   rr   )rC   r  r1   r1   r2   r  &  s    
z"BasePageWorkflowTests.setup_objectNc                 C   s$   t d| |d kr| jjfn|dS )Nzwagtailadmin_pages:rL  )r   r  r3  rC   viewrM  r1   r1   r2   get_url6  s    zBasePageWorkflowTests.get_urlc                 K   sX   dt | jjdt | jjdt | jjd| di}|r@|| | jj| d|f|S )Nrx   r  ry   action-Trueedit)	r2  r  rx   r  ry   rT  rL   r  r  rC   actiondatar  r  r1   r1   r2   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_actionrL  followT)rL   r  r  r   r  rO  current_workflow_task_stater3  )rC   r  r  r  r1   r1   r2   r  G  s    

z%BasePageWorkflowTests.workflow_actionc                 K   s   | j d|f|S )Napprover  rC   r  r  r1   r1   r2   r  V  s    zBasePageWorkflowTests.approvec                 K   s   | j d|f|S )Nrejectr  r  r1   r1   r2   r  Y  s    zBasePageWorkflowTests.reject)N)N)N)N)N)rV   rW   rX   r  rE   r  r  r  r  r  r  r  r1   r1   r1   r2   r    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r| jj| j d S )NZtestsZchange_r   Zpublish_Zlock_)superrE   r   r.   r@   r   r  r  edit_permissionpublish_permissionr4  r  Zlock_permissionr  r   rB   rZ   r   	__class__r1   r2   rE   `  s(    
 zBaseSnippetWorkflowTests.setUpc                 C   s
   | j jjS r-   )r   r  Zverbose_namer   r1   r1   r2   r  u  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.   rj   r  typer  r    rr   r	   r   r   r1   r1   r2   r  y  s    z%BaseSnippetWorkflowTests.setup_objectNc                 C   s,   t | jj||d kr$t| jjfn|dS )NrL  )r   r   Zsnippet_viewsetZget_url_namer   r  rO  r  r1   r1   r2   r    s    z BaseSnippetWorkflowTests.get_urlc                 K   s<   d| j jd| di}|r$|| | jj| d|f|S )Nr   r  r  r  )r  r   rT  rL   r  r  r  r1   r1   r2   r    s      
zBaseSnippetWorkflowTests.post)N)N)rV   rW   rX   r&   r   rE   propertyr  r  r  r  __classcell__r1   r1   r  r2   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                    s   t    | j  d S r-   r  rE   r  save_revisionr   r  r1   r2   rE     s    
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   r  r"   rr   statusSTATUS_IN_PROGRESSrequested_byr  current_task_stater   rs   specificr  rC   workflow_state
task_stater1   r1   r2   '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  rL   r@   rM   r  assertRegexry   decoder  current_workflow_taskr=   rS   rC   edit_urlrO   r1   r1   r2   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  rL   r@   rM   r  rS   r  r  r1   r1   r2   ,test_submit_for_approval_changes_lock_status  s8    
 
 



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  r  r   r  Reviewers can edit this 4    – lock it to prevent other reviewers from editingr  r  r  r  	r  r  r>   rZ   rL   r@   rM   r  rS   r  r1   r1   r2   &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  r  zLocked by your   r  z$Only you can make changes while the 
 is lockedr  rd   r  r  r  r  r1   r1   r2   -test_can_unlock_manual_lock_while_in_workflow  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  r  Locked by another userr   r  Only  can make changes while the r  r  rd   r  r  )r  r  r>   rZ   rL   r  r@   r   rM   r  rS   rC   r  rO   display_namer1   r1   r2   9test_can_unlock_other_users_manual_lock_while_in_workflow!  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  r  r  r   r  r  r  r  r  r  r  )r  r  r>   r  rL   rZ   r@   r   rM   r  rS   r  r1   r1   r2   <test_cannot_unlock_other_users_manual_lock_while_in_workflowC  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  rL   r@   rM   rS   r  r>   rZ   r  r  r  r1   r1   r2   test_workflow_action_menu_itemsf  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_revertrL  Replace current draftr  r  r  r  r  B<button type="submit" class="button action-save warning" disabled>r  r  r  latest_revisionr  r   rO  r3  rL   r@   rM   rS   r  r>   rZ   r  r  rC   Zold_revisionZ
revert_urlrO   r1   r1   r2   .test_workflow_action_menu_items_when_reverting  s    

zGTestSubmitPageToWorkflow.test_workflow_action_menu_items_when_revertingzhttp://admin.example.com)ZWAGTAILADMIN_BASE_URLc                 C   s   |  d | ttjd d }d| j dt| j d}tjD ]}|j|kr@|} qXq@| 	| | 
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   assertInbodyrC   Zworkflow_messageZemail_subjectmsgr1   r1   r2   test_submit_sends_mail  s    



z/TestSubmitPageToWorkflow.test_submit_sends_mailTZ"WAGTAILADMIN_NOTIFICATION_USE_HTMLc                 C   s   |    d S r-   )r  r   r1   r1   r2   test_submit_sends_html_mail  s    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@|} qXq@| 	| | 
d| j dt| j d|j d S )Nr  r  r  r  r  r  r	  r  r1   r1   r2   'test_submit_sends_mail_without_base_url#  s    



z@TestSubmitPageToWorkflow.test_submit_sends_mail_without_base_urlc                 C   s   |    d S r-   )r  r   r1   r1   r2   ,test_submit_sends_html_mail_without_base_urlC  s    zETestSubmitPageToWorkflow.test_submit_sends_html_mail_without_base_urlsendzServer down)Z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   rL   r@   r   )rC   Zmock_fnrO   r1   r1   r2   test_email_send_errorG  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 )NrQ   r  )rr   startr  r  r  r  r  r  r]  r  r   rs   r  r  r  r"   STATUS_NEEDS_CHANGESr  r  )rC   r  r1   r1   r2   test_resume_rejected_workflowT  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 )NrQ   restart-workflow)rr   r  r  r  r  r  r  r  r]  r  r   rs   r  r  r  r"   r  r  STATUS_CANCELLEDr  r  )rC   r  Znew_workflow_stater1   r1   r2   test_restart_rejected_workflowh  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 )
NrQ   r  Tr  r  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)rr   r  r  r  r  r   r  rs   r  r  r  r"   r  r  r]  r  r   rS   r  )rC   r  rO   r1   r1   r2   test_cancel_workflow  s6     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rC   r   Zmsg_headersheadersr1   r1   r2   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&  r1   r1   r2   test_html_email_headers  s    
z0TestSubmitPageToWorkflow.test_html_email_headers)rV   rW   rX   rE   r  r  r  r  r  r  r  r  r  r   r  r  r  r  r   rt  r  r   IOErrorr  r  r   r!  r(  r)  r  r1   r1   r  r2   r    s<   '"#KP



  

 r  c                   @   s   e Zd ZdS )TestSubmitSnippetToWorkflowNrV   rW   rX   r1   r1   r1   r2   r+    s   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  r  r  r  r  r  r  r  r  r  r  r1   r1   r2   r    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 )Nr  rL  r  r  r  r  r  r  r  r  r   r  r1   r1   r2   r  	  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  r  r  r  r  r  r  r  )r  r  r>   rZ   rL   r@   rS   r  r  r1   r1   r2   r  G	  s     


zSTestSubmitSnippetToWorkflowNotLockable.test_submit_for_approval_changes_lock_statuszModel is not lockablec                 C   s   d S r-   r1   r   r1   r1   r2   r  a	  s    zMTestSubmitSnippetToWorkflowNotLockable.test_can_manual_lock_while_in_workflowc                 C   s   d S r-   r1   r   r1   r1   r2   r  e	  s    zTTestSubmitSnippetToWorkflowNotLockable.test_can_unlock_manual_lock_while_in_workflowc                 C   s   d S r-   r1   r   r1   r1   r2   r  i	  s    z`TestSubmitSnippetToWorkflowNotLockable.test_can_unlock_other_users_manual_lock_while_in_workflowc                 C   s   d S r-   r1   r   r1   r1   r2   r  m	  s    zcTestSubmitSnippetToWorkflowNotLockable.test_cannot_unlock_other_users_manual_lock_while_in_workflowN)rV   rW   rX   r'   r   r  r  r  r   r  r  r  r  r1   r1   r1   r2   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TestApproveRejectPageWorkflowrx   c                    s@   t    d| j_d| j_| j  | d | j| jd d S )N	SebastianMitterr  rQ   	r  rE   r  Z
first_name	last_namer   r  r>   rZ   r   r  r1   r2   rE   w	  s    


z#TestApproveRejectPageWorkflow.setUpc                 C   sR   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   rH  r   r.   rj   rr   r   r  r   r  r   r4  r#   r   r1   r1   r2   r  	  s      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 5 | j| X dS )k
        This posts to the approve task view and checks that the object was approved and published
        comment
my commentr  r  ,Approving moderation failed to set live=Truer#  @Approving moderation failed to set has_unpublished_changes=Falser   r   rd   Zsenderr{   N)r   r5  r   Z	MagicMockpublished_signalconnectZ
disconnectr  r   r  r"   r.   for_instancer  r@   r  r   r  STATUS_APPROVEDr  r7  r]  r   r  r^  r  Z
call_countZ
mock_callsr  ZassertIsInstance)rC   Zmock_handlerrO   r  r  Z	mock_callr1   r1   r2   test_approve_task_and_workflow	  s8    
 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 )r6  r7  r8  XMLHttpRequestZHTTP_X_REQUESTED_WITHsuccessr  )stepredirectr9  r:  r#  r;  N)r  ZassertJSONEqualry   r  r  r"   r.   r>  r  r@   r  r   r  r?  r  r7  r]  r   r  r^  r  )rC   rO   r  r  r1   r1   r2   (test_approve_task_and_workflow_with_ajax	  s0     
 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-activateZ	dashboardZ#ActivateWorkflowActionsForDashboard)rL   r@   r   rM   r   ry   r   r   r   r   r   rS   rC   rO   r   Zworkflow_action_jsscriptsscriptr1   r1   r2   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   rH  rI  rJ  r   r   rK  r5   data-confirm-cancellation-urlZconfirm_workflow_cancellation"ActivateWorkflowActionsForEditView)rL   r@   r  r   r   r   ry   r   r   r   r   rS   rL  r1   r1   r2   $test_workflow_action_script_included	  s    
zBTestApproveRejectPageWorkflow.test_workflow_action_script_includedF)Z"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   rH  rI  rJ  r   r   rK  r5   rP  rQ  )rL   r@   r  r   r   r   ry   r   r   r   r   r   rS   rL  r1   r1   r2   @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  rL  r   .wagtailadmin/shared/workflow_action_modal.htmlr   <form action="" method="POST" novalidate>CommentNrL   r@   r  r   r  rO  r  r3  r   r   r   jsonloadsry   ZassertTagInHTMLr  rC   rO   r   r1   r1   r2   test_workflow_action_get
  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  rL  r   N)rL   r  r  r  r  r3  r   r   rN   r1   r1   r2    test_workflow_action_view_bad_id>
  s    z>TestApproveRejectPageWorkflow.test_workflow_action_view_bad_idc                 C   s&   | 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
        rQ   rG   N)r>   r  r  r   rN   r1   r1   r2   &test_workflow_action_view_not_in_groupQ
  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.
        rQ   r  action-cancel-workflowr  r  r  rL  Tr  r   &#x27;z,&#x27; is not currently awaiting moderation.N)r>   r  r  r  rL   r  r  rZ   r   rO  r3  r   rM   r  r   )rC   r  rO   r1   r1   r2   +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
        rQ   r  r_  r  r   r9  N)r>   r  rL   r  r  r   r   r"   r.   r>  r  r@   r  r  )rC   rO   r  r1   r1   r2   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
        r9  N)r  r"   r.   r>  r  r@   r  r   r  r  r  STATUS_REJECTEDr]  r^  r  r  r1   r1   r2   test_reject_task_and_workflow
  s    
z;TestApproveRejectPageWorkflow.test_reject_task_and_workflowc              	   C   s   t d}d|_|  }W 5 Q R X | || 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  r9  )r   rt  ru  r  r   r  r"   r.   r>  r  r@   r  r   r  r  r  rc  r]  r^  r  )rC   Zget_formrO   r  r  r1   r1   r2   *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 5 Q R X | |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_validFrA  rB  r   rT  r9  N)r   rt  ru  r  r   r   r   r"   r.   r>  r  r@   r  ZassertNotEqualr  r  r  rc  r]  r^  r  )rC   is_validrO   r  r  r1   r1   r2   4test_reject_task_and_workflow_with_invalid_form_ajax
  s      
zRTestApproveRejectPageWorkflow.test_reject_task_and_workflow_with_invalid_form_ajaxc                 C   s&   | j | jd |  }| |d dS )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
        rQ   rG   N)r>   r  r  r   rN   r1   r1   r2   0test_workflow_action_view_rejection_not_in_group
  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  rL  r   rT  z)wagtailadmin/shared/non_field_errors.htmlr   rU  rV  rW  NrX  r[  r1   r1   r2   %test_collect_workflow_action_data_get   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
        rj  r  rL  r7  This is my commentr   rD  rC  Zcleaned_dataN)rL   r  r  r   r  rO  r  r3  r   r   rY  rZ  ry   )rC   rO   Zresponse_jsonr1   r1   r2   &test_collect_workflow_action_data_post$  s"    
 zDTestApproveRejectPageWorkflow.test_collect_workflow_action_data_postc              	   C   sb   t d<}d|_| j| jdt| jjd| jj	j
fdddi}W 5 Q R X | || 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
        rf  Frj  r  rL  r7  rl  r  N)r   rt  ru  rL   r  r  r   r  rO  r  r3  r   rC   rg  rO   r1   r1   r2   3test_collect_workflow_action_data_post_invalid_form:  s    
zQTestApproveRejectPageWorkflow.test_collect_workflow_action_data_post_invalid_formc              	   C   sn   t d@}d|_| jj| jdt| jjd| jj	j
fdddidd	}W 5 Q R X | |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
        rf  Frj  r  rL  r7  rl  rA  rB  r   rT  N)r   rt  ru  rL   r  r  r   r  rO  r  r3  r   r   r   rn  r1   r1   r2   8test_collect_workflow_action_data_post_invalid_form_ajaxM  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"}r9  r8  N)r  title_fieldr"   r.   r>  r  r@   r  r   r  r?  r  r7  r]  getattrZget_latest_revision_as_objectr  r1   r1   r2   "test_workflow_action_via_edit_viewd  s,       
z@TestApproveRejectPageWorkflow.test_workflow_action_via_edit_view)rV   rW   rX   r$   r<  rq  rE   r  r   r@  rF  rO  rR  rS  r\  r]  r^  ra  rb  rd  re  rh  ri  rk  rm  ro  rp  rs  r  r1   r1   r  r2   r.  r	  s2   
6*
#( $r.  c                   @   s   e Zd ZeZdZdS ) TestApproveRejectSnippetWorkflowr   N)rV   rW   rX   r%   r<  rq  r1   r1   r1   r2   rt    s   rt  c                   @   s   e Zd ZeZdS )+TestApproveRejectSnippetWorkflowNotLockableNrV   rW   rX   r'   r   r1   r1   r1   r2   ru    s   ru  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   r  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/  r0  r  Tr  rQ   r1  r   r  r1   r2   rE     s    

zTestPageWorkflowReport.setUpc                 C   s   |  || d S r-   )r   rC   Zbreadcrumbsr   r1   r1   r2   assertBreadcrumbs  s    z(TestPageWorkflowReport.assertBreadcrumbsc                 C   s   |  |dj | d S Nrx   )r   r   r   r   rC   r   rx   r1   r1   r2   assertPageTitle  s    z&TestPageWorkflowReport.assertPageTitleNc                 C   s   | j ||S r-   )rL   r@   rC   r   r   r1   r1   r2   r@     s    zTestPageWorkflowReport.getc                 C   sR   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 r3  r4  r   r1   r1   r2   r    s      z/TestPageWorkflowReport.setup_workflow_and_tasksc                    sP   |dkrDt t| }|j d fddtd jd D S |  S )Nrx  r   c                 3   s8   | ]0}t d  jd  D ]}t j||djV  qqdS )r   )rowcolumnN)r   Zmax_rowr2  cellr   )rl   jrm   Z	worksheetr1   r2   	<genexpr>  s    z:TestPageWorkflowReport.get_file_content.<locals>.<genexpr>r   )	r   ioBytesIOgetvaluerh   joinr   
max_columnr  )rC   rO   formatZworkbookr1   r  r2   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hrefr  r   zBy taskz.w-active-filterszWorkflows - WagtailzWorkflow tasksr   zBy workflowzWorkflow tasks - Wagtail)r@   r   workflow_url_namer   r   rM   r{  ry   r   r   header_buttons_parent_selectorr   r7  childrenr   r   r~  workflow_tasks_url_name)rC   rO   r   Zby_task_linkr1   r1   r2   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=truerd   c                 S   s   g | ]}| d qS r  r@   rl   rD  r1   r1   r2   rn     s     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   s   g | ]}| d qS r  r  r  r1   r1   r2   rn   '  s     )r@   r   r  r   r   rM   r   ry   r   r  extra_paramsr   r   r   assertNotInattrsdrilldown_selectorr   r  r>   r  rS   )	rC   rO   r   linksZunfiltered_urlZfiltered_urlr   Zclear_buttoninputsr1   r1   r2   test_workflow_report_filtered  s    











z4TestPageWorkflowReport.test_workflow_report_filteredc              
   C   s   | j D ]}| j|d | t| jd|i}| ||}| |jd | d| | d| | d| | d| | t| j	d|i}| ||}| |jd | d| W 5 Q R X qd S )Nexport_formatexportr   r  r   r  
2020-03-31)
export_formatssubTestr@   r   r  r  r   r   r  r  rC   r  rO   ry   r1   r1   r2   test_workflow_report_exportL  s&    
z2TestPageWorkflowReport.test_workflow_report_exportc              
   C   sx  | j D ]j}| j|dR | | 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 5 Q R X qd S )	Nr  r   )r  r  r   r  r   r  r  )r  r  r>   rZ   r@   r   r  r  r   r   r  r  r  r  r  r1   r1   r2   $test_workflow_report_filtered_exportb  sJ    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  r0   r@   r   r  r   r   rS   rM   r  rN   r1   r1   r2   test_workflow_report_deleted  s    
z3TestPageWorkflowReport.test_workflow_report_deleted)N)rV   rW   rX   r  r  r  r  r  r  rE   r{  r~  r@   r  r  r  r  r  r  r  r  r1   r1   r  r2   rw    s"   
,[,rw  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   rz  r1   r1   r2   r{    s    z/TestPageWorkflowReportResults.assertBreadcrumbsc                 C   s   |  |d d S r|  )r   r   r}  r1   r1   r2   r~    s    z-TestPageWorkflowReportResults.assertPageTitleNc                    s   |pi }d|d< t  ||S )Nr   Z_w_filter_fragment)r  r@   r  r  r1   r2   r@     s    z!TestPageWorkflowReportResults.get)N)rV   rW   rX   r  r  r  r  r  r{  r~  r@   r  r1   r1   r  r2   r    s   r  c                   @   s   e Zd ZdS )TestSnippetWorkflowReportNr,  r1   r1   r1   r2   r    s   r  c                   @   s   e Zd ZdS ) TestSnippetWorkflowReportResultsNr,  r1   r1   r1   r2   r    s   r  c                   @   s   e Zd ZeZdS )$TestNonLockableSnippetWorkflowReportNrv  r1   r1   r1   r2   r    s   r  c                   @   s   e Zd ZeZdS )+TestNonLockableSnippetWorkflowReportResultsNrv  r1   r1   r1   r2   r    s   r  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.comr7   r8   r\   r<   )r  rE   r?   r  r   r.   r@   rA   rB   r,   get_for_userr  superuser_profilemoderator2_profiler  submitter_profile)rC   rc   r  r1   r2   rE     s    
z%TestPageNotificationPreferences.setUpc                 C   sR   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 r3  r4  r   r1   r1   r2   r    s      z8TestPageNotificationPreferences.setup_workflow_and_tasksc                 C   s$   |  | jjd |  | jjd d S )NT)assertIsr  rejected_notificationsapproved_notificationsr   r1   r1   r2   test_vanilla_profile  s    z4TestPageNotificationPreferences.test_vanilla_profileT)Z,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   s   g | ]}d |j kr|qS rv   r  rl   r:   r1   r1   r2   rn     s    
 z[TestPageNotificationPreferences.test_submitted_email_notifications_sent.<locals>.<listcomp>c                 S   s   g | ]}|j D ]}|qqS r1   torl   r:   addressr1   r1   r2   rn     s      c                 S   s   g | ]}d |j kr|qS r   r  r  r1   r1   r2   rn     s    
 c                 S   s   g | ]}|j D ]}|qqS r1   r  r  r1   r1   r2   rn     s      r   r  r   Zwagtailadmin_accountz#tab-notificationsz+Edit your notification preferences here: %sN)r>   r  r  r   r   r
   r
  r  r  rZ   r:   r  r  r  r   r   )rC   task_submission_emails!task_submission_emailed_addressesworkflow_submission_emails%workflow_submission_emailed_addressesZworkflow_submission_email_bodyZaccount_notifications_urlr1   r1   r2   'test_submitted_email_notifications_sent  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   s   g | ]}d |j kr|qS rv   r  r  r1   r1   r2   rn   '  s    
 ziTestPageNotificationPreferences.test_submitted_email_notifications_superuser_settings.<locals>.<listcomp>c                 S   s   g | ]}|j D ]}|qqS r1   r  r  r1   r1   r2   rn   *  s      c                 S   s   g | ]}d |j kr|qS r   r  r  r1   r1   r2   rn   -  s    
 c                 S   s   g | ]}|j D ]}|qqS r1   r  r  r1   r1   r2   rn   0  s      N)r>   r  r  r
   r
  r  r  r:   )rC   r  r  r  r  r1   r1   r2   5test_submitted_email_notifications_superuser_settings   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   s   g | ]}d |j kr|qS r   r  r  r1   r1   r2   rn   H  s    
 z^TestPageNotificationPreferences.test_submit_notification_active_users_only.<locals>.<listcomp>c                 S   s   g | ]}|j D ]}|qqS r1   r  r  r1   r1   r2   rn   K  s      c                 S   s   g | ]}d |j kr|qS rv   r  r  r1   r1   r2   rn   N  s    
 c                 S   s   g | ]}|j D ]}|qqS r1   r  r  r1   r1   r2   rn   Q  s      )r  Z	is_activer   r  r>   r  r  r
   r
  r  r:   rC   r  r  r  r  r1   r1   r2   *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   s   g | ]}d |j kr|qS r   r  r  r1   r1   r2   rn   k  s    
 zbTestPageNotificationPreferences.test_submit_notification_preferences_respected.<locals>.<listcomp>c                 S   s   g | ]}|j D ]}|qqS r1   r  r  r1   r1   r2   rn   n  s      c                 S   s   g | ]}d |j kr|qS rv   r  r  r1   r1   r2   rn   q  s    
 c                 S   s   g | ]}|j D ]}|qqS r1   r  r  r1   r1   r2   rn   t  s      )r  Zsubmitted_notificationsr   r  r>   r  r  r
   r
  r  r  r:   r  r  r1   r1   r2   .test_submit_notification_preferences_respected\  s*    


zNTestPageNotificationPreferences.test_submit_notification_preferences_respectedc                 C   sd   |  | j | d |  | j |   dd tjD }| t|d | 	| jj
|d j d S )Nr  c                 S   s$   g | ]}d |j krd|j kr|qS rr   approvedr  r  r1   r1   r2   rn     s   
 
zOTestPageNotificationPreferences.test_approved_notifications.<locals>.<listcomp>r   r   )r>   r  r  rZ   r  r
   r
  r   r   r  r:   r  rC   Zworkflow_approved_emailsr1   r1   r2   test_approved_notifications}  s    
z;TestPageNotificationPreferences.test_approved_notificationsc                 C   s`   d| j _| j   | | j | d | | j |   dd tj	D }| 
t|d d S )NFr  c                 S   s$   g | ]}d |j krd|j kr|qS r  r  r  r1   r1   r2   rn     s   
 
zeTestPageNotificationPreferences.test_approved_notifications_preferences_respected.<locals>.<listcomp>r   )r  r  r   r>   r  r  rZ   r  r
   r
  r   r   r  r1   r1   r2   1test_approved_notifications_preferences_respected  s    

zQTestPageNotificationPreferences.test_approved_notifications_preferences_respectedc                 C   sd   |  | j | d |  | j |   dd tjD }| t|d | 	| jj
|d j d S )Nr  c                 S   s$   g | ]}d |j krd|j kr|qS rr   rejectedr  r  r1   r1   r2   rn     s   
 
zOTestPageNotificationPreferences.test_rejected_notifications.<locals>.<listcomp>r   r   )r>   r  r  rZ   r  r
   r
  r   r   r  r:   r  rC   Zworkflow_rejected_emailsr1   r1   r2   test_rejected_notifications  s    
z;TestPageNotificationPreferences.test_rejected_notificationsc                 C   s`   d| j _| j   | | j | d | | j |   dd tj	D }| 
t|d d S )NFr  c                 S   s$   g | ]}d |j krd|j kr|qS r  r  r  r1   r1   r2   rn     s   
 
zdTestPageNotificationPreferences.test_rejected_notification_preferences_respected.<locals>.<listcomp>r   )r  r  r   r>   r  r  rZ   r  r
   r
  r   r   r  r1   r1   r2   0test_rejected_notification_preferences_respected  s    

zPTestPageNotificationPreferences.test_rejected_notification_preferences_respected)rV   rW   rX   rE   r  r  r   r  r  r  r  r  r  r  r  r  r1   r1   r  r2   r    s   
1

!
 r  Tr  c                   @   s   e Zd ZdS )#TestPageNotificationPreferencesHTMLNr,  r1   r1   r1   r2   r    s   r  c                       s   e Zd Z fddZ  ZS )"TestSnippetNotificationPreferencesc                    s"   t    | jj| j| j d S r-   )r  rE   r  r   rB   r  r  r   r  r1   r2   rE     s
    
z(TestSnippetNotificationPreferences.setUp)rV   rW   rX   rE   r  r1   r1   r  r2   r    s   r  c                   @   s   e Zd ZdS )&TestSnippetNotificationPreferencesHTMLNr,  r1   r1   r1   r2   r    s   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:disablerL  r   Fr   r  r   r   )Zworkflow_state__workflowr  N)r>   r  r  r  r  rL   r   rr   rO  r   r   r]  r  rh   r"   r.   r>  r  r4  r  r5  r  r   rC   rO   Zstatesr1   r1   r2   test_disable_workflow  s8    

  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  rL  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  rL   r@   r   rr   rO  r   r   r   rM   r   ry   rN   r1   r1   r2   'test_get_disable_workflow_shows_warning  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  rL  r   r  zThis workflow is in progresszDDisabling this workflow will cancel moderation on this page/snippet.N)r>   r  rL   r@   r   rr   rO  r   r   r   rS   r   ry   rN   r1   r1   r2   $test_get_disable_workflow_no_warning  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_taskrL  z0wagtailadmin/workflows/confirm_disable_task.htmlZ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.Z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  rL   r@   r   r  rO  r   r   r   rM   r   ry   r   r.   rj   r   r  r   r4  r  rS   r0   )rC   rO   Zunused_taskr1   r1   r2   test_disable_task_view  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  rL  r   Frv   r  r   r   N)r>   r  r  r  rL   r   r  rO  r   r   r]  r  rh   r   r.   r>  r  r4  r6  r  r5  r  r  r  rs   r  r  r  r1   r1   r2   test_disable_taskE  s$    

z"TestDisableViews.test_disable_taskc                 C   sd   |  | j d| j_| j  | jtd| jjfd}| 	|j
d | j  | | jjd d S )NFrU  rL  r   T)r>   r  rr   rh   r   rL   r  r   rO  r   r   r]  r  rN   r1   r1   r2   test_enable_workflow]  s    

z%TestDisableViews.test_enable_workflowc                 C   s   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   r]   r^   rU  rL  r   T)r  r   r   r   rB   r   r.   r@   r>   rr   rh   rL   r  r   rO  r   r   r]  r  rN   r1   r1   r2   (test_enable_workflow_minimal_permissionsi  s$    


z9TestDisableViews.test_enable_workflow_minimal_permissionsc                 C   s   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   rU  rL  r   )r  r   r   r   rB   r   r.   r@   r>   rr   rh   rL   r  r   rO  r   r]  r  rN   r1   r1   r2   #test_enable_workflow_no_permissions~  s"    


z4TestDisableViews.test_enable_workflow_no_permissionsc                 C   sd   |  | j d| j_| j  | jtd| jjfd}| 	|j
d | j  | | jjd d S )NFr  rL  r   T)r>   r  r  rh   r   rL   r  r   rO  r   r   r]  r  rN   r1   r1   r2   test_enable_task  s    

z!TestDisableViews.test_enable_taskc                 C   s   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   r  r^   r  rL  r   T)r  r   r   r   rB   r   r.   r@   r>   r  rh   rL   r  r   rO  r   r   r]  r  rN   r1   r1   r2   $test_enable_task_minimal_permissions  s$    


z5TestDisableViews.test_enable_task_minimal_permissionsc                 C   s   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  rL  r   )r  r   r   r   rB   r   r.   r@   r>   r  rh   rL   r  r   rO  r   r]  r  rN   r1   r1   r2   test_enable_task_no_permissions  s"    


z0TestDisableViews.test_enable_task_no_permissionsN)rV   rW   rX   r  r  r  r  r  r  r  r  r  r  r  r1   r1   r1   r2   r    s   *r  c                   @   s   e Zd ZdS )$TestDisableViewsWithSnippetWorkflowsNr,  r1   r1   r1   r2   r    s   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  rE   edit_objectrr   r  r  r  r>   rZ   r   r  r1   r2   rE     s    
zTestPageWorkflowPreview.setUpc                 C   s   | j | j_| j  d S r-   )new_contentr  rx   r  r   r1   r1   r2   r    s    
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_previewrL  r   )r  r   r  rO  r  r3  rL   r@   r   r   r   preview_templaterM   preview_contentrC   Zpreview_urlrO   r1   r1   r2   test_preview_workflow  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  rL  zEdit this pagezwagtailadmin_pages:edit)
r  r   r  rO  r  r3  rL   r@   rM   r   r  r1   r1   r2   /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  rL  r   )r>   r  r  r   r  rO  r  r3  rL   r@   r   r   r  r1   r1   r2   "test_preview_workflow_by_submitter  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  rL  Tr  r   r  r`  z:&#x27; is not currently awaiting moderation in task &#x27;z&#x27;.)r  r   r  rO  r  r3  rL   r@   r   r   rM   r  r   r=   r  r  r1   r1   r2   !test_preview_workflow_bad_task_id  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  {   rL  r   )
r  r   r  rO  rL   r@   r   r   r  r3  r  r1   r1   r2   %test_preview_workflow_nonexistent_ids  s    z=TestPageWorkflowPreview.test_preview_workflow_nonexistent_ids)rV   rW   rX   r  r  r  rE   r  r  r  r  r  r  r  r1   r1   r  r2   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   s   | j | j_| j  d S r-   )r  r  r   r  r   r1   r1   r2   r     s    
z&TestSnippetWorkflowPreview.edit_objectc                    s   t    d S r-   )r  r  r   r  r1   r2   r  $  s    zJTestSnippetWorkflowPreview.test_preview_workflow_show_edit_link_in_userbar)	rV   rW   rX   r  r  r  r   r  r  r1   r1   r  r2   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 fooFrg   )r>   r   r.   rj   Ztask_enabledZtask_disabledr   r1   r1   r2   rE   +  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   s   g | ]
}|j qS r1   r<   rl   rs   r1   r1   r2   rn   J  s     z0TestTaskChooserView.test_get.<locals>.<listcomp>r8  r  zModerators approval)rL   r@   r   r   r   r   assertTemplateNotUsedr^  r   is_searchingr   rN   r1   r1   r2   r  3  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  Zquery_stringr
  c                 S   s   g | ]
}|j qS r1   r<   r  r1   r1   r2   rn   _  s     z3TestTaskChooserView.test_search.<locals>.<listcomp>r8  r  )rL   r@   r   r   r   r   r  r   r   r  r   rN   r1   r1   r2   r   N  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  )
rL   r@   r   r   r   r   r  r^  r   r  rN   r1   r1   r2   r   c  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  )rL   r@   r   r   r   r   r  rN   r1   r1   r2   #test_get_with_create_model_selecteds  s     z7TestTaskChooserView.test_get_with_create_model_selectedc                 C   s&   | j tdd }| |jd d S )Nr  ?create_model=wagtailcore.Pager   rL   r@   r   r   r   rN   r1   r1   r2   ,test_get_with_non_task_create_model_selected  s    z@TestTaskChooserView.test_get_with_non_task_create_model_selectedc                 C   s&   | j tdd }| |jd d S )Nr  ?create_model=wagtailcore.Taskr   r  rN   r1   r1   r2   -test_get_with_base_task_create_model_selected  s    zATestTaskChooserView.test_get_with_base_task_create_model_selectedrs  c                 C   sN   t g|_| jtd}| |jd | |d | |d | |d d S )Nr  r   r  r  r  )	r   ru  rL   r@   r   r   r   r   r  r  r1   r1   r2   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)r2  r   r.   r@   r3  r   r1   r1   r2   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
  Trg   task_chosenr  rL  r3  r=   r  rD  result)rL   r  r   r  r   r   r   r.   r@   rY  r3  )rC   rO   rs   r1   r1   r2   $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
  Trg   r  r  rL  r  r  )r   ru  rL   r  r   r  r   r   r   r.   r@   rY  r3  )rC   rv  rO   rs   r1   r1   r2    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
  Trg   rL   r  r   r  r   r   r^  r   r.   r4  r_  rN   r1   r1   r2   'test_post_without_create_model_selected  s     z;TestTaskChooserView.test_post_without_create_model_selectedc                 C   sF   | j tdd |  }| |jd | tjj	ddd
  d S )Nr  r  r   r
  Trg   r  rN   r1   r1   r2   -test_post_with_non_task_create_model_selected  s    zATestTaskChooserView.test_post_with_non_task_create_model_selectedc                 C   sF   | j tdd |  }| |jd | tjj	ddd
  d S )Nr  r  r   r
  Trg   r  rN   r1   r1   r2   .test_post_with_base_task_create_model_selected  s    zBTestTaskChooserView.test_post_with_base_task_create_model_selectedN)rV   rW   rX   rE   r  r   r   r  r  r  r   rt  r	  r  r  r  r  r  r  r1   r1   r1   r2   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 )Nrp   r<   )r3   r>   r)   r.   rj   rs   r   r1   r1   r2   rE     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_chosenrL  r   zContent-Typezapplication/jsonr  rp   )r  r3  r=   r  )r  rD  )rL   r@   r   rs   r3  r   r   rY  rN   r1   r1   r2   r    s"     z"TestTaskChooserChosenView.test_getNrV   rW   rX   rE   r  r1   r1   r1   r2   r    s   r  c                   @   s   e Zd Zdd Zdd ZdS )TestWorkflowUsageViewc                 C   sr   |    tj | _tjjdd| _tjjdd| _| jjt	dddd| _
tjjdd	| _| jjj| j
d
 d S )Nr   re   rd   zAnother pagezI'm another pagerw   rz   zAnother workflowr<   )r}   )r>   r   r.   r@   rr   r   r  r   r~   r(    child_page_with_another_workflowrj   Zanother_workflowr   r   r1   r1   r2   rE   2  s    
zTestWorkflowUsageView.setUpc                 C   sr   | j td| jjgd}| |jd dd |jd jD }| 	| j
j| | 	| jj| | | jj| d S )Nzwagtailadmin_workflows:usagerL  r   c                 S   s   h | ]
}|j qS r1   r  )rl   r}   r1   r1   r2   	<setcomp>H  s     z1TestWorkflowUsageView.test_get.<locals>.<setcomp>Zused_by)rL   r@   r   rr   r3  r   r   r   r   r  r  r   r  r  )rC   rO   Z
object_setr1   r1   r2   r  A  s    zTestWorkflowUsageView.test_getNr  r1   r1   r1   r2   r  1  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  rE   r>   r  r   r  r1   r2   rE   P  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   rH  r  r;   rd   )r   r.   rj   rr   r   r  r   r  r   r4  r#   r  r   r1   r1   r2   r  T  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  r7  next)r  r  r  )rC   r  r  r1   r2   r  b  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  r  zid="workflow-status-dialog"r  z6In progress
        </span>
                        {}z6Not started
        </span>
                        {}history)rL   r@   r  ry   r  r  r  r  r  r  r=   r  r[  r1   r1   r2   test_workflow_status_modall  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  r  r   id="status-sidebar-draft"r  r  r  r  r  zChanges requestedzid="status-sidebar-live")r>   r  rL   r@   r  rM   r  r  r  r  ry   r  r  r=   r  r  rN   r1   r1   r2   "test_status_through_workflow_cycle  s6    








z9TestPageWorkflowStatus.test_status_through_workflow_cyclec                 C   s6   |  d |  d | j| d}| |d d S )Nr  r  r  r!  )r  rL   r@   r  rM   rN   r1   r1   r2   test_status_after_cancel  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  r  r  r  r  r  )r  r  r  ry   r  r  r=   rL   r@   r  r  rN   r1   r1   r2   test_status_after_restart  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  r  r  r  )r  r  rL   r@   r  r  ry   r  rN   r1   r1   r2   (test_workflow_status_modal_task_comments  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  r  )
r  r>   r  rL   r@   r  r  rM   rS   rZ   rC   rO   needler1   r1   r2   !test_workflow_edit_locked_message  s    
z8TestPageWorkflowStatus.test_workflow_edit_locked_message)rV   rW   rX   rE   r  r  r   r"  r#  r$  r%  r)  r  r1   r1   r  r2   r  N  s   
$r  c                   @   s   e Zd ZdS )TestSnippetWorkflowStatusNr,  r1   r1   r1   r2   r*    s   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 editr  )	r  r>   r  rL   r@   r  rS   rM   rZ   r'  r1   r1   r2   r)    s    
zFTestSnippetWorkflowStatusNotLockable.test_workflow_edit_locked_messageN)rV   rW   rX   r'   r   r)  r1   r1   r1   r2   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 )Nrd   re   )r}   Zrestriction_type)	r  rE   r   r.   r4  r  r   rj   ZLOGIN)rC   Zhomepager  r1   r2   rE     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  rL   r@   r   r   r   rM   rN   r1   r1   r2   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   rG  Compare with live versionCompare with previous version)r>   r  r  rZ   rL   r@   r   r   r   rM   rS   rN   r1   r1   r2   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   rG  Zrevisions_comparer  rL  za[href='rJ  r/  r0  )r  r  publishr>   r  r  r]  r  rZ   rL   r@   r   r   r   rM   r   ry   r  rO  r3  r   r   r   r   )
rC   Zlive_revisionZprevious_revisionr  rO   r   Zcompare_with_live_urlZcompare_with_previous_urlZcompare_with_live_linkZcompare_with_previous_linkr1   r1   r2   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-  rG  )r>   r  r  r  r0   rL   r@   r   r   r   rS   rZ   rN   r1   r1   r2   2test_dashboard_after_deleting_object_in_moderation=  s    

zITestDashboardWithPages.test_dashboard_after_deleting_object_in_moderation)	rV   rW   rX   rE   r.  r1  r3  r4  r  r1   r1   r  r2   r,    s
   	)r,  c                   @   s   e Zd ZdS )TestDashboardWithSnippetsNr,  r1   r1   r1   r2   r5  N  s   r5  c                   @   s   e Zd ZeZdS )$TestDashboardWithNonLockableSnippetsNrv  r1   r1   r1   r2   r6  R  s   r6  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                    s   t    | j  d S r-   r  r   r  r1   r2   rE   [  s    
z$TestWorkflowStateEmailNotifier.setUpc              
   C   sd   | j j| j| jd | jj}t t fD ]6}| d|  | |	|| jh W 5 Q R X q(d S NrQ   Testing with )
rr   r  r  r  r  r   r   r  assertSetEqualget_recipient_usersrC   r  notifierr1   r1   r2   Ntest_workflowstate_email_notifier_get_recipient_users__without_triggering_user`  s     zmTestWorkflowStateEmailNotifier.test_workflowstate_email_notifier_get_recipient_users__without_triggering_userc              
   C   sj   | j j| j| jd | jj}t t fD ]<}| d| " | |j	|| j
d| jh W 5 Q R X q(d S r8  )rr   r  r  r  r  r   r   r  r:  r;  rZ   r<  r1   r1   r2   Ktest_workflowstate_email_notifier_get_recipient_users__with_triggering_usero  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 ]N}| 	d| 4 | 
||t  | 
|j|| jdt  W 5 Q R X q<d S NrQ   r  Zupdate_fieldsr9  )rr   r  r  r  r  r  r   r   r   r  r:  r;  r  rZ   r<  r1   r1   r2   Ktest_workflowstate_email_notifier_get_recipient_users__without_requested_by  s    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 ]N}| 	d| 4 | 
||t  | 
|j|| jdt  W 5 Q R X q<d S r@  )rr   r  r  r  r  r  r   r   r   r  r:  r;  r  r<  r1   r1   r2   atest_workflowstate_email_notifier_get_recipient_users__with_same_requested_by_and_triggering_user  s    zTestWorkflowStateEmailNotifier.test_workflowstate_email_notifier_get_recipient_users__with_same_requested_by_and_triggering_userzEwagtail.admin.mail.BaseWorkflowStateEmailNotifier.get_recipient_usersc              
   C   s*  t  }t |_| || jt  d h|_| || jt  | jh|_dddg}|D ]@}| d| d$ ||_| || j| jh W 5 Q R X qZt	
| j}g }|D ]$}| d}t||d || q|j|d |D ]>}| d| d" ||_| || jt  W 5 Q R X qd S )Nr  r  Z	submittedr9  Z_notificationsFrA  )r   r  ru  r:  Zget_valid_recipientsr  r  r  notificationr,   r  setattrappendr   )rC   Zmock_get_recipient_usersr=  ZnotificationsrD  ZuserprofileZupdated_fields	attributer1   r1   r2   ;test_base_workflowstate_email_notifier_get_valid_recipients  s2    


 
zZTestWorkflowStateEmailNotifier.test_base_workflowstate_email_notifier_get_valid_recipients)rV   rW   rX   rE   r>  r?  rB  rC  r   rt  rH  r  r1   r1   r  r2   r7  Z  s   r7  )or  rY  r  Zunittestr   r   r   Zdjango.confr   Zdjango.contrib.admin.utilsr   Zdjango.contrib.auth.modelsr   r   Z"django.contrib.contenttypes.modelsr	   Zdjango.corer
   Zdjango.core.mailr   Zdjango.testr   r   Zdjango.urlsr   Z	freezegunr   Zopenpyxlr   Zwagtail.admin.admin_url_finderr   Zwagtail.admin.mailr   r   r   Zwagtail.admin.staticfilesr   Zwagtail.admin.utilsr   r   r   Zwagtail.modelsr   r   r   r   r   r   r   r    r!   r"   r#   Zwagtail.signalsr$   r%   Zwagtail.test.testapp.modelsr&   r'   r(   r)   Zwagtail.test.utilsr*   Z!wagtail.test.utils.template_testsr+   Zwagtail.users.modelsr,   r3   r4   rY   r   r  r  rF  ra  rd  r  r  r  r  r  r  r+  r-  r.  rt  ru  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r*  r+  r,  r5  r6  r7  r1   r1   r1   r2   <module>   s   4$ c2 Y  K;  ]( 	c:    * 1    
   
 
 

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