a
    Døg\Ë  ã                   @   s  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	 d dl
mZmZ d dlmZmZ d dlmZmZmZmZmZ d d	lmZ d d
lmZ d dlmZmZmZmZ d dlm Z  G dd„ deƒZ!G dd„ deƒZ"G dd„ deƒZ#G dd„ de eƒZ$G dd„ de eƒZ%G dd„ deƒZ&dS )é    )ÚStringIO)Úmock)Úget_user_model)ÚContentType)Ú
management)ÚCountÚQ)ÚTestCaseÚTransactionTestCase)ÚLocaleÚPageÚPageViewRestrictionÚSiteÚWorkflow)Ú	MATCH_ALL)Úpage_unpublished)Ú	EventPageÚ
SimplePageÚSingleEventPageÚ
StreamPage)ÚWagtailTestUtilsc                   @   sb  e Zd ZdgZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dVS )WÚTestPageQuerySetú	test.jsonc                 C   sJ   t j ¡ }|D ]}|  |j¡ qt jjdd}|  |j|jd ¡ ¡ d S )Nú/home/©Úurl_path©Úid)r   ÚobjectsÚliveÚ
assertTrueÚgetÚfilterr   Úexists)ÚselfÚpagesÚpageÚhomepage© r(   ú_/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/tests/test_page_queryset.pyÚ	test_live   s
    
zTestPageQuerySet.test_livec                 C   sJ   t j ¡ }|D ]}|  |j¡ qt jjdd}|  |j|jd 	¡ ¡ d S )Nú!/home/events/someone-elses-event/r   r   )
r   r   Znot_liveÚassertFalser   r!   r    r"   r   r#   ©r$   r%   r&   Úeventr(   r(   r)   Útest_not_live$   s
    
zTestPageQuerySet.test_not_livec                 C   sJ   t j ¡ }|D ]}|  |j¡ qt jjdd}|  |j|jd ¡ ¡ d S ©Nú/home/events/r   r   )	r   r   Úin_menur    Úshow_in_menusr!   r"   r   r#   )r$   r%   r&   Úevents_indexr(   r(   r)   Útest_in_menu/   s
    
zTestPageQuerySet.test_in_menuc                 C   s:   t j ¡ }|D ]}|  |j¡ q|  |jdd ¡ ¡ d S )Né   r   )r   r   Znot_in_menur,   r3   r    r"   r#   ©r$   r%   r&   r(   r(   r)   Útest_not_in_menu:   s    
z!TestPageQuerySet.test_not_in_menuc                 C   s>   t jjdd}t j |¡}|  | ¡ d¡ |  | ¡ |¡ d S ©Nr   r   r6   )r   r   r!   r&   ÚassertEqualÚcountÚfirst)r$   r'   r%   r(   r(   r)   Ú	test_pageD   s    zTestPageQuerySet.test_pagec                 C   sR   t jjdd}t j |¡}|  | ¡ t j ¡  ¡ d ¡ |D ]}|  ||¡ q<d S r9   )r   r   r!   Znot_pager:   r;   ÚallÚassertNotEqual©r$   r'   r%   r&   r(   r(   r)   Útest_not_pageL   s
    zTestPageQuerySet.test_not_pagec                 C   sD   t jjdd}t j |¡}|D ] }|  | ¡ j|jd ¡ ¡ qd S r0   ©	r   r   r!   Zdescendant_ofr    Úget_ancestorsr"   r   r#   ©r$   r4   r%   r&   r(   r(   r)   Útest_descendant_ofU   s    z#TestPageQuerySet.test_descendant_ofc                 C   sh   t jjdd}t jj|dd}|D ](}|  ||kpF| ¡ j|jd ¡ ¡ q"|  |j|jd ¡ ¡ d S ©Nr1   r   T©Z	inclusiver   rB   rD   r(   r(   r)   Útest_descendant_of_inclusive]   s    þz-TestPageQuerySet.test_descendant_of_inclusivec                 C   s\   t jjdd}t j |¡}|D ] }|  | ¡ j|jd ¡ ¡ q|  	|j|jd ¡ ¡ d S r0   )
r   r   r!   Únot_descendant_ofr,   rC   r"   r   r#   r    rD   r(   r(   r)   Útest_not_descendant_ofk   s
    z'TestPageQuerySet.test_not_descendant_ofc                 C   s`   t jjdd}t jj|dd}|D ] }|  | ¡ j|jd ¡ ¡ q"|  |j|jd ¡ ¡ d S rF   )	r   r   r!   rI   r,   rC   r"   r   r#   rD   r(   r(   r)   Ú test_not_descendant_of_inclusivev   s
    z1TestPageQuerySet.test_not_descendant_of_inclusivec                 C   s8   t jjdd}t j |¡}|D ]}|  | ¡ |¡ qd S )Nr   r   )r   r   r!   Zchild_ofr:   Ú
get_parentr@   r(   r(   r)   Útest_child_of   s    zTestPageQuerySet.test_child_ofc                 C   s8   t jjdd}t j |¡}|D ]}|  | ¡ |¡ qd S )Nr1   r   )r   r   r!   Znot_child_ofr?   rL   rD   r(   r(   r)   Útest_not_child_of‰   s    z"TestPageQuerySet.test_not_child_ofc                 C   sj   t jjdd}t jjdd}t jjdd}t j |¡}|  | ¡ d¡ |  |d |¡ |  |d |¡ d S )Nr6   r   r   r   r1   é   r   ©r   r   r!   Zancestor_ofr:   r;   ©r$   Ú	root_pager'   r4   r%   r(   r(   r)   Útest_ancestor_of‘   s    z!TestPageQuerySet.test_ancestor_ofc                 C   s~   t jjdd}t jjdd}t jjdd}t jj|dd}|  | ¡ d¡ |  |d	 |¡ |  |d |¡ |  |d
 |¡ d S )Nr6   r   r   r   r1   TrG   é   r   rO   rP   rQ   r(   r(   r)   Útest_ancestor_of_inclusive›   s    z+TestPageQuerySet.test_ancestor_of_inclusivec                 C   st   t jjdd}t jjdd}t jjdd}t j |¡}|D ]}|  ||¡ |  ||¡ q:|  |j|jd ¡ ¡ d S )Nr6   r   r   r   r1   )	r   r   r!   Únot_ancestor_ofr?   r    r"   r   r#   ©r$   rR   r'   r4   r%   r&   r(   r(   r)   Útest_not_ancestor_of¦   s    z%TestPageQuerySet.test_not_ancestor_ofc                 C   sl   t jjdd}t jjdd}t jjdd}t jj|dd}|D ](}|  ||¡ |  ||¡ |  ||¡ q>d S )Nr6   r   r   r   r1   TrG   )r   r   r!   rV   r?   rW   r(   r(   r)   Útest_not_ancestor_of_inclusive´   s    z/TestPageQuerySet.test_not_ancestor_of_inclusivec                 C   sL   t jjdd}t jjdd}t j |¡}|  | ¡ d¡ |  |d |¡ d S )Nr   r   r1   r6   r   )r   r   r!   Z	parent_ofr:   r;   )r$   r'   r4   r%   r(   r(   r)   Útest_parent_ofÀ   s
    zTestPageQuerySet.test_parent_ofc                 C   sZ   t jjdd}t jjdd}t j |¡}|D ]}|  ||¡ q,|  |j|jd ¡ ¡ d S )Nr   r   r1   r   )	r   r   r!   Znot_parent_ofr?   r    r"   r   r#   )r$   r'   r4   r%   r&   r(   r(   r)   Útest_not_parent_ofÉ   s    z#TestPageQuerySet.test_not_parent_ofc                 C   s^   t jjdd}t jjdd}t j |¡}|D ]}|  | ¡ |¡ q,|  |j|jd 	¡ ¡ dS )zx
        sibling_of should default to an inclusive definition of sibling
        if 'inclusive' flag not passed
        r1   r   ú/home/events/christmas/r   N©
r   r   r!   Ú
sibling_ofr:   rL   r    r"   r   r#   ©r$   r4   r.   r%   r&   r(   r(   r)   Útest_sibling_of_defaultÕ   s    z(TestPageQuerySet.test_sibling_of_defaultc                 C   sb   t jjdd}t jjdd}t jj|dd}|D ]}|  | ¡ |¡ q0|  |j|jd 	¡ ¡ d S ©Nr1   r   r\   FrG   r   )
r   r   r!   r^   r:   rL   r,   r"   r   r#   r_   r(   r(   r)   Útest_sibling_of_exclusiveå   s    z*TestPageQuerySet.test_sibling_of_exclusivec                 C   sb   t jjdd}t jjdd}t jj|dd}|D ]}|  | ¡ |¡ q0|  |j|jd 	¡ ¡ d S ©Nr1   r   r\   TrG   r   r]   r_   r(   r(   r)   Útest_sibling_of_inclusiveñ   s    z*TestPageQuerySet.test_sibling_of_inclusivec                 C   sv   t jjdd}t jjdd}t j |¡}|D ]}|  | ¡ |¡ q,|  |j|jd 	¡ ¡ |  
|j|jd 	¡ ¡ dS )zµ
        not_sibling_of should default to an inclusive definition of sibling -
        i.e. eliminate self from the results as well -
        if 'inclusive' flag not passed
        r1   r   r\   r   N©r   r   r!   Únot_sibling_ofr?   rL   r,   r"   r   r#   r    r_   r(   r(   r)   Útest_not_sibling_of_defaultý   s    z,TestPageQuerySet.test_not_sibling_of_defaultc                 C   s‚   t jjdd}t jjdd}t jj|dd}|D ]}||kr0|  | ¡ |¡ q0|  |j|jd 	¡ ¡ |  |j|jd 	¡ ¡ d S ra   )
r   r   r!   rf   r?   rL   r    r"   r   r#   r_   r(   r(   r)   Útest_not_sibling_of_exclusive  s    z.TestPageQuerySet.test_not_sibling_of_exclusivec                 C   sz   t jjdd}t jjdd}t jj|dd}|D ]}|  | ¡ |¡ q0|  |j|jd 	¡ ¡ |  
|j|jd 	¡ ¡ d S rc   re   r_   r(   r(   r)   Útest_not_sibling_of_inclusive!  s    z.TestPageQuerySet.test_not_sibling_of_inclusivec                 C   s\   t j t¡}|D ]}|  |jt¡ qt jjdd}|  ||¡ t jjdd}|  ||¡ d S ©Nr+   r   ú/home/events/saint-patrick/)r   r   Útyper   ÚassertIsInstanceÚspecificr!   ÚassertInr-   r(   r(   r)   Ú	test_type0  s    zTestPageQuerySet.test_typec                 C   s|   t j tt¡}|D ]}|  |jttf¡ qt jjdd}|  ||¡ t jjdd}|  ||¡ t jjdd}|  ||¡ d S )Nr+   r   rk   ú/home/about-us/)	r   r   rl   r   r   rm   rn   r!   ro   ©r$   r%   r&   r.   Úabout_usr(   r(   r)   Útest_type_with_multiple_models@  s    z/TestPageQuerySet.test_type_with_multiple_modelsc                 C   s\   t j t¡}|D ]}|  |jt¡ qt jjdd}|  ||¡ t jjdd}|  ||¡ d S ©Nrq   r   r   )r   r   Únot_typer   ÚassertNotIsInstancern   r!   ro   ©r$   r%   r&   rs   r'   r(   r(   r)   Útest_not_typeT  s    zTestPageQuerySet.test_not_typec                 C   sb   t j tt¡}|D ]}|  |jttf¡ qt jjdd}|  ||¡ t jjdd}|  	||¡ d S ru   )
r   r   rv   r   r   rw   rn   r!   ÚassertNotInro   rx   r(   r(   r)   Ú"test_not_type_with_multiple_modelsc  s    z3TestPageQuerySet.test_not_type_with_multiple_modelsc                 C   s\   t j t¡}|D ]}|  |jt¡ qt jjdd}|  ||¡ t jjdd}|  ||¡ d S rj   )	r   r   Ú
exact_typer   ÚassertIsÚspecific_classr!   ro   rz   )r$   r%   r&   r.   Úsingle_eventr(   r(   r)   Útest_exact_typer  s    z TestPageQuerySet.test_exact_typec                 C   s–   t j tt ¡}|D ]}|  |jtt f¡ qt jjdd}|  ||¡ t jjdd}|  ||¡ t jjdd}|  ||¡ t jjdd}|  ||¡ d S )Nr+   r   rk   r   rq   )r   r   r|   r   ro   r~   r!   rz   )r$   r%   r&   r.   r   r'   rs   r(   r(   r)   Ú$test_exact_type_with_multiple_models‚  s    z5TestPageQuerySet.test_exact_type_with_multiple_modelsc                 C   s\   t j t¡}|D ]}|  |jt¡ qt jjdd}|  ||¡ t jjdd}|  ||¡ d S )Nr   r   rk   )r   r   Únot_exact_typer   ZassertIsNotr~   r!   ro   )r$   r%   r&   r'   r.   r(   r(   r)   Útest_not_exact_type›  s    z$TestPageQuerySet.test_not_exact_typec                 C   sb   t j tt ¡}|D ]}|  |jtt f¡ qt jjdd}|  ||¡ t jjdd}|  ||¡ d S )Nrk   r   rq   )r   r   r‚   r   rz   r~   r!   ro   rr   r(   r(   r)   Ú(test_not_exact_type_with_multiple_models«  s    z9TestPageQuerySet.test_not_exact_type_with_multiple_modelsc                 C   sº   t jjdd}t jjdd}t jjdd}tjj|dd |  d¡b t j ¡ }|  |j|j	d 
¡ ¡ |  |j|j	d 
¡ ¡ |  |j|j	d 
¡ ¡ W d   ƒ n1 s¬0    Y  d S ©	Nr1   r   r\   r   Zhello)r&   Úpasswordé   r   )r   r   r!   r   ÚcreateÚassertNumQueriesÚpublicr    r"   r   r#   r,   ©r$   r4   r.   r'   r%   r(   r(   r)   Útest_public¼  s    
zTestPageQuerySet.test_publicc                 C   sº   t jjdd}t jjdd}t jjdd}tjj|dd |  d¡b t j ¡ }|  |j|j	d 
¡ ¡ |  |j|j	d 
¡ ¡ |  |j|j	d 
¡ ¡ W d   ƒ n1 s¬0    Y  d S r…   )r   r   r!   r   rˆ   r‰   Z
not_publicr,   r"   r   r#   r    r‹   r(   r(   r)   Útest_not_publicÑ  s    
z TestPageQuerySet.test_not_publicc                 C   sº   t jjdd}t jjdd}t jjdd}tjj|dd |  d¡b t j ¡ }|  |j|j	d 
¡ ¡ |  |j|j	d 
¡ ¡ |  |j|j	d 
¡ ¡ W d   ƒ n1 s¬0    Y  d S r…   )r   r   r!   r   rˆ   r‰   Úprivater,   r"   r   r#   r    r‹   r(   r(   r)   Útest_privateæ  s    
zTestPageQuerySet.test_privatec                 C   s,   t j ¡  ¡  tj ¡  ¡ }|  |d¡ d S ©Nr   )r   r   r>   Údeleter   rŽ   r;   r:   )r$   r;   r(   r(   r)   Ú!test_private_with_no_private_pageû  s    z2TestPageQuerySet.test_private_with_no_private_pagec                 C   s4   t j t¡}tƒ }||O }|  t j |¡ ¡ ¡ d S ©N)r   r   Útype_qr   r   r    r"   r#   )r$   r”   Úqueryr(   r(   r)   Útest_merge_queries  s    z#TestPageQuerySet.test_merge_queriesc                 C   s$   t j ¡  ¡  |  t j ¡ d¡ d S r   )r   r   r>   r‘   r:   r;   ©r$   r(   r(   r)   Útest_delete_queryset	  s    z%TestPageQuerySet.test_delete_querysetc                 C   s8   |   t¡ tj ¡  W d   ƒ n1 s*0    Y  d S r“   )ÚassertRaisesÚAttributeErrorr   r   r‘   r—   r(   r(   r)   Ú'test_delete_is_not_available_on_manager  s    z8TestPageQuerySet.test_delete_is_not_available_on_managerc                 C   sä   t jjdd}tjjdd}t jjdd}|jt dd||jd	d
}|  d¡. t j |¡}|  	t
|ƒ|g¡ W d   ƒ n1 s‚0    Y  |  d¡: t jj|dd d¡}|  	t
|ƒ||g¡ W d   ƒ n1 sÖ0    Y  d S )Nr   r   Úfr©Zlanguage_coder6   ©ÚdepthúFrench homepageúhome-fr©ÚtitleÚslugÚlocaleÚtranslation_key©ÚinstanceTrG   r   )r   r   r!   r   rˆ   Ú	add_childr¦   r‰   Ztranslation_ofZassertListEqualÚlistÚorder_by)r$   Úen_homepageÚ	fr_localerR   Úfr_homepageÚtranslationsr(   r(   r)   Útest_translation_of  s*    üÿ	0ÿþz$TestPageQuerySet.test_translation_ofc                 C   s,  t jjdd}tjjdd}t jjdd}|jt dd||jd	d
}|  d¡  tt j 	|¡ƒ}W d   ƒ n1 st0    Y  t j 
¡ D ](}||fv r¤|  ||¡ qˆ|  ||¡ qˆ|  d¡$ tt jj	|ddƒ}W d   ƒ n1 sæ0    Y  t j 
¡ D ],}|||fv r|  ||¡ qú|  ||¡ qúd S )Nr   r   rœ   r   r6   rž   r    r¡   r¢   r§   TrG   )r   r   r!   r   rˆ   r©   r¦   r‰   rª   Znot_translation_ofr>   rz   ro   )r$   r¬   r­   rR   r®   r¯   r&   r(   r(   r)   Útest_not_translation_of+  s2    üÿ	.
ÿ"z(TestPageQuerySet.test_not_translation_ofc                 C   st  t jjdd}t jjdd}tƒ j ¡ }tj ¡ }|j|jg}i }i }|D ]\}| ¡  | ||¡}	|	j	}
|
j
j|
d dd | ||¡}| ¡  |||j< |j	j
||j< qJt jj|j|jfd}d|dgd	| ¡ d
gg}|D ]’\}}}| j|dh |  |¡" dd„ | ¡ D ƒ}W d   ƒ n1 s*0    Y  |D ]}||j }|  d¡& |  |j||j g¡ W d   ƒ n1 s€0    Y  |  d¡, |  |jd j	j
||j ¡ W d   ƒ n1 sÈ0    Y  |  d¡ |  |j¡ W d   ƒ n1 s 0    Y  |  d¡$ |  |j||j ¡ W d   ƒ n1 s@0    Y  q8W d   ƒ qÚ1 sd0    Y  qÚd S )Nr   r   r1   Zapprove)ÚuserÚaction_name)Zpk__inÚbaserO   rn   r‡   )Úcasec                 S   s   i | ]}|j |“qS r(   ©Úpk)Ú.0r&   r(   r(   r)   Ú
<dictcomp>o  s   zBTestPageQuerySet.test_prefetch_workflow_states.<locals>.<dictcomp>r   )r   r   r!   r   r<   r   rn   Zsave_revisionÚstartZcurrent_task_stateZtaskZ	on_actionZrefresh_from_dbr·   r"   ZsubTestr‰   Zprefetch_workflow_statesr:   Z_current_workflow_statesr    Zworkflow_in_progressZcurrent_workflow_state)r$   ÚhomeZevent_indexr²   ZworkflowZ
test_pagesZworkflow_statesZcurrent_tasksr&   Zapproved_workflow_stateZ
task_stateZworkflow_stater•   Zqueriesrµ   Znum_queriesZqueried_pagesr=   r(   r(   r)   Útest_prefetch_workflow_statesQ  sV    

ÿ&


þ$þ$,þz.TestPageQuerySet.test_prefetch_workflow_statesN).Ú__name__Ú
__module__Ú__qualname__Úfixturesr*   r/   r5   r8   r=   rA   rE   rH   rJ   rK   rM   rN   rS   rU   rX   rY   rZ   r[   r`   rb   rd   rg   rh   ri   rp   rt   ry   r{   r€   r   rƒ   r„   rŒ   r   r   r’   r–   r˜   r›   r°   r±   r¼   r(   r(   r(   r)   r      sV   
	
	&r   c                   @   s"   e Zd ZdgZdd„ Zdd„ ZdS )ÚTestPageQueryInSiter   c                 C   sz   t dddd| _t ¡ j| jd t dddd| _| jj| jd tjjd	d
tjj	| jj
ddd| _t jj	dd| _d S )NzSite 2 pageÚsite_2_pageZHello)r£   r¤   Úcontentr§   zSite 2 subpageÚsite_2_subpagezHello againzexample.comi  r¶   F)ÚhostnameÚportrR   Zis_default_siterq   r   )r   rÂ   r   Úget_first_root_noder©   rÄ   r   r   rˆ   r!   r·   Úsite_2Úabout_us_pager—   r(   r(   r)   ÚsetUpŽ  s&    ýýüzTestPageQueryInSite.setUpc                 C   s<   t j | j¡}|  | j|¡ |  | j|¡ |  | j|¡ d S r“   )	r   r   Zin_siterÈ   ro   rÂ   rÄ   rz   rÉ   )r$   Zsite_2_pagesr(   r(   r)   Útest_in_site¤  s    z TestPageQueryInSite.test_in_siteN)r½   r¾   r¿   rÀ   rÊ   rË   r(   r(   r(   r)   rÁ   ‹  s   rÁ   c                   @   s2   e Zd ZdgZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestPageQuerySetSearchr   c                 C   sV   t jjddgd}|  | ¡ d¡ |  tjjddj|¡ |  tjjddj|¡ d S )NÚmoonÚlocation)ÚfieldsrO   ú)/home/events/tentative-unpublished-event/r   r+   )	r   r   Úsearchr:   r;   ro   r   r!   rn   ©r$   r%   r(   r(   r)   Útest_search¯  s    ÿüþz"TestPageQuerySetSearch.test_searchc                 C   sz   t jjddd}|  t|ƒtjjddjg¡ t jjddd}t|dd„ d	}|  |tjjd
djtjjddjg¡ d S )Nzmoon poniesÚand)ÚoperatorrÐ   r   Úorc                 S   s   | j S r“   r   )r&   r(   r(   r)   Ú<lambda>Ë  ó    z7TestPageQuerySetSearch.test_operators.<locals>.<lambda>)Úkeyr+   )	r   r   rÑ   r:   rª   r   r!   rn   Úsorted)r$   ÚresultsZsorted_resultsr(   r(   r)   Útest_operators¾  s$    ÿÿþ	ÿþþz%TestPageQuerySetSearch.test_operatorsc                 C   s   t j d¡jddgdd}|  t|ƒtjjddjtjjddjg¡ t j d	¡jddgdd}|  t|ƒtjjddjtjjddjg¡ d S )
Nr   rÍ   rÎ   F)rÏ   Zorder_by_relevancer+   r   rÐ   ú	-url_path)	r   r   r«   rÑ   r:   rª   r   r!   rn   rÒ   r(   r(   r)   Útest_custom_orderÖ  s,    ÿÿþþ
ÿÿüþz(TestPageQuerySetSearch.test_custom_orderc              	      sÆ   g ‰ ‡ fdd„}t  |¡ zštjjdd}| ¡  ¡  tjjdd}tjjdd}tjjdd}|  	|j
¡ |  	|j
¡ |  t|fˆ ¡ |  t|fˆ ¡ |  t|fˆ ¡ W t  |¡ nt  |¡ 0 d S )Nc                    s   ˆ   | |f¡ d S r“   )Úappend)Zsenderr¨   Úkwargs©Zunpublish_signals_firedr(   r)   Úpage_unpublished_handler÷  s    zGTestPageQuerySetSearch.test_unpublish.<locals>.page_unpublished_handlerr1   r   r\   rk   rÐ   )r   Úconnectr   r   r!   Úget_childrenZ	unpublishr   r   r,   r   ro   rz   Z
disconnect)r$   râ   r4   Z	christmasZsaint_patrickZunpublished_eventr(   rá   r)   Útest_unpublishó  s&    
ÿÿz%TestPageQuerySetSearch.test_unpublishN)r½   r¾   r¿   rÀ   rÓ   rÜ   rÞ   rå   r(   r(   r(   r)   rÌ   ¬  s
   rÌ   c                   @   s¾   e Zd ZdZdgZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-S ).ÚTestSpecificQueryaã  
    Test the .specific() queryset method. This is isolated in its own test case
    because it is sensitive to database changes that might happen for other
    tests.

    The fixture sets up a page structure like:

    =========== =========================================
    Type        Path
    =========== =========================================
    Page        /
    Page        /home/
    SimplePage  /home/about-us/
    EventIndex  /home/events/
    EventPage   /home/events/christmas/
    EventPage   /home/events/someone-elses-event/
    EventPage   /home/events/tentative-unpublished-event/
    SimplePage  /home/other/
    EventPage   /home/other/special-event/
    =========== =========================================
    útest_specific.jsonc                 C   s0   t j ¡  ¡ | _t j ¡  ¡ jtdƒd| _d S )Nr·   ©r;   )r   r   r   rn   Ú
live_pagesÚannotater   Úlive_pages_with_annotationsr—   r(   r(   r)   rÊ   0  s    ÿzTestSpecificQuery.setUpc              	   C   sò   t jjdd}|  d¡ | ¡  ¡ }W d   ƒ n1 s:0    Y  |  d¡ t|ƒ}W d   ƒ n1 sl0    Y  |  |t¡ |  t	|ƒd¡ |D ]V}|j
}| ¡ }|  ||¡ |  d¡ |  ||j¡ W d   ƒ q–1 sâ0    Y  q–d S )Nr   r   r   r‡   é   )r   r   r!   r‰   Úget_descendantsrn   rª   rm   r:   ÚlenÚcontent_typeÚmodel_classr}   )r$   ÚrootÚqsr%   r&   rï   Úmodelr(   r(   r)   Útest_specific6  s    *&zTestSpecificQuery.test_specificc                 C   sÂ   |   d¡, tj ¡  d¡d d…  ¡ }W d   ƒ n1 s<0    Y  |   d¡ t|ƒ}W d   ƒ n1 sn0    Y  |  t|ƒd¡ |  |tjj	ddjtjj	ddjtjj	ddjg¡ d S )Nr   rÝ   rT   z/home/other/special-event/r   ú/home/other/r\   )
r‰   r   r   r   r«   rn   rª   r:   rî   r!   ©r$   rò   r%   r(   r(   r)   Útest_filtering_before_specificQ  s    :&ýþz0TestSpecificQuery.test_filtering_before_specificc              	   C   sÔ   |   d¡0 tj ¡  ¡  ¡  d¡d d… }W d   ƒ n1 s@0    Y  |   d¡ t|ƒ}W d   ƒ n1 sr0    Y  |  t	|ƒd¡ |  |tjj
ddjtjj
ddjtjj
ddjtjj
ddjg¡ d S )	Nr   rÝ   r‡   rõ   r   r\   r1   rq   )r‰   r   r   rn   r   r2   r«   rª   r:   rî   r!   rö   r(   r(   r)   Útest_filtering_after_specificg  s    >&üþz/TestSpecificQuery.test_filtering_after_specificc                 C   sŒ   |   d¡* t| jƒ}|  t|ƒd¡ W d   ƒ n1 s:0    Y  |   d¡* t| jƒ}|  t|ƒd¡ W d   ƒ n1 s~0    Y  d S )Né   rì   )r‰   rª   ré   r:   rî   rë   rÒ   r(   r(   r)   ÚCtest_specific_query_with_annotations_performs_no_additional_queries~  s    
.
zUTestSpecificQuery.test_specific_query_with_annotations_performs_no_additional_queriesc                 C   s|   t j ¡ }|  ¡ }| ¡ jj|dd | ¡ jj|dd t j ¡  ¡ j	t
dƒd}|  | ¡ jd¡ |  | ¡ jd¡ d S )NF©r²   Zcomment_notificationsÚsubscribers©Úsubscribers_countr6   )r   r   r   Úcreate_test_userr<   rü   rˆ   Úlastrn   rê   r   r:   rþ   )r$   r%   r²   rÛ   r(   r(   r)   Ú#test_specific_query_with_annotation‰  s    
þÿz5TestSpecificQuery.test_specific_query_with_annotationc                 C   sœ   |   d¡. ttj t¡ ¡ jdddƒ}W d   ƒ n1 s>0    Y  |  t	|ƒd¡ |   d¡& |D ]}|  
|j¡ qhW d   ƒ n1 sŽ0    Y  d S )NrO   Ú
feed_imageT©Zfor_specific_subqueriesr‡   r   )r‰   rª   r   r   rl   r   rn   Úselect_relatedr:   rî   r    r  r7   r(   r(   r)   Ú%test_specific_subquery_select_relatedš  s    þÿ"z7TestSpecificQuery.test_specific_subquery_select_relatedc                 C   s@   |   t¡" tj ¡ jdd W d   ƒ n1 s20    Y  d S ©NTr  )r™   Ú
ValueErrorr   r   r>   r  r—   r(   r(   r)   Ú4test_specific_subquery_select_related_without_fields¦  s    zFTestSpecificQuery.test_specific_subquery_select_related_without_fieldsc                 C   s–   |   d¡8 ttj t¡ ¡ jdddjd ddƒ}W d   ƒ n1 sH0    Y  |   d¡& |D ]}|  |j	¡ qbW d   ƒ n1 sˆ0    Y  d S )NrO   r  Tr  r‡   )
r‰   rª   r   r   rl   r   rn   r  r    r  r7   r(   r(   r)   Ú.test_specific_subquery_select_related_negation¬  s    þüÿ"z@TestSpecificQuery.test_specific_subquery_select_related_negationc                 C   s    |   d¡. ttj t¡ ¡ jdddƒ}W d   ƒ n1 s>0    Y  |  t	|ƒd¡ |   d¡* |D ]}|  
|j ¡ ¡ qhW d   ƒ n1 s’0    Y  d S )NrT   Ú
categoriesTr  r‡   r   ©r‰   rª   r   r   rl   r   rn   Úprefetch_relatedr:   rî   r,   r
  r>   r7   r(   r(   r)   Ú'test_specific_subquery_prefetch_relatedº  s    þÿ"z9TestSpecificQuery.test_specific_subquery_prefetch_relatedc                 C   s@   |   t¡" tj ¡ jdd W d   ƒ n1 s20    Y  d S r  )r™   r  r   r   r>   r  r—   r(   r(   r)   Ú7test_specific_subquery_prefetch_related_without_lookupsÆ  s    zITestSpecificQuery.test_specific_subquery_prefetch_related_without_lookupsc                 C   sª   |   d¡8 ttj t¡ ¡ jdddjd ddƒ}W d   ƒ n1 sH0    Y  |  t	|ƒd¡ |   d¡* |D ]}|  
|j ¡ ¡ qrW d   ƒ n1 sœ0    Y  d S )NrO   r
  Tr  r‡   r  r7   r(   r(   r)   Ú0test_specific_subquery_prefetch_related_negationÊ  s    þüÿ"zBTestSpecificQuery.test_specific_subquery_prefetch_related_negationc                 C   s¸   |   d¡8 ttj t¡ ¡ jdddjdddƒ}W d   ƒ n1 sH0    Y  |  	t
|ƒd¡ |   d¡8 |D ]"}|  |j¡ |  |jj ¡ ¡ qrW d   ƒ n1 sª0    Y  d S )NrT   r  Tr  Zfeed_image__renditionsr‡   r   )r‰   rª   r   r   rl   r   rn   r  r  r:   rî   r    r  r,   Z
renditionsr>   r7   r(   r(   r)   Ú:test_specific_subquery_select_related_and_prefetch_relatedÙ  s    þüÿ"zLTestSpecificQuery.test_specific_subquery_select_related_and_prefetch_relatedc                 C   sb   t j ¡ }|  ¡ }| ¡ jj|dd | ¡ jj|dd tt j ¡  	¡ j
tdƒd d¡ƒ dS )zŒ
        Ensure alias() works with specific() queries.
        See https://github.com/wagtail/wagtail/issues/11285 for more details
        Frû   rü   rý   rþ   N)r   r   r   rÿ   r<   rü   rˆ   r   Úiterrn   Úaliasr   r«   )r$   r%   r²   r(   r(   r)   Útest_specific_query_with_aliasé  s    
þýÿz0TestSpecificQuery.test_specific_query_with_aliasc                 C   sx   t jjddd}tjjddj|d ttjjdd ¡  	¡ ƒ}|  
|tjjddtjjddj	tjjd	dj	g¡ d S )
NÚtestsZmissingpage)Z	app_labelró   r1   r   )rï   r   rq   rõ   )r   r   rˆ   r   r"   Úupdaterª   r!   rä   rn   r:   )r$   Zmissing_page_content_typer%   r(   r(   r)   Ú/test_specific_gracefully_handles_missing_modelsü  s    ÿÿýþzATestSpecificQuery.test_specific_gracefully_handles_missing_modelsc              	   C   s°   t jdtj t¡d† |  td¡* tt	jj
dd ¡  ¡ ƒ}W d   ƒ n1 sT0    Y  |  |t	jj
ddt	jj
ddt	jj
ddg¡ W d   ƒ n1 s¢0    Y  d S )	Nz,wagtail.query.ContentType.objects.get_for_id)Zreturn_valuez;Specific versions of the following items could not be foundr   r   r1   rq   rõ   )r   Úpatchr   r   Zget_for_modelr   ZassertWarnsRegexÚRuntimeWarningrª   r   r!   rä   rn   r:   rÒ   r(   r(   r)   Ú-test_specific_gracefully_handles_missing_rows  s$    
þþÿ"ýþz?TestSpecificQuery.test_specific_gracefully_handles_missing_rowsc              	   C   sR  t jjdd}tdddd}|j|d |  d¡  | ¡ jd	d
}W d   ƒ n1 sX0    Y  |  d¡ t|ƒ}W d   ƒ n1 sŠ0    Y  |  	|t¡ |  
t|ƒd¡ |D ]X}|j}| ¡ }|  	||¡ |  d¡ |  ||j¡ W d   ƒ q´1 s0    Y  q´|  d¡$ |d j |d j W d   ƒ n1 sD0    Y  d S )Nr   r   ústream pageústream-pageú"[{"type": "text", "value": "foo"}]©r£   r¤   Úbodyr§   r   T)Údeferr6   é   rO   éÿÿÿÿ)r   r   r!   r   r©   r‰   rí   rn   rª   rm   r:   rî   rï   rð   r}   r  )r$   rñ   Ústream_pagerò   r%   r&   rï   ró   r(   r(   r)   Útest_deferred_specific_query.  s,    ý.&0
z.TestSpecificQuery.test_deferred_specific_queryc                 C   s,  | j }|  d¡, t| ¡ ƒ}|  t|ƒd¡ W d   ƒ n1 sB0    Y  |  d¡, t| ¡  ¡ ƒ}|  ||¡ W d   ƒ n1 sˆ0    Y  |  d¡0 t| ¡ jddƒ}|  ||¡ W d   ƒ n1 sÒ0    Y  |  d¡0 t| ¡ jddƒ}|  ||¡ W d   ƒ n1 s0    Y  d S )Nrù   rì   ©Ú
chunk_sizeé   rO   ©rë   r‰   rª   r>   r:   rî   Úiterator)r$   ÚquerysetÚbenchmark_resultÚresult_1Úresult_2Zresult_3r(   r(   r)   Ú!test_specific_query_with_iteratorX  s    .**z3TestSpecificQuery.test_specific_query_with_iteratorc                 C   sè   | j dd … }|  d¡, t| ¡ ƒ}|  t|ƒd¡ W d   ƒ n1 sJ0    Y  |  d¡, t| ¡  ¡ ƒ}|  ||¡ W d   ƒ n1 s0    Y  |  d¡0 t| ¡ jddƒ}|  ||¡ W d   ƒ n1 sÚ0    Y  d S )NrO   r‡   rù   r&  r6   r$  r'  ©r$   r)  r*  r+  r,  r(   r(   r)   Ú/test_bottom_sliced_specific_query_with_iteratort  s    .*zATestSpecificQuery.test_bottom_sliced_specific_query_with_iteratorc                 C   sè   | j d d… }|  d¡, t| ¡ ƒ}|  t|ƒd¡ W d   ƒ n1 sJ0    Y  |  d¡, t| ¡  ¡ ƒ}|  ||¡ W d   ƒ n1 s0    Y  |  d¡0 t| ¡ jddƒ}|  ||¡ W d   ƒ n1 sÚ0    Y  d S )Nr&  rù   rì   r6   r$  r'  r.  r(   r(   r)   Ú,test_top_sliced_specific_query_with_iterator‰  s    .*z>TestSpecificQuery.test_top_sliced_specific_query_with_iteratorc                 C   sè   | j dd… }|  d¡, t| ¡ ƒ}|  t|ƒd¡ W d   ƒ n1 sJ0    Y  |  d¡, t| ¡  ¡ ƒ}|  ||¡ W d   ƒ n1 s0    Y  |  d¡0 t| ¡ jddƒ}|  ||¡ W d   ƒ n1 sÚ0    Y  d S )NrO   r&  r‡   rù   rT   r$  r'  r.  r(   r(   r)   Ú7test_top_and_bottom_sliced_specific_query_with_iteratorž  s    .*zITestSpecificQuery.test_top_and_bottom_sliced_specific_query_with_iteratorN)r½   r¾   r¿   Ú__doc__rÀ   rÊ   rô   r÷   rø   rú   r  r  r  r	  r  r  r  r  r  r  r  r#  r-  r/  r0  r1  r(   r(   r(   r)   ræ     s.   *ræ   c                   @   s2   e Zd ZdgZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestSpecificQuerySearchrç   c                 C   sD   t jddtƒ dd tj ¡  ¡ | _tj ¡  ¡ jt	dƒd| _
d S )NZupdate_indexÚdefaulté2   )Úbackend_nameÚstdoutr%  r·   rè   )r   Zcall_commandr   r   r   r   rn   ré   rê   r   rë   r—   r(   r(   r)   rÊ   ·  s    üÿzTestSpecificQuerySearch.setUpc                 C   sH   t j ¡  ¡  t¡ d¡}|  t|ƒd¡ |D ]}|  	t
|dƒ¡ q.d S )NÚ_scorer   )r   r   r   rn   rÑ   r   Úannotate_scoreÚassertGreaterrî   r    Úhasattr©r$   rÛ   Úresultr(   r(   r)   Ú8test_specific_query_with_match_all_search_and_annotationÄ  s
    ÿzPTestSpecificQuerySearch.test_specific_query_with_match_all_search_and_annotationc                 C   sH   t j ¡  ¡  d¡ d¡}|  t|ƒd¡ |D ]}|  t	|dƒ¡ q.d S )Nr.   r8  r   )
r   r   r   rn   rÑ   r9  r:  rî   r    r;  r<  r(   r(   r)   Ú3test_specific_query_with_real_search_and_annotationÏ  s
    ÿzKTestSpecificQuerySearch.test_specific_query_with_real_search_and_annotationc                 C   s”   t tj ¡  ¡  ¡ jtddƒ}|  t	|ƒd¡ |  
tjjddj|¡ |  
tjjddj|¡ |  
tjjddj|¡ |  
tjjddj|¡ d S )	Nz wagtail.search.backends.database)Úbackendr‡   rõ   r   r\   r1   rq   )rª   r   r   rn   r   r2   rÑ   r   r:   rî   ro   r!   rÒ   r(   r(   r)   Útest_specific_query_with_searchÚ  s    ýÿ	ÿz7TestSpecificQuerySearch.test_specific_query_with_searchN)r½   r¾   r¿   rÀ   rÊ   r>  r?  rA  r(   r(   r(   r)   r3  ´  s
   r3  c                   @   sŽ   e Zd ZdZdgZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!S )"ÚTestFirstCommonAncestorza
    Uses the same fixture as TestSpecificQuery. See that class for the layout
    of pages.
    rç   c                 C   s8   t jjdd| _t j t¡| _t j t¡jdd| _d S )Nr   r   z/other/)Zurl_path__contains)	r   r   r!   rR   rl   r   Ú
all_eventsÚexcludeÚregular_eventsr—   r(   r(   r)   rÊ   ø  s
    ÿzTestFirstCommonAncestor.setUpc                 C   s    t dddd}| jj|d d S )Nr  r  r  r  r§   )r   rR   r©   )r$   r"  r(   r(   r)   Ú_create_streampageÿ  s    ýz*TestFirstCommonAncestor._create_streampagec                 C   s(   |   | j ¡ d¡ |   | j ¡ d¡ d S )Nr‡   rT   )r:   rC  r;   rE  r—   r(   r(   r)   Útest_bookkeeping  s    z(TestFirstCommonAncestor.test_bookkeepingc                 C   s    |   tjjdd| j ¡ ¡ dS )zCommon ancestor for EventPagesr»   ©r¤   N)r:   r   r   r!   rC  Úfirst_common_ancestorr—   r(   r(   r)   Útest_event_pages  s    ÿz(TestFirstCommonAncestor.test_event_pagesc                 C   s    |   tjjdd| j ¡ ¡ dS )z8Common ancestor for EventPages, excluding /other/ eventsÚeventsrH  N©r:   r   r   r!   rE  rI  r—   r(   r(   r)   Útest_normal_event_pages  s    ÿz/TestFirstCommonAncestor.test_normal_event_pagesc                 C   s$   |   tjjdd| jjdd¡ dS )zj
        Common ancestor for EventPages, excluding /other/ events, with
        include_self=True
        rK  rH  T©Úinclude_selfNrL  r—   r(   r(   r)   Ú$test_normal_event_pages_include_self  s    þz<TestFirstCommonAncestor.test_normal_event_pages_include_selfc                 C   s(   |   tjjddtjjdd ¡ ¡ dS )z4Test getting a single page, with include_self=False.rK  rH  Ú	Christmas©r£   N©r:   r   r   r!   r"   rI  r—   r(   r(   r)   Ú test_single_page_no_include_self#  s    þz8TestFirstCommonAncestor.test_single_page_no_include_selfc                 C   s,   |   tjjddtjjddjdd¡ dS )z3Test getting a single page, with include_self=True.rQ  rR  TrN  NrS  r—   r(   r(   r)   Útest_single_page_include_self*  s    ÿþz5TestFirstCommonAncestor.test_single_page_include_selfc                 C   s   |   t ¡ tj ¡ ¡ d S r“   ©r:   r   rÇ   r   rI  r—   r(   r(   r)   Útest_all_pages3  s    ÿz&TestFirstCommonAncestor.test_all_pagesc                 C   s>   |   tj¡ tjjdd W d   ƒ n1 s00    Y  d S ©NT)Ústrict)r™   r   ÚDoesNotExistr   rI  r—   r(   r(   r)   Útest_all_pages_strict8  s    z-TestFirstCommonAncestor.test_all_pages_strictc                 C   s    |   t ¡ tjjddd¡ d S )NT)rO  rY  rV  r—   r(   r(   r)   Ú"test_all_pages_include_self_strict<  s    þz:TestFirstCommonAncestor.test_all_pages_include_self_strictc                 C   s   |   t ¡ tj ¡  ¡ ¡ d S r“   )r:   r   rÇ   r   ÚnonerI  r—   r(   r(   r)   Útest_empty_querysetB  s    ÿz+TestFirstCommonAncestor.test_empty_querysetc                 C   sB   |   tj¡" tj ¡ jdd W d   ƒ n1 s40    Y  d S rX  )r™   r   rZ  r   r]  rI  r—   r(   r(   r)   Útest_empty_queryset_strictG  s    z2TestFirstCommonAncestor.test_empty_queryset_strictc              	   C   s^   |   ¡  tj ¡  ¡ D ]B}|  d|j¡ |  d¡ |j W d   ƒ q1 sN0    Y  qd S ©Nr  r6   )	rF  r   r   r>   Údefer_streamfieldsrz   Ú__dict__r‰   r  ©r$   r&   r(   r(   r)   Ú(test_defer_streamfields_without_specificK  s
    z@TestFirstCommonAncestor.test_defer_streamfields_without_specificc              	   C   sd   |   ¡  tj t¡ ¡  ¡ D ]B}|  d|j¡ |  	d¡ |j
 W d   ƒ q1 sT0    Y  qd S r`  )rF  r   r   r|   r   ra  rn   rz   rb  r‰   r  rc  r(   r(   r)   Ú%test_defer_streamfields_with_specificR  s
    z=TestFirstCommonAncestor.test_defer_streamfields_with_specificN)r½   r¾   r¿   r2  rÀ   rÊ   rF  rG  rJ  rM  rP  rT  rU  rW  r[  r\  r^  r_  rd  re  r(   r(   r(   r)   rB  ð  s"   
	rB  N)'Úior   Zunittestr   Zdjango.contrib.authr   Z"django.contrib.contenttypes.modelsr   Zdjango.corer   Zdjango.db.modelsr   r   Zdjango.testr	   r
   Zwagtail.modelsr   r   r   r   r   Zwagtail.search.queryr   Zwagtail.signalsr   Zwagtail.test.testapp.modelsr   r   r   r   Zwagtail.test.utilsr   r   rÁ   rÌ   ræ   r3  rB  r(   r(   r(   r)   Ú<module>   s0       y!k    <