o
    h&                    @   s~  d dl Z d dlZd dl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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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% 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l0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD ddlEmFZFmGZGmHZH e"d ZIG dd  d e@eZJG d!d" d"e@eZKG d#d$ d$e@eZLG d%d& d&eBe@eZMG d'd( d(e@eZNG d)d* d*eBe@eZOed+d,G d-d. d.e@eZPG d/d0 d0e@eZQG d1d2 d2e@eZRG d3d4 d4e@eZSG d5d6 d6e@eZTG d7d8 d8e@eZUG d9d: d:e@eZVG d;d< d<e@eZWG d=d> d>e@eZXG d?d@ d@e@eZYG dAdB dBeBe@eZZed+d,G dCdD dDe@eZ[edEd,G dFdG dGe@eZ\G dHdI dIeBe@eZ]G dJdK dKe@eZ^G dLdM dMe@eZ_G dNdO dOe@eZ`G dPdQ dQe@eZadS )R    N)patch)settings)Group
Permission)ContentType)SimpleUploadedFileTemporaryUploadedFile)In)filesizeformat)render_to_string)RequestFactoryTestCaseTransactionTestCaseoverride_settings)reverse)	force_str)escapeescapejs)RFC3986_SUBDELIMS	urlencode)	mark_safe)capfirst)OptimizerBase)registry)AdminURLFinder)get_image_model)generate_signature)ImagesFilterSet)
CollectionGroupCollectionPermissionPageUploadedFileget_root_collection_id)CustomImageCustomImageWithAuthor	EventPageVariousOnDeleteModel)WagtailTestUtils)AdminTemplateTestUtils)local_datetime   )Imageget_test_image_fileget_test_image_file_svgz/~:@c                   @   s   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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ed'd(d)iid*d+d, Zd-d. Zd/S )0TestImageIndexViewc                 C   s>   |   | _tjjdtddd| _tjjdtddd| _d S )Na cute kittenr*   r*   sizetitlefilea cute puppy)loginuserr+   objectscreater,   kitten_imagepuppy_imageself r?   e/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/images/tests/test_admin_views.pysetUp3   s   
zTestImageIndexView.setUpc                 C      | j td|S Nwagtailimages:indexclientgetr   r>   paramsr?   r?   r@   rG   >      zTestImageIndexView.getc                 C   sV   |   }| |jd | |d | |d | |d | |d | |d d S )N   wagtailimages/images/index.htmlAdd an imageThis field is required.r/   r6   )rG   assertEqualstatus_codeassertTemplateUsedassertContainsassertNotContainsr>   responser?   r?   r@   test_simpleA   s   zTestImageIndexView.test_simplec                 C   sb   |  ddi}| |jd | |jd d | |d | |d | |d | |d d S )	Nq rK   query_stringrM   rN   r/   r6   rG   rO   rP   contextrR   rS   rT   r?   r?   r@   test_empty_qL   s   zTestImageIndexView.test_empty_qc                 C   s2   g d}|D ]}|  d|i}| |jd qd S )N)01z-19999z
Not a pageprK   rG   rO   rP   )r>   pagespagerU   r?   r?   r@   test_paginationW   s
   z"TestImageIndexView.test_paginationc                 C   s   t  }|jdd}tddD ]}tjjd| tdd|d| _q| 	|j
d	d
}| |jd |jd}| d|j
 |v pFd|j
 |v  | d|j
 |v pWd|j
 |v  d S )N
Evil plansnamer*   B   Test image %ir0   r1   r4   r5   
collection   )collection_idr`   rK   utf8z?p=1&amp;collection_id=%iz?collection_id=%i&amp;p=1z?p=3&amp;collection_id=%iz?collection_id=%i&amp;p=3)r   get_first_root_node	add_childranger+   r9   r:   r,   imagerG   idrO   rP   contentdecode
assertTrue)r>   root_collectionevil_plans_collectionirU   response_bodyr?   r?   r@   &test_pagination_preserves_other_params]   s&   
z9TestImageIndexView.test_pagination_preserves_other_paramsc                 C   sV   |  ddi}| |jd |j}| |d jd | j | |d jd | j d S )Norderingr4   rK   page_objr   r*   )rG   rO   rP   r[   object_listr;   r<   )r>   rU   r[   r?   r?   r@   test_order_by_titlex   s
   z&TestImageIndexView.test_order_by_titlec                 C   sH   g d}|D ]}|  d|i}| |jd |j}| |d | qd S )N)r4   z-title
created_at-created_at	file_sizez
-file_sizer|   rK   current_orderingrG   rO   rP   r[   )r>   	orderingsr|   rU   r[   r?   r?   r@   test_valid_orderings   s   z'TestImageIndexView.test_valid_orderingsc                 C   sj   |  ddi}| |jd |j}d}| |d | | |d jd | j | |d jd | j d S )	Nr|   bogusrK   r   r   r}   r   r*   )rG   rO   rP   r[   r~   r<   r;   )r>   rU   r[   default_orderingr?   r?   r@   7test_default_ordering_used_if_invalid_ordering_provided   s   zJTestImageIndexView.test_default_ordering_used_if_invalid_ordering_provided   )WAGTAILIMAGES_INDEX_PAGE_SIZEc                 C   sV   dd t ddD }tj| |  }| |jd |jd j}| t	|d d S )Nc                 S   "   g | ]}t d | tdddqS ri   r0   r1   r3   r+   r,   .0ry   r?   r?   r@   
<listcomp>       zDTestImageIndexView.test_default_entries_per_page.<locals>.<listcomp>r*   !   rK   r}   r   
rq   r+   r9   bulk_createrG   rO   rP   r[   r~   len)r>   imagesrU   r~   r?   r?   r@   test_default_entries_per_page   s   z0TestImageIndexView.test_default_entries_per_pagec                 C   sZ   dd t ddD }tj| d}|  }| |jd |jd j}| t	|| d S )Nc                 S   r   r   r   r   r?   r?   r@   r      r   zQTestImageIndexView.test_default_entries_per_page_uses_default.<locals>.<listcomp>r*   r      rK   r}   r   )r>   r   default_num_entries_per_pagerU   r~   r?   r?   r@   *test_default_entries_per_page_uses_default   s   z=TestImageIndexView.test_default_entries_per_page_uses_defaultc                 C   s\   t  }|jdd |jdd |  }| |j}|d}| dd |D g d d S )Nre   rf   
Good plansz@select[name="collection_id"] option[value]:not(option[value=""])c                 S   s   g | ]}|j d ddqS )Tstripu   ↳ )get_textlstrip)r   rk   r?   r?   r@   r      s    z<TestImageIndexView.test_collection_order.<locals>.<listcomp>)Rootre   r   )r   ro   rp   rG   get_souprt   selectrO   )r>   rw   rU   soupcollection_optionsr?   r?   r@   test_collection_order   s   z(TestImageIndexView.test_collection_orderc                 C   8   t  }|jdd}|jdd |  }| |d d S Nre   rf   Eviler plans,&nbsp;&nbsp;&nbsp;&nbsp;&#x21b3 Eviler plansr   ro   rp   rG   rR   r>   rw   
evil_plansrU   r?   r?   r@   test_collection_nesting   
   z*TestImageIndexView.test_collection_nestingc                 C   s   t  }|jdd}tjjdtdd|d}| d|ji}| 	|j
d td	|jfd
}tj|j }| || d|  d S )Nre   rf   
Test imager0   r1   rj   rm   rK   wagtailimages:editargsz?next=)r   ro   rp   r+   r9   r:   r,   rG   rs   rO   rP   r   urllibparsequote_requestget_full_pathrR   )r>   rw   rx   rr   rU   edit_urlnext_urlr?   r?   r@   &test_edit_image_link_contains_next_url   s   z9TestImageIndexView.test_edit_image_link_contains_next_urlc                 C   s~   t jjdt d}|jdd |  }| |jd | 	|j
}|d}| | |d}| dd	 |D ddg d S )
NTest image with two tagsr3   onetworK   zinput[name=tag][checked]#id_tag labelc                 S   s   g | ]}|j d dqS )Tr   r   )r   tagsr?   r?   r@   r      s    z0TestImageIndexView.test_tags.<locals>.<listcomp>)r+   r9   r:   r,   r   addrG   rO   rP   r   rt   r   assertFalseassertCountEqual)r>   image_two_tagsrU   r   current_tagsr   r?   r?   r@   	test_tags   s   


zTestImageIndexView.test_tagsc                 C   sT  t jjdt d t jjdt d}|jd t jjdt d}|jdd t jjdt d}|jd |  }| |jd	 j	j
d
 | ddi}| |jd	 j	j
d | ddi}| |jd	 j	j
d | dddgi}| |jd	 j	j
d | |j}|d}| dd |D ddg |d}| dd |D ddg d S )NTest image with no tagsr3   Test image with one tagr   r   r   zTest image with a different tag	unrelatedr}      tagrl   r*      r   c                 S   s&   g | ]}| d dur|jddqS )zinput[checked]NTr   )
select_oner   )r   r   r?   r?   r@   r   +  s
    
z9TestImageIndexView.test_tag_filtering.<locals>.<listcomp>z"[data-w-active-filter-id="id_tag"]c                 S   s   g | ]	}|j d ddqS ) T)	separatorr   r   )r   filterr?   r?   r@   r   6  s    zTag: onezTag: unrelated)r+   r9   r:   r,   r   r   rG   rO   r[   	paginatorcountr   rt   r   r   )r>   image_one_tagr   image_unrelated_tagrU   r   r   active_filtersr?   r?   r@   test_tag_filtering   sP   


z%TestImageIndexView.test_tag_filteringc                 C   s   t ddD ]}tjjd| tddd}|d dkr$|jd	 |  q| d	dd
}| 	|j
d |jd}| d|v pCd|v  | d|v pNd|v  d S )Nr*      ri   r0   r1   r3   rl   r   even)r   r`   rK   rn   z?p=1&amp;tag=evenz?tag=even&amp;p=1z?p=3&amp;tag=evenz?tag=even&amp;p=3)rq   r+   r9   r:   r,   r   r   saverG   rO   rP   rt   ru   rv   )r>   ry   rr   rU   rz   r?   r?   r@   )test_tag_filtering_preserves_other_params:  s$   z<TestImageIndexView.test_tag_filtering_preserves_other_paramsc                 C   s8   |   }|j }td}| jd| d|ddd d S )Nwagtailimages:index_results<form action="z" method="get" role="search">r*   T)r   allow_extra_attrs)rG   rt   ru   r   assertTagInHTML)r>   rU   html
search_urlr?   r?   r@   test_search_form_renderedR  s   


z,TestImageIndexView.test_search_form_rendereddefaultBACKEND+django.core.cache.backends.dummy.DummyCacheCACHESc                 C   s   |    | d |    W d    n1 sw   Y  tdD ]}tjjd| tddd| _q!| d |    W d    n1 sFw   Y  | d |    W d    d S 1 s`w   Y  d S )N      ri   r0   r1   r3       )rG   assertNumQueriesrq   r+   r9   r:   r,   rr   r>   ry   r?   r?   r@   test_num_queries_  s   



"z#TestImageIndexView.test_num_queriesc                 C   sv   t jjdt d}|jd t td}| j	|_	t
i t j |dd}dd |jjjjD }| t|d	 d S )
Nr   r3   r   rD   T)dataquerysetrequestis_searchingc                 S   s   g | ]	}t |tr|qS r?   )
isinstancer	   )r   clauser?   r?   r@   r     s    zZTestImageIndexView.test_empty_tag_filter_does_not_perform_id_filtering.<locals>.<listcomp>r   )r+   r9   r:   r,   r   r   r   rG   r   r8   r   allqsquerywherechildrenrO   r   )r>   r   r   	filterset
in_clausesr?   r?   r@   3test_empty_tag_filter_does_not_perform_id_filtering{  s   
zFTestImageIndexView.test_empty_tag_filter_does_not_perform_id_filteringN)__name__
__module____qualname__rA   rG   rV   r\   rd   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r?   r?   r?   r@   r.   2   s2    

	=

r.   c                   @   sN   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d Z	dd Z
dS )TestImageIndexViewSearchtest_empty.jsonc                 C   sp   |    tjjdtddd| _tjjdtddd| _tddd| j_| j	  tdd	d	| j_| j	  d S )
Nr/   r0   r1   r3   r6   i  r*   i  rl   )
r7   r+   r9   r:   r,   r;   r<   r)   r   r   r=   r?   r?   r@   rA     s   
zTestImageIndexViewSearch.setUpc                 C   rB   rC   rE   rH   r?   r?   r@   rG     rJ   zTestImageIndexViewSearch.getc                 C   J   |  ddi}| |jd | |jd d | |d | |d d S )NrW   kittenrK   rY   r/   r6   rZ   rT   r?   r?   r@   test_search  
   z$TestImageIndexViewSearch.test_searchc                 C   r  )NrW   kitrK   rY   r/   r6   rZ   rT   r?   r?   r@   test_search_partial_match  r  z2TestImageIndexViewSearch.test_search_partial_matchc                 C   s6  t  }|jdd|jddg}ddg}g }tdD ](}tjj||d   d| td	d
||d  d| _|d dkrB|	| j q| 
d|d jd}|j}|jd }|jd j}	|jd}
| |d | |d | ||	 tdddD ]
}| d| |
 qztd}| |d| d|d j d d S )NzBaker Collectionrf   zOther CollectionBakerOther
   rl   r   r0   r1   rj   r   )rW   rm   rY   r}   utf-8rK   zBaker %iwagtailimages:add_multiplez	<a href="?collection_id=")r   ro   rp   rq   r+   r9   r:   r,   rr   appendrG   rs   rP   r[   r~   rt   ru   rO   r   assertInr   rR   pk)r>   rw   child_collection
title_listanswer_listry   rU   rP   rY   response_listrz   urlr?   r?   r@   test_collection_query_search  s<   



z5TestImageIndexViewSearch.test_collection_query_searchc                 C   s   t jjdtddd}tddd|_|  | ddd	}| |j	d
 | |j
d d | t|j
d j|| j| jg | |j}|d}| | | |d d | |jddd d S )Nzdecades old cute tortoiser0   r1   r3   i  r*   cuter   )rW   r|   rK   rY   r}   z(select[name="ordering"] option[selected]valueTr   Oldest)r+   r9   r:   r,   r)   r   r   rG   rO   rP   r[   listr~   r;   r<   r   rt   r   assertIsNotNoner   )r>   	old_imagerU   r   optionr?   r?   r@   #test_search_and_order_by_created_at  s$   

z<TestImageIndexViewSearch.test_search_and_order_by_created_atc                 C   sz   t jjdt d t jjdt d}|jd t jjdt d}|jdd | ddd}| |jd	 j	j
d
 d S )Nr   r3   r   r   r   r   test)r   rW   r}   rl   )r+   r9   r:   r,   r   r   rG   rO   r[   r   r   )r>   r   r   rU   r?   r?   r@   #test_tag_filtering_with_search_term  s    z<TestImageIndexViewSearch.test_tag_filtering_with_search_termN)r   r   r   fixturesrA   rG   r  r  r  r  r   r?   r?   r?   r@   r     s    #r   c                   @   .   e Zd ZdgZdd Zi fddZdd ZdS )	TestImageListingResultsViewr   c                 C      |    d S Nr7   r=   r?   r?   r@   rA   	     z!TestImageListingResultsView.setUpc                 C   rB   )Nr   rE   rH   r?   r?   r@   rG     rJ   zTestImageListingResultsView.getc                 C   sD   t jjdt d}| ddi}| |jd | |d|j  d S )NzA scary monsterr3   rW   monsterrK   z5/admin/images/%d/?next=/admin/images/%%3Fq%%3Dmonster)	r+   r9   r:   r,   rG   rO   rP   rR   rs   )r>   r(  rU   r?   r?   r@   r    s   z'TestImageListingResultsView.test_searchN)r   r   r   r!  rA   rG   r  r?   r?   r?   r@   r#    
    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e	dddd Z
dd Zdd Ze	dgddd Zdd Ze	i ejdddiiddd  Zd!d" Ze	d#d$d%d& Ze	d#d'd(d) Zd*d+ Zd,d- Ze	ddd.d/ Zd0S )1TestImageAddViewc                 C   r$  r%  r&  r=   r?   r?   r@   rA     r'  zTestImageAddView.setUpc                 C   rB   Nwagtailimages:addrE   rH   r?   r?   r@   rG   "  rJ   zTestImageAddView.getc                 C   rB   r+  rF   postr   r>   	post_datar?   r?   r@   r.  %  rJ   zTestImageAddView.postc                 C   sl   |   }| |jd | |d | |d | |d | |d | tdddd	d
dg|j d S )NrK   wagtailimages/images/add.htmlK<label class="w-field__label" for="id_collection" id="id_collection-label">enctype="multipart/form-data"wagtailadmin/js/draftail.jsrD   Imagesr  labelrX   z
New: Image)	rG   rO   rP   rQ   rS   rR   assertBreadcrumbsItemsRenderedr   rt   rT   r?   r?   r@   test_get(  s   zTestImageAddView.test_getc                 C   sR   t  }|jdd |  }| |jd | |d | |d | |d d S )Nre   rf   rK   r1  r2  )r   ro   rp   rG   rO   rP   rQ   rR   )r>   rw   rU   r?   r?   r@   test_get_with_collectionsB  s   z*TestImageAddView.test_get_with_collectionsc                 C   r   r   r   r   r?   r?   r@    test_get_with_collection_nestingP  r   z1TestImageAddView.test_get_with_collection_nestingtests.CustomImageWAGTAILIMAGES_IMAGE_MODELc                 C   sJ   |   }| |jd | |d | |d | |d | |d d S )NrK   r1  r3  zname="fancy_caption"r4  rG   rO   rP   rQ   rR   rT   r?   r?   r@    test_get_with_custom_image_modelY  s   z1TestImageAddView.test_get_with_custom_image_modelc                 C   s   |  dtdt j d}| |td tjj	dd}| 
| d | }| 
|jd | 
|jd | |j | |j t }| 
|j| d S )	Nr   test.pngr3   rD   r4   r*       )r.  r   r,   r5   getvalueassertRedirectsr   r+   r9   r   rO   r   firstwidthheightrv   r   	file_hashr   ro   rk   )r>   rU   r   rr   rw   r?   r?   r@   test_addh  s"   
zTestImageAddView.test_addc                 C   sH   |  dtdt j ddd}| |jd | |jd dd	 d
S )z6
        SVGs should be disallowed by default
        r   test.svg	text/htmlcontent_typer3   rK   formr5   QNot a supported image format. Supported formats: AVIF, GIF, JPG, JPEG, PNG, WEBP.N)	r.  r   r-   r5   rE  rO   rP   assertFormErrorr[   rT   r?   r?   r@   test_add_svg_denied  s   
z$TestImageAddView.test_add_svg_deniedsvgWAGTAILIMAGES_EXTENSIONSc                 C   sT   |  dtdt j ddd}| |td tjj	dd}| 
| d d S )	Nr   rL  rM  rN  r3   rD   rB  r*   )r.  r   r-   r5   rE  rF  r   r+   r9   r   rO   r   r>   rU   r   r?   r?   r@   test_add_svg  s   
zTestImageAddView.test_add_svgc                 C   s   t  }tdd|jd}||j  |d | d|d}| |t	d t
jjdd}| | d	 | }| |jd
 | |jd | |j | |j t }| |j| dS )z^
        Test that uploading large files (spooled to the filesystem) work as expected
        rA  	image/pngr
  r   r   r3   rD   rB  r*   rC  rD  N)r,   r   r2   writer5   rE  seekr.  rF  r   r+   r9   r   rO   r   rG  rH  rI  rv   r   rJ  r   ro   rk   )r>   test_image_fileuploaded_filerU   r   rr   rw   r?   r?   r@    test_add_temporary_uploaded_file  s*   

z1TestImageAddView.test_add_temporary_uploaded_filer   r   8wagtail.test.dummy_external_storage.DummyExternalStorageSTORAGESc                 C   sJ   |  dtdt j d}| |td | tj	j
dd  d S Nr   rA  r3   rD   rB  )r.  r   r,   r5   rE  rF  r   rv   r+   r9   r   existsrT   r?   r?   r@   #test_add_with_external_file_storage  s   	
z4TestImageAddView.test_add_with_external_file_storagec                 C   s@   |  ddi}| |jd | |d | |jd dd d S )Nr4   r   rK   r1  rP  r5   rN   )r.  rO   rP   rQ   rR  r[   rT   r?   r?   r@   test_add_no_file_selected  s   z*TestImageAddView.test_add_no_file_selectedr*   WAGTAILIMAGES_MAX_UPLOAD_SIZEc                 C   sj   t  j }| dtd|d}| |jd | |d | |j	d ddj
tt|td	d
 d S )Nr   rA  r3   rK   r1  rP  r5   zEThis file is too big ({file_size}). Maximum filesize {max_file_size}.r*   )r   max_file_size)r,   r5   rE  r.  r   rO   rP   rQ   rR  r[   formatr
   r   r>   file_contentrU   r?   r?   r@   test_add_too_large_file  s    
z(TestImageAddView.test_add_too_large_file)WAGTAILIMAGES_MAX_IMAGE_PIXELSc                 C   sT   t  j }| dtd|d}| |jd | |d | |j	d dd d S )	Nr   rA  r3   rK   r1  rP  r5   z9This file has too many pixels (307200). Maximum pixels 1.)
r,   r5   rE  r.  r   rO   rP   rQ   rR  r[   rj  r?   r?   r@   test_add_too_many_pixels  s   z)TestImageAddView.test_add_too_many_pixelsc                 C   s~   t  }|jdd}| dtdt j |jd}| 	|t
d tjjdd}| | d | }| |j| d S )	Nre   rf   r   rA  rj   rD   rB  r*   )r   ro   rp   r.  r   r,   r5   rE  rs   rF  r   r+   r9   r   rO   r   rG  rk   )r>   rw   rx   rU   r   rr   r?   r?   r@   test_add_with_collections-  s   z*TestImageAddView.test_add_with_collectionsc                 C   sX   t  }|jdd}| jtdd|j  }| |jd | 	|d|j d d S )NzTravel picsrf   r  r  rK   zoption value="z
" selected)
r   ro   rp   rF   rG   r   r  rO   rP   rR   )r>   rw   rk   rU   r?   r?   r@   !test_add_with_selected_collectionF  s   z2TestImageAddView.test_add_with_selected_collectionc                 C   st   t  }|jdd}tjjdt |d | dtdt j	
 |jd}| |jd | |d | |d d S )	Nre   rf   r   rj   rA  rK   r1  ;Custom image with this Title and Collection already exists.)r   ro   rp   r#   r9   r:   r,   r.  r   r5   rE  rs   rO   rP   rQ   rR   r>   rw   rx   rU   r?   r?   r@   %test_unique_together_validation_errorR  s(   z6TestImageAddView.test_unique_together_validation_errorN)r   r   r   rA   rG   r.  r9  r:  r;  r   r@  rK  rS  rX  r^  r   ra  rd  re  rl  rn  ro  rp  rs  r?   r?   r?   r@   r*    sB    	


&


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S )0TestImageAddViewWithLimitedCollectionPermissionsc                 C      t jjddd}t jjddd}t }|jdd| _tjjdd}|j	
| tjj|| j|d	 | jd
ddd}|j
| | jd
dd d S Nwagtailimages	add_imagecontent_type__app_labelcodenamewagtailadminaccess_adminre   rf   zEvil conspiratorsgrouprk   
permissionmoriartyzmoriarty@example.compasswordusernameemailr  r  r  r   r9   rG   r   ro   rp   rx   r   r:   permissionsr   r   create_usergroupsr7   r>   add_image_permissionadmin_permissionrw   conspirators_groupr8   r?   r?   r@   rA   s  (   z6TestImageAddViewWithLimitedCollectionPermissions.setUpc                 C   rB   r+  rE   rH   r?   r?   r@   rG     rJ   z4TestImageAddViewWithLimitedCollectionPermissions.getc                 C   rB   r+  r-  r/  r?   r?   r@   r.    rJ   z5TestImageAddViewWithLimitedCollectionPermissions.postc                 C   s2   |   }| |jd | |d | |d d S )NrK   r1  r2  )rG   rO   rP   rQ   rS   rT   r?   r?   r@   r9    s   z9TestImageAddViewWithLimitedCollectionPermissions.test_getc                 C   s@   | j jdd |  }| |jd | |d | |d d S )Nr   rf   rK   r2  r   )rx   rp   rG   rO   rP   rR   rT   r?   r?   r@   r;    s   zQTestImageAddViewWithLimitedCollectionPermissions.test_get_with_collection_nestingc                 C   sd   |  dtdt j d}| |td | tj	j
dd  | tj	jddj| j d S rb  )r.  r   r,   r5   rE  rF  r   rv   r+   r9   r   rc  rO   rG   rk   rx   rT   r?   r?   r@   rK    s   
z9TestImageAddViewWithLimitedCollectionPermissions.test_addN)	r   r   r   rA   rG   r.  r9  r;  rK  r?   r?   r?   r@   rt  r  s    rt  c                   @   s8  e Zd Zd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
ei ejdddiiddd Zdd Zdd Zdd Zdd Zei ejdddiiddd  Zd!d" Zd#d$ Zd%d& Zei ejdddiidd'd( Zd8d*d+Zd,d- Zd.d/ Zed0d0d1d2d3 Zed4d5d6d7 Zd)S )9TestImageEditViewc                 C   s.   |   | _tjjdt d| _| jjj| _d S Nr   r3   )	r7   r8   r+   r9   r:   r,   rr   r5   storager=   r?   r?   r@   rA     s   
zTestImageEditView.setUpc                 C   s   t jj| jjd| _d S )N)r  )r+   r9   rG   rr   r  r=   r?   r?   r@   update_from_db     z TestImageEditView.update_from_dbc                 C      | j td| jjfd|S Nr   r   rF   rG   r   rr   rs   rH   r?   r?   r@   rG        zTestImageEditView.getc                 C   r  r  rF   r.  r   rr   rs   r/  r?   r?   r@   r.    r  zTestImageEditView.postc                 C   s`   |   }| |jd | |d | |d | |d | tddddd	dg|j d S )
NrK   wagtailimages/images/edit.htmlr3  r4  rD   r5  r6  rX   r   )	rG   rO   rP   rQ   rR   rS   r8  r   rt   rT   r?   r?   r@   rV     s   zTestImageEditView.test_simplec                 C   r   r   r   r   r?   r?   r@   #test_simple_with_collection_nesting  r   z5TestImageEditView.test_simple_with_collection_nestingc                 C   s   t  }|jdd}tjjdtdd|d}tdd td	|j	i }| j
td
|j	fdd|i}| |jd | |d| d d S )Nre   rf   r   r0   r1   rj   rD   ?rm   r   r   nextrK   z<input type="hidden" value="z" name="next">)r   ro   rp   r+   r9   r:   r,   r   r   rs   rF   rG   rO   rP   rR   r>   rw   rx   rr   expected_next_urlrU   r?   r?   r@   %test_next_url_is_present_in_edit_form  s(   z7TestImageEditView.test_next_url_is_present_in_edit_formc                 C   J   |   }| |jd | |d | |d d| jj }| || d S )NrK   r  zUsed 0 times/admin/images/usage/%d/rG   rO   rP   rQ   rR   rr   rs   r>   rU   expected_urlr?   r?   r@   test_with_usage_count     z'TestImageEditView.test_with_usage_countr   r   r_  r`  c                 C   s&   |   }| |jd | |d d S )NrK   r  )rG   rO   rP   rQ   rT   r?   r?   r@   !test_simple_with_external_storage  s   z3TestImageEditView.test_simple_with_external_storagec                 C   sd   |  ddi}| |td |   | | jjd t| j}d| jj	 }| |
| j| d S )Nr4   EditedrD   z/admin/images/%d/)r.  rF  r   r  rO   rr   r4   r   r8   rs   get_edit_url)r>   rU   
url_finderr  r?   r?   r@   	test_edit+  s   
zTestImageEditView.test_editc                 C   s   t  }|jdd}tjjdtdd|d}tdd td	|j	i }| j
td
|j	fdd|j	|d}| || |  | |jd d S )Nre   rf   r   r0   r1   rj   rD   r  rm   r   r   r  )r4   rk   r  )r   ro   rp   r+   r9   r:   r,   r   r   rs   rF   r.  rF  refresh_from_dbrO   r4   r  r?   r?   r@   test_edit_with_next_url<  s.   z)TestImageEditView.test_edit_with_next_urlc                 C   sh   d| j _| j jtjjddd | j   | ddi}| 	|j
d t| j }| || j d S )NFr|  r}  ry  r4   r  .  )r8   is_superuseruser_permissionsr   r   r9   rG   r   r.  rO   rP   r   assertIsNoner  rr   )r>   rU   r  r?   r?   r@   "test_edit_with_limited_permissionsW  s   

z4TestImageEditView.test_edit_with_limited_permissionsc                 C   x   t  j }d| j_d| j_| j  | dtd|d}| 	|t
d |   | | jjd | | jjd d S Ni abcedfr  znew.pngr3   rD   r,   r5   rE  rr   r   rJ  r   r.  r   rF  r   r  assertNotEqualrj  r?   r?   r@   test_edit_with_new_image_filej  s   
z/TestImageEditView.test_edit_with_new_image_filec                 C   r  r  r  rj  r?   r?   r@   2test_edit_with_new_image_file_and_external_storage  s   	
zDTestImageEditView.test_edit_with_new_image_file_and_external_storagec                 C   s4   | j jd |  }| |jd | |d d S )NFrK   r  )rr   r5   deleterG   rO   rP   rQ   rT   r?   r?   r@   test_with_missing_image_file  s   z.TestImageEditView.test_with_missing_image_filec                 C   sf   t jjdt d}|jj|jj | j	t
d|jfd}| |jd | |d | |d d S )Nr   r3   r   r   rK   r  zFile not found)r+   r9   r:   r,   r5   r  r  rg   rF   rG   r   r  rO   rP   rQ   rR   )r>   rr   rU   r?   r?   r@   'check_get_missing_file_displays_warning  s   z9TestImageEditView.check_get_missing_file_displays_warningc                 C   r$  r%  r  r=   r?   r?   r@   ;test_get_missing_file_displays_warning_with_default_storage  r'  zMTestImageEditView.test_get_missing_file_displays_warning_with_default_storagec                 C   r$  r%  r  r=   r?   r?   r@   :test_get_missing_file_displays_warning_with_custom_storage  s   	zLTestImageEditView.test_get_missing_file_displays_warning_with_custom_storageNc                 C   s>   |d u r| j j}z|jr|d | W |  S |  w )Nrb)rr   r5   closedopenreadclose)r>   fr?   r?   r@   get_content  s   
zTestImageEditView.get_contentc                 C   sd  | j j}| j j}|  }| j d}| |j}| j j}t|tddj }|j	}| 
| j j|d}	| |	td |   | | j|j | | j| j jj | | j jjd|  | | j j| | | j j| | |  | | j d}
| |jj|
jj | | |
j| | t|j |  W d   dS 1 sw   Y  dS )z
        Checks that reuploading the image file with the same file name
        changes the file name, to avoid browser cache issues (see #3817).
        fill-5x5redcolourr3   rD   original_images/N)rr   r5   r   r  get_renditionfilenamer   r,   rE  r2   r.  r4   rF  r   r  r   r  rc  rg   rv   r  rO   assertRaisestypeDoesNotExistr  r>   old_fileold_sizeold_dataold_renditionold_rendition_datanew_namenew_filenew_sizerU   new_renditionr?   r?   r@   test_reupload_same_name  s:   
"z)TestImageEditView.test_reupload_same_namec                 C   s`  | j j}| j j}|  }| j d}| |j}d}t|tddj }|j}| 	| j j
|d}	| |	td |   | | j|j | | j| j jj | | j jjd|  | | j j| | | j j| | |  | | j d}
| |jj|
jj | | |
j| | t|j |  W d   dS 1 sw   Y  dS )	z}
        Checks that reuploading the image file with a different file name
        correctly uses the new file name.
        r  z test_reupload_different_name.pngr  r  r3   rD   r  N)rr   r5   r   r  r  r   r,   rE  r2   r.  r4   rF  r   r  r   r  rc  rg   rv   rO   r  r  r  r  r  r  r?   r?   r@   test_reupload_different_name  s:   
"z.TestImageEditView.test_reupload_different_nameT)USE_L10NUSE_THOUSAND_SEPARATORc                 C   sv   t jjdtddddddd}| jtd	|jfd
}| |d | |d | |d | |d | |d d S )Nr   )i   ip  r1   i   i  i  i  )r4   r5   focal_point_xfocal_point_yfocal_point_widthfocal_point_heightr   r   zdata-original-width="3840"zdata-focal-point-x="2048"zdata-focal-point-y="1001"zdata-focal-point-width="1009"zdata-focal-point-height="1002")	r+   r9   r:   r,   rF   rG   r   rs   rR   )r>   large_imagerU   r?   r?   r@   1test_no_thousand_separators_in_focal_point_editor  s    zCTestImageEditView.test_no_thousand_separators_in_focal_point_editorr<  r=  c                 C   sx   t  }|jdd}tjjdt d| _tjjdt |d | d|j	d}| 
|jd | |d	 | |d
 d S )Nre   rf   r   r3   r  rj   )r4   rk   rK   r  rq  )r   ro   rp   r#   r9   r:   r,   rr   r.  rs   rO   rP   rQ   rR   rr  r?   r?   r@   rs  *  s&   z7TestImageEditView.test_unique_together_validation_errorr%  )r   r   r   rA   r  rG   r.  rV   r  r  r  r   r   ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rs  r?   r?   r?   r@   r    sj    	





(
(
r  r<  r=  c                   @   (   e Zd Zdd Zi fddZdd ZdS )%TestImageEditViewWithCustomImageModelc                 C   s,   |    tjjdt d| _| jjj| _d S r  )r7   r#   r9   r:   r,   rr   r5   r  r=   r?   r?   r@   rA   M  s   z+TestImageEditViewWithCustomImageModel.setUpc                 C   r  r  r  rH   r?   r?   r@   rG   X  r  z)TestImageEditViewWithCustomImageModel.getc                 C   s>   |   }| |jd | |d | |d | |d d S )NrK   r  r3  r4  r?  rT   r?   r?   r@   r@  ]  s
   zFTestImageEditViewWithCustomImageModel.test_get_with_custom_image_modelN)r   r   r   rA   rG   r@  r?   r?   r?   r@   r  K  s    r  c                   @   \   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S )TestImageDeleteViewc                 C   s6   |   | _tjjdt d| _td| jjfd| _	d S )Nr   r3   wagtailimages:deleter   )
r7   r8   r+   r9   r:   r,   rr   r   rs   
delete_urlr=   r?   r?   r@   rA   j  s   
zTestImageDeleteView.setUpc                 C   s   | j | j|S r%  )rF   rG   r  rH   r?   r?   r@   rG   u  s   zTestImageDeleteView.getc                 K   s   | j j| j|fi |S r%  )rF   r.  r  )r>   r0  kwargsr?   r?   r@   r.  x  r  zTestImageDeleteView.postc                 C   sl   |   }| |jd | |d | |d | |d | |d | |d | |d| j d d S )	NrK   (wagtailimages/images/confirm_delete.html&wagtailadmin/shared/usage_summary.htmlCOne or more references to this image prevent it from being deleted.Yes, deleteNo, don't deleter   " method="POST">)rG   rO   rP   rQ   rS   rR   r  rT   r?   r?   r@   rV   {  s   zTestImageDeleteView.test_simplec                 C   r  )NrK   r  z This image is referenced 0 timesr  r  r  r?   r?   r@   test_usage_link  r  z#TestImageDeleteView.test_usage_linkc                 C   s`   | j dd}| |td tjjdd}| | d | dd |jd	 D t	d
g d S )NT)followrD   r   rB  r   c                 S   s   g | ]}|j  qS r?   )messager   )r   mr?   r?   r@   r     s    z3TestImageDeleteView.test_delete.<locals>.<listcomp>messageszImage 'Test image' deleted.)
r.  rF  r   r+   r9   r   rO   r   r[   r   rW  r?   r?   r@   test_delete  s   zTestImageDeleteView.test_deletec                 C   sF   d| j _| j jtjjddd | j   |  }| 	|j
d d S )NFr|  r}  ry  r  )r8   r  r  r   r   r9   rG   r   r.  rO   rP   rT   r?   r?   r@   $test_delete_with_limited_permissions  s   
z8TestImageDeleteView.test_delete_with_limited_permissionsc                 C   s   | j dd tjj| jd W d    n1 sw   Y  |  }| |jd | |d | |d | 	|t
d| jjfdd	  | 	|d
 | |d | |d | |d | |d| j d d S )NTexecuteprotected_imagerK   r  r  wagtailimages:image_usager   z?describe_on_delete=1r  z+Are you sure you want to delete this image?r  r  r   r  )captureOnCommitCallbacksr&   r9   r:   rr   rG   rO   rP   rQ   rR   r   rs   rS   r  rT   r?   r?   r@   (test_delete_get_with_protected_reference  s0   z<TestImageDeleteView.test_delete_get_with_protected_referencec                 C   st   | j dd tjj| jd W d    n1 sw   Y  |  }| |td | t	jj
| jjd  d S )NTr  r  wagtailadmin_homers   )r  r&   r9   r:   rr   r.  rF  r   rv   r+   r   rs   rc  rT   r?   r?   r@   )test_delete_post_with_protected_reference  s    z=TestImageDeleteView.test_delete_post_with_protected_referenceN)r   r   r   rA   rG   r.  rV   r  r  r  r   r  r?   r?   r?   r@   r  i  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S )	TestUsagec                 C       |    tjjdt d| _d S r  r7   r+   r9   r:   r,   rr   r=   r?   r?   r@   rA     
   zTestUsage.setUpc                 C   s   | j dd& tjjdd}|jtdd| jtj	 dddd	d

   W d    n1 s/w   Y  | jtd| jjgd}| |d | |d | j|ddd d S )NTr  rl   r  	Christmas	christmasprivateTestr4   slug
feed_image	date_fromaudiencelocationcostinstancer  r   <table class="listing"><td>Event page</td>r   )r  r    r9   rG   rp   r%   rr   datetimedatetodaysave_revisionpublishrF   r   rs   rR   )r>   	home_pagerU   r?   r?   r@   test_usage_page  s*   
zTestUsage.test_usage_pagec                 C   s*   | j td| jjgd}| |d d S )Nr  r   r  )rF   rG   r   rr   rs   rS   rT   r?   r?   r@   test_usage_page_no_usage  s   z"TestUsage.test_usage_page_no_usagec                 C   sn   | j dd | jjd | j  W d    n1 sw   Y  | jtd| jjgd}| 	|d d S )NTr  illustrationr  r   r  )
r  rr   r   r   r   rF   rG   r   rs   rS   rT   r?   r?   r@   test_usage_no_tags  s   zTestUsage.test_usage_no_tagsc                 C   s<  | j dd& tjjdd}|jtdd| jtj	 dddd	d

   W d    n1 s/w   Y  | jdddd}tjjddd}tjjddd}tjjdd| _tjj| jt |d |j| j |j| | jddd | jtd| jjgd}| |jd | |d | |d | j|ddd d S )NTr  rl   r  r  r	  r
  r  r  r  
changeonlychangeonly@example.comr  r  rw  change_imagery  r|  r}  Image changersrf   r~  r  r  r   rK   z(Private page)r  r  )r  r    r9   rG   rp   r%   rr   r  r  r  r  r  r  r   r   r:   changers_groupr   r   ro   r  r   r  r7   rF   r   rs   rO   rP   rS   rR   )r>   r  r8   change_permissionr  rU   r?   r?   r@   +test_usage_page_with_only_change_permission  sP   
z5TestUsage.test_usage_page_with_only_change_permissionc                 C   s   | j dddd}tjjddd}tjjdd	d}tjjd
d| _tjj| jt	 |d |j
| j |j| | jddd | jtd| jjgd}| |jd d S )Naddonlyzaddonly@example.comr  r  rw  rx  ry  r|  r}  Image addersrf   r~  r  r  r   r  )r  r   r9   rG   r   r:   adders_groupr   r   ro   r  r   r  r7   rF   r   rr   rs   rO   rP   )r>   r8   add_permissionr  rU   r?   r?   r@   )test_usage_page_without_change_permission/  s,   z3TestUsage.test_usage_page_without_change_permissionN)	r   r   r   rA   r  r  r!  r(  r-  r?   r?   r?   r@   r    s    	.r  c                   @   s   e Zd Zdd Zi fddZdd Zdd Zeg d	d
dd Zdd Z	edddd Z
dd Zdd Zedddd Zdd Zdd Zedd d!iid"d#d$ Zd%S )&TestImageChooserViewc                 C      |   | _d S r%  r7   r8   r=   r?   r?   r@   rA   M     zTestImageChooserView.setUpc                 C   rB   Nwagtailimages_chooser:chooserE   rH   r?   r?   r@   rG   P  rJ   zTestImageChooserView.getc                 C   s|   |   }| |jd t|j }| |d d | |d | d|d  | 	|d }| |
d dd	 d S )
NrK   stepchoose"wagtailimages/chooser/chooser.htmlr4  r   input[type="file"]acceptzimage/*)rG   rO   rP   jsonloadsrt   ru   rQ   assertNotInr   r   r>   rU   response_jsonr   r?   r?   r@   rV   S  s   z TestImageChooserView.test_simplec                 C   r   r   r   r   r?   r?   r@   r  a  r   z8TestImageChooserView.test_simple_with_collection_nesting)gifjpgjpegpngwebpavifheicrU  c                 C   sl   |   }| |jd t|j }| |d d | |d | |d }| |	d dd d S )	NrK   r4  r5  r6  r   r7  r8  zimage/*, image/heic)
rG   rO   rP   r9  r:  rt   ru   rQ   r   r   r<  r?   r?   r@   test_upload_field_accepts_heicj  s   z3TestImageChooserView.test_upload_field_accepts_heicc           
      C   s  t jjdd}tjjddd}|j| tjjt d}|j	tddd}t
jj||tjjd	d
dd |j	tddd}| jddd}|j| | jddd tjjdt |d}tjjdt |d}|  }	| |	jd | |	d | |	|j | |	|j | |	d t
jjt jjddtjjddtjjd	d
dd |  }	| |	jd | |	d | |	|j | |	|j | |	d d S )NBakersrf   r|  r}  ry  r  Bakeryr  rw  choose_imager~  Officebakerr  r  zSweetBuns.jpgrj   zPromotionalPoster.jpgrK   r6  r   )r   r9   r:   r   rG   r  r   r   r"   rp   r   r  r  r7   r+   r,   rO   rP   rQ   rR   r4   rS   )
r>   bakers_groupaccess_admin_permrootbakery_collectionoffice_collectionrJ  
sweet_bunsposterrU   r?   r?   r@   test_choose_permissionsz  s^   	z,TestImageChooserView.test_choose_permissionsr<  r=  c                 C   sf   |   }| |jd t|j }| |d d | |d | d|d  | d|d  d S )NrK   r4  r5  r6  z)name="image-chooser-upload-fancy_caption"r   r4  )	rG   rO   rP   r9  r:  rt   ru   rQ   r  r>   rU   r=  r?   r?   r@   test_with_custom_image_model  s   z1TestImageChooserView.test_with_custom_image_modelc                 C   s2   |  ddi}| |jd | |jd d d S )NrW   HellorK   search_queryr   rT   r?   r?   r@   r    s   z TestImageChooserView.test_searchc                 C   s<   |  ddi}| |jd |  ddi}| |jd d S )Nr`   r*   rK   i'    ra   rT   r?   r?   r@   rd     s   z$TestImageChooserView.test_pagination   )WAGTAILIMAGES_CHOOSER_PAGE_SIZEc                 C   sF   dd t ddD }tj| |  }| |d | |jd d S )Nc                 S   r   r   r   r   r?   r?   r@   r     r   z?TestImageChooserView.test_chooser_page_size.<locals>.<listcomp>r*   r   zPage 1 of 3rK   )rq   r+   r9   r   rG   rR   rO   rP   )r>   r   rU   r?   r?   r@   test_chooser_page_size  s   z+TestImageChooserView.test_chooser_page_sizec                 C   sv   t ddD ]}tjjd| t d}|d dkr|jd q| ddi}| |j	d | 
|d	 | |d
 d S )Nr   r	  z.Test image %d is even better than the last oner3   rl   r   r   rK   zTest image 2 is even betterzTest image 3 is even better)rq   r+   r9   r:   r,   r   r   rG   rO   rP   rR   rS   )r>   ry   rr   rU   r?   r?   r@   test_filter_by_tag  s   z'TestImageChooserView.test_filter_by_tagc                    s   t jjdt  jd}t jjdt d  fdd} d|   }W d    n1 s/w   Y   t|j	d d	  |j	d d
 | d S )NTest image shownr4   r5   uploaded_by_userTest image not shownr3   c                       | j  jdS N)r^  r   r8   r   r   r=   r?   r@   filter_images     zOTestImageChooserView.test_construct_queryset_hook_browse.<locals>.filter_images construct_image_chooser_querysetresultsr*   r   
r+   r9   r:   r,   r8   register_hookrG   rO   r   r[   r>   rr   rd  rU   r?   r=   r@   #test_construct_queryset_hook_browse  s   
z8TestImageChooserView.test_construct_queryset_hook_browser   r   r   r   c                 C   s   |  d |   W d    n1 sw   Y  tdD ]}tjjd| tddd| _q|  d |   W d    n1 sBw   Y  |  d |   W d    d S 1 s\w   Y  d S )	N   r   ri   r0   r1   r3   r   r	  )r   rG   rq   r+   r9   r:   r,   rr   r   r?   r?   r@   r     s   



"z%TestImageChooserView.test_num_queriesN)r   r   r   rA   rG   rV   r  r   rE  rR  rT  r  rd   rZ  r[  rk  r   r?   r?   r?   r@   r.  L  s,    	
I


r.  c                   @   r"  )	TestImageChooserViewSearchr   c                 C   r/  r%  r0  r=   r?   r?   r@   rA   3  r1  z TestImageChooserViewSearch.setUpc                 C   rB   r2  rE   rH   r?   r?   r@   rG   6  rJ   zTestImageChooserViewSearch.getc                    s   t jjdt  jd}t jjdt d  fdd} d|  dd	i}W d    n1 s2w   Y   t|j	d
 d  |j	d
 d | d S )Nr\  r]  r_  r3   c                    r`  ra  rb  rc  r=   r?   r@   rd  D  re  zUTestImageChooserViewSearch.test_construct_queryset_hook_search.<locals>.filter_imagesrf  rW   r  rg  r*   r   rh  rj  r?   r=   r@   #test_construct_queryset_hook_search9  s   z>TestImageChooserViewSearch.test_construct_queryset_hook_searchN)r   r   r   r!  rA   rG   rn  r?   r?   r?   r@   rm  0  r)  rm  c                   @   s0   e Zd Zdd Zi fddZdd Zdd Zd	S )
TestImageChooserChosenViewc                 C   s"   |    tjjdt dd| _d S )Nr   Test descriptionr4   r5   descriptionr  r=   r?   r?   r@   rA   P  s   z TestImageChooserChosenView.setUpc                 C   r  )Nwagtailimages_chooser:chosenr   r  rH   r?   r?   r@   rG   Z  r  zTestImageChooserChosenView.getc                 C   s   |   }| |jd t|j }| |d d | |d d d | t|d d  h d | |d d	 d
 d S )NrK   r4  chosenresultr4   r   preview>   r  rH  rI  default_alt_textrp  )	rG   rO   rP   r9  r:  rt   ru   setkeysrS  r?   r?   r@   rV   _  s   z&TestImageChooserChosenView.test_simplec                 C   s   | j ddid}| |jd t|j }| |d d | t|d d | |d d d	 d
 | t|d d d 	 h d | |d d d d d S )Nmultipler*   rI   rK   r4  rt  ru  r   r4   r   rv  >   r  rH  rI  rw  rp  )
rG   rO   rP   r9  r:  rt   ru   r   rx  ry  rS  r?   r?   r@   test_with_multiple_flagm  s   z2TestImageChooserChosenView.test_with_multiple_flagN)r   r   r   rA   rG   rV   r|  r?   r?   r?   r@   ro  O  s
    
ro  c                   @   r  )"TestImageChooserChosenMultipleViewc                 C   sN   |    tjjdt dd| _tjjdt dd| _tjjdt dd| _d S )Nr   rp  rq  Another test imageAnother test descriptionzUnchosen test imagezUnchosen test description)r7   r+   r9   r:   r,   image1image2image3r=   r?   r?   r@   rA     s    z(TestImageChooserChosenMultipleView.setUpc                 C   s"   | j dtd| jj| jjf S )Nz%s?id=%d&id=%dz%wagtailimages_chooser:chosen_multiple)rF   rG   r   r  r  r  rH   r?   r?   r@   rG     s   z&TestImageChooserChosenMultipleView.getc                 C   s   |   }| |jd t|j }| |d d | t|d d dd |d D }| |dd	h d
d |d D }| |ddh d S )NrK   r4  rt  ru  rl   c                 S      h | ]}|d  qS rB  r?   r   itemr?   r?   r@   	<setcomp>      z>TestImageChooserChosenMultipleView.test_get.<locals>.<setcomp>r   r~  c                 S   r  )rw  r?   r  r?   r?   r@   r    r  rp  r  )rG   rO   rP   r9  r:  rt   ru   r   )r>   rU   r=  titles	alt_textsr?   r?   r@   r9    s   z+TestImageChooserChosenMultipleView.test_getN)r   r   r   rA   rG   r9  r?   r?   r?   r@   r}    s    
r}  c                   @   r  ) TestImageChooserSelectFormatViewc                 C   r  r  r  r=   r?   r?   r@   rA     r  z&TestImageChooserSelectFormatView.setUpc                 C   r  N#wagtailimages_chooser:select_formatr   r  rH   r?   r?   r@   rG        z$TestImageChooserSelectFormatView.getc                 C   r  r  r  r/  r?   r?   r@   r.    r  z%TestImageChooserSelectFormatView.postc                 C   sF   |   }| |jd t|j }| |d d | |d d S )NrK   r4  select_formatz(wagtailimages/chooser/select_format.html)rG   rO   rP   r9  r:  rt   ru   rQ   rS  r?   r?   r@   rV     s
   z,TestImageChooserSelectFormatView.test_simplec                 C   s:   | j ddid}| |jd | |d | |d d S )Nalt_textzsome previous alt textr{  rK   z value=\"some previous alt text\"=id=\"id_image-chooser-insertion-image_is_decorative\" checked)rG   rO   rP   rR   rS   rT   r?   r?   r@   test_with_edit_params  s   z6TestImageChooserSelectFormatView.test_with_edit_paramsc                 C   s.   | j ddid}| |jd | |d d S )Nr  rX   r{  rK   r  )rG   rO   rP   rR   rT   r?   r?   r@   5test_with_edit_params_no_alt_text_marks_as_decorative  s
   zVTestImageChooserSelectFormatView.test_with_edit_params_no_alt_text_marks_as_decorativec                 C   s   |  dddd}| |jd | |d d t|j }| |d d	 |d
 }| |d t| jj	 | |d d | |d d | |d d | 
d|d  d S )NleftFArthur "two sheds" Jackson)image-chooser-insertion-format+image-chooser-insertion-image_is_decorative image-chooser-insertion-alt_textrK   Content-Typeapplication/jsonr4  rt  ru  rs   r4   r   ri  altz*alt="Arthur &quot;two sheds&quot; Jackson"r   )r.  rO   rP   r9  r:  rt   ru   strrr   rs   r  r>   rU   r=  ru  r?   r?   r@   test_post_response  s    z3TestImageChooserSelectFormatView.test_post_responsec                 C   sN   |  dddd}t|j }|d }| |d d | d|d	  d S )
Nr  r  Tr  r  r  ru  r  rX   zalt=""r   )r.  r9  r:  rt   ru   rO   r  r  r?   r?   r@   8test_post_response_image_is_decorative_discards_alt_text  s   zYTestImageChooserSelectFormatView.test_post_response_image_is_decorative_discards_alt_textc                 C   s6   |  dddd}t|j }| d|d  d S )Nr  rX   Fr  z@Please add some alt text for your image or mark it as decorativer   )r.  r9  r:  rt   ru   r  rS  r?   r?   r@   ;test_post_response_image_is_not_decorative_missing_alt_text  s   z\TestImageChooserSelectFormatView.test_post_response_image_is_not_decorative_missing_alt_textN)r   r   r   rA   rG   r.  rV   r  r  r  r  r  r?   r?   r?   r@   r    s    	r  c                   @   s   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ei ejdddiiddd Zedddd ZdS )TestImageChooserUploadViewc                 C   r$  r%  r&  r=   r?   r?   r@   rA     r'  z TestImageChooserUploadView.setUpc                 C   rB   )Nwagtailimages_chooser:createrE   rH   r?   r?   r@   rG     rJ   zTestImageChooserUploadView.getc                 C   sF   |   }| |jd | |d t|j }| |d d d S )NrK   /wagtailadmin/generic/chooser/creation_form.htmlr4  reshow_creation_form)rG   rO   rP   rQ   r9  r:  rt   ru   rS  r?   r?   r@   rV     s   z&TestImageChooserUploadView.test_simplec                 C   s   | j tddtdt j d}| |jd t	j
jdd}| | d | }| |jd | |jd	 | |j | |j d S )
Nr  r   rA  image-chooser-upload-titleimage-chooser-upload-filerK   rB  r*   rC  rD  )rF   r.  r   r   r,   r5   rE  rO   rP   r+   r9   r   r   rG  rH  rI  rv   r   rJ  )r>   rU   r   rr   r?   r?   r@   test_upload  s    z&TestImageChooserUploadView.test_uploadc                 C   sH   | j tdddi}| |jd | |d | |jd dd d S )	Nr  r  r   rK   r  rP  r5   rN   )rF   r.  r   rO   rP   rQ   rR  r[   rT   r?   r?   r@   test_upload_no_file_selected6  s   z7TestImageChooserUploadView.test_upload_no_file_selectedc           	         s  d fdd	}|  |dd}  |jd  |d t }|jjdd}|jjdd}  |jd |   |jd	 | td
|jfd}  |jd | td|jfdd t	dtd
|jfdi }  |jd | t
|j }  |d d d S )Nr   c                    &    j td| tdt j dS )Nr  rA  r  rF   r.  r   r   r,   r5   rE  rB  r=   r?   r@   
post_imageJ     zDTestImageChooserUploadView.test_upload_duplicate.<locals>.post_imageTest duplicate imagerB  rK   z3wagtailimages/chooser/confirm_duplicate_upload.html	new_imageexisting_imagers  r   confirm_duplicate_upload_actionr  r  r  cancel_duplicate_upload_actionr4  duplicate_foundr   )rO   rP   rQ   r   r9   rG   r[   r   rs   r   r9  r:  rt   ru   	r>   r  rU   r+   r  r  choose_new_image_actionchoose_existing_image_actionr=  r?   r=   r@   test_upload_duplicateI  sF   

z0TestImageChooserUploadView.test_upload_duplicatec           	         s   d fdd	}|  |dd}  |jd t }|jjdd}|jjdd}td|jfdd	 }  |jd
 | td|jfdd tdtd|jfdd	 i }  |jd | t	
|j }  |d d d S )Nr   c                    s*    j tdd | tdt j dS )Nr  ?select_format=truerA  r  r  rB  r=   r?   r@   r    s   
zRTestImageChooserUploadView.test_upload_duplicate_select_format.<locals>.post_imager  rB  rK   r  r   r  r  r  r  r  r  r4  r  r  )rO   rP   r   r9   rG   r   rs   r[   r   r9  r:  rt   ru   r  r?   r=   r@   #test_upload_duplicate_select_format  sB   

z>TestImageChooserUploadView.test_upload_duplicate_select_formatc                 C   sl   t dd }| j|dtddd}| |jd | |d | |jd	 d
d d| }| 	|| d S )Nr  r  r   znot_an_image.txts   this is not an imager  rK   r  rP  r5   YUpload a valid image. The file you uploaded was either not an image or a corrupted image.action=\"%s\")
r   rF   r.  r   rO   rP   rQ   rR  r[   rR   r>   
submit_urlrU   expected_action_attrr?   r?   r@   /test_select_format_flag_after_upload_form_error  s(   
zJTestImageChooserUploadView.test_select_format_flag_after_upload_form_errorc                 C   st   t dd }| j|dtdt j d}| |jd | 	|d | 
|jd d	d
 d| }| || dS )zc
        Check the error message is accruate for a valid imate bug invalid file extension.
        r  r  zaccidental markdown extensionznot-an-image.mdr  rK   r  rP  r5   rQ  r  N)r   rF   r.  r   r,   r5   rE  rO   rP   rQ   rR  r[   rR   r  r?   r?   r@   =test_select_format_flag_after_upload_form_error_bad_extension  s(   
zXTestImageChooserUploadView.test_select_format_flag_after_upload_form_error_bad_extensionr   r   r_  r`  c                 C   sP   | j tddtdt j d}| |jd | 	t
jjdd  d S )Nr  r   rA  r  rK   rB  )rF   r.  r   r   r,   r5   rE  rO   rP   rv   r+   r9   r   rc  rT   r?   r?   r@   !test_upload_with_external_storage  s   	z<TestImageChooserUploadView.test_upload_with_external_storager<  r=  c                 C   s|   t  }|jdd}tjjdt |d | jt	ddt
dt j |jd}| |jd | |d	 | |d
 d S )Nre   rf   r   rj   r  rA  )r  r  zimage-chooser-upload-collectionrK   r  rq  )r   ro   rp   r#   r9   r:   r,   rF   r.  r   r   r5   rE  rs   rO   rP   rQ   rR   rr  r?   r?   r@   test_unique_together_validation	  s.   z:TestImageChooserUploadView.test_unique_together_validationN)r   r   r   rA   rG   rV   r  r  r  r  r  r  r   r   ra  r  r  r?   r?   r?   r@   r    s,    	85
r  c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
0TestImageChooserUploadViewWithLimitedPermissionsc                 C   ru  rv  r  r  r?   r?   r@   rA   +	  r  z6TestImageChooserUploadViewWithLimitedPermissions.setUpc                 C   :   | j td}| |jd | |d | |d d S )Nr  rK   r  r2  rF   rG   r   rO   rP   rQ   rS   rT   r?   r?   r@   r9  E	  s   z9TestImageChooserUploadViewWithLimitedPermissions.test_getc                 C   r  )Nr3  rK   r6  r2  r  rT   r?   r?   r@   test_get_chooserS	  s   zATestImageChooserUploadViewWithLimitedPermissions.test_get_chooserc                 C   s   | j tddtdt j d}| |jd t	j
jdd}| | d | t	j
jdd  | t	j
jddj| j d S )Nr  r   rA  r  rK   rB  r*   )rF   r.  r   r   r,   r5   rE  rO   rP   r+   r9   r   r   rv   rc  rG   rk   rx   rW  r?   r?   r@   rK  _	  s   
z9TestImageChooserUploadViewWithLimitedPermissions.test_addN)r   r   r   rA   r9  r  rK  r?   r?   r?   r@   r  *	  s
    r  c                   @   s   e Zd ZdZdd Zdd Zedddd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zeddg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)S )*TestMultipleImageUploaderz_
    This tests the multiple image upload views located in wagtailimages/views/multiple.py
    c                 C   s"   |   | _tjjdt d| _d S r  )r7   r8   r+   r9   r:   r,   rr   r=   r?   r?   r@   rA   ~	  s
   
zTestMultipleImageUploader.setUpc                 C   sf   | j td}| |jd | |d | |d | tdt| j	j
jddddg|j d	S )
R
        This tests that the add view responds correctly on a GET request
        r  rK   wagtailimages/multiple/add.htmlr4  rD   r6  rX   z
Add imagesN)rF   rG   r   rO   rP   rQ   rS   r8  r   rr   _metaverbose_name_pluralrt   rT   r?   r?   r@   rK  	  s   z"TestMultipleImageUploader.test_add  rf  c                 C   s8   | j td}| |jd d | |jd d d S )Nr  max_filesizer  error_max_file_sizeu3   This file is too big. Maximum filesize 1000 bytes.)rF   rG   r   rO   r[   rT   r?   r?   r@   (test_add_max_file_size_context_variables	  s   zBTestMultipleImageUploader.test_add_max_file_size_context_variablesc           	      C      t d}d}| j|}| |jd | || d}t|j}| || | t	|| t
 |}| j|_|j }tt||d< t|||d}| || | t	|| d S )Nr  r  rK   z=Too big. <br/><br/><a href='/admin/images/add/'>Try this.</a>r  r[   r   r   rF   rG   rO   rP   rQ   r   rt   r;  r   r   r8   context_datacopyr   r   r  	r>   r  template_namerU   r  response_contentr   r[   r   r?   r?   r@   $test_add_error_max_file_size_escaped	  (   

z>TestMultipleImageUploader.test_add_error_max_file_size_escapedc           	      C   r  )Nr  r  rK   z1Invalid image type. <a href='/help'>Get help.</a>error_accepted_file_typesr  r  r  r?   r?   r@   *test_add_error_accepted_file_types_escaped	  r  zDTestMultipleImageUploader.test_add_error_accepted_file_types_escapedc                 C   s  | j tddtdt j d}| |jd | |d d | 	|d | 
d	|j | |jd	 jd | |jd	 j | |jd	 j t jjdd
}| d|j | 
d|j | 
d|j | |jd d|jd	 j  | |jd d|jd	 j  | |jd jd d t|j }| 
d| | 
d| | 
d| | 
d| | |d |jd	 j | |d  | |d  dS )i
        This tests that a POST request to the add view saves the image and returns an edit form
        r  
test titlerA  r4   files[]rK   r  r  3wagtailadmin/generic/multiple_upload/edit_form.htmlrr   rB  r4   .pngrP  edit_action/admin/images/multiple/%d/delete_action!/admin/images/multiple/%d/delete/image_idsuccess	duplicateN)rF   r.  r   r   r,   r5   rE  rO   rP   rQ   r  r[   r4   rv   r   rJ  r   r9   rG   r;  r  rs   initialr9  r:  rt   ru   r   r>   rU   rr   r=  r?   r?   r@   test_add_post	  sL   z'TestMultipleImageUploader.test_add_postc                 C   s   | j jtddtdt j idd}| |jd | |d d | 	d	|j
 | |j
d	 j | |j
d	 j t jjdd
}| d|j | 	d|j | 	d|j
 | |j
d jd d t|j }| 	d| | 	d| dS )zv
        A POST request to the add view without the title value saves the image and uses file title if needed
        r  r  zno-title.pngXMLHttpRequest)HTTP_X_REQUESTED_WITHrK   r  r  rr   rB  r  rP  r4   r  N)rF   r.  r   r   r,   r5   rE  rO   rP   r  r[   rv   r   rJ  r   r9   rG   r  r  r9  r:  rt   ru   r  r?   r?   r@   test_add_post_no_title
  s*   z0TestMultipleImageUploader.test_add_post_no_titlec                 C   s$   | j tdi }| |jd dS )zX
        This tests that the add view checks for a file when a user POSTs to it
        r    N)rF   r.  r   rO   rP   rT   r?   r?   r@   test_add_post_nofile7
  s   z.TestMultipleImageUploader.test_add_post_nofilec                 C      | j tddtddi}| |jd | |d d t|j	 }| 
d| | 
d	| | d
| | d| | |d
  | |d d dS zQ
        The add view must check that the uploaded file is a valid image
        r  r  rA  s   This is not an image!rK   r  r  r  rP  r  error_messager  NrF   r.  r   r   rO   rP   r9  r:  rt   ru   r;  r  r   rS  r?   r?   r@   test_add_post_badfile@
  "   
z/TestMultipleImageUploader.test_add_post_badfiler?  r>  rU  c                 C   sD  | j tddtdt j i}| j tddtdt j i}| |jd | |d d t	
|j }| d| | d	| | d
| | d| | |d
  | |d d | |jd | |d d t	
|j }| d| | d	| | d
| | d| | |d
  | |d d dS )zU
        The add view must check that the uploaded file extension is a valid
        r  r  ztest.txtrA  rK   r  r  r  rP  r  r  z:Not a supported image format. Supported formats: JPG, GIF.N)rF   r.  r   r   r,   r5   rE  rO   rP   r9  r:  rt   ru   r;  r  r   )r>   rU   post_with_invalid_extensionr=  r?   r?   r@   test_add_post_bad_extension[
  sP   		z5TestMultipleImageUploader.test_add_post_bad_extensionc                    s   d fdd	}|  |dd}  |jd  |d   |jd jd t|j } 	d	|  	d
|  
|d   
|d  dS )z
        When a duplicate image is saved, the add view shows that it's a duplicate
        and prompts user to confirm the upload.
        r  c                    r  Nr  rA  r  r  rB  r=   r?   r@   r  
  r  zETestMultipleImageUploader.test_add_post_duplicate.<locals>.post_imagetest title duplicaterB  rK   2wagtailimages/images/confirm_duplicate_upload.htmlrr   rP  confirm_duplicate_uploadr  r  Nr  )rO   rP   rQ   r[   r4   r9  r:  rt   ru   r  rv   r>   r  rU   r=  r?   r=   r@   test_add_post_duplicate
  s   
z1TestMultipleImageUploader.test_add_post_duplicatec                    s   t jjdd}tjjddd}|j| tjjt d}|j	tddd t
jj| tjjd	d
dd d fdd	}|  dj_jj| j  |dd}|jd |d |jd jd t|j }|d  |d  d| d| dS )z
        When a duplicate image is added but the user doesn't have permission to choose the original image,
        the add views lets the user upload it as if it weren't a duplicate.
        rF  rf   r|  r}  ry  r  rG  r  rw  rx  r~  r  c                    s*   j td| tdt j  jdS )Nr  rA  )r4   r  rk   )rF   r.  r   r   r,   r5   rE  rs   rB  rN  r>   r?   r@   r  
  s   zWTestMultipleImageUploader.test_add_post_duplicate_choose_permission.<locals>.post_imageFr  rB  rK   r  rr   r  r  rP  r  Nr  )r   r9   r:   r   rG   r  r   r   r"   rp   r   r8   r  r  r   rO   rP   assertTemplateNotUsedr[   r4   r9  r:  rt   ru   rv   r   r  r;  )r>   rK  rL  rM  r  rU   r=  r?   r  r@   )test_add_post_duplicate_choose_permission
  s<   

zCTestMultipleImageUploader.test_add_post_duplicate_choose_permissionc                 C   ,   | j td| jjfd}| |jd dS )zl
        This tests that a GET request to the edit view returns a 405 "METHOD NOT ALLOWED" response
        wagtailimages:edit_multipler     NrF   rG   r   rr   rs   rO   rP   rT   r?   r?   r@   test_edit_get
     z'TestMultipleImageUploader.test_edit_getc                 C   s   | j td| jjfdd| jj dd| jj di}| |jd | |d d	 t|j	
 }| d
| | d| | d| | |d
 | jj | |d  tjj| jjd}| |jd | d|j  dS )Q
        This tests that a POST request to the edit view edits the image
        r  r   image-%d-title
New title!image-%d-tagszcromarty, finisterrerK   r  r  r  rP  r  r  cromartyN)rF   r.  r   rr   rs   rO   rP   r9  r:  rt   ru   r  r;  rv   r+   r9   rG   r4   r   names)r>   rU   r=  rr   r?   r?   r@   test_edit_post  s"   	z(TestMultipleImageUploader.test_edit_postc                 C   s   | j td| jjfdd| jj dd| jj di}| |jd | |d d | |d	 | |j	d
 dd t
|j }| d| | d
| | d| | |d | jj | |d  dS )z
        This tests that a POST request to the edit page returns a json document with "success=False"
        and a form with the validation error indicated
        r  r   r  rX   r  rK   r  r  r  rP  r4   rN   r  r  N)rF   r.  r   rr   rs   rO   rP   rQ   rR  r[   r9  r:  rt   ru   r  r   rS  r?   r?   r@   test_edit_post_validation_error&  s(   	z9TestMultipleImageUploader.test_edit_post_validation_errorc                 C   r  )zn
        This tests that a GET request to the delete view returns a 405 "METHOD NOT ALLOWED" response
        wagtailimages:delete_multipler   r  Nr  rT   r?   r?   r@   test_delete_getH  r
  z)TestMultipleImageUploader.test_delete_getc                 C   s   | j td| jjfd}| |jd | |d d | tj	j
| jjd  t|j }| d| | d| | |d | jj | |d  d	S )
U
        This tests that a POST request to the delete view deletes the image
        r  r   rK   r  r  r  r  r  N)rF   r.  r   rr   rs   rO   rP   r   r+   r9   r   rc  r9  r:  rt   ru   r  rv   rS  r?   r?   r@   test_delete_postT  s   z*TestMultipleImageUploader.test_delete_postN)r   r   r   __doc__rA   rK  r   r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r?   r?   r?   r@   r  y	  s*    	
	6%	
7'B"r  c                   @   sX   e Zd 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S )-TestMultipleImageUploaderWithCustomImageModel}
    This tests the multiple image upload views located in wagtailimages/views/multiple.py
    with a custom image model
    c                 C   r  )Ntest-image.pngr3   )r7   r#   r9   r:   r,   rr   r=   r?   r?   r@   rA   s  r  z3TestMultipleImageUploaderWithCustomImageModel.setUpc                 C   s:   | j td}| |jd | |d | |d dS )r  r  rK   r  r4  N)rF   rG   r   rO   rP   rQ   rR   rT   r?   r?   r@   rK  |  s   z6TestMultipleImageUploaderWithCustomImageModel.test_addc                 C   sr  | j tddtdt j i}| |jd | |d d | 	|d | 
d|j | |jd jd | |jd j | |jd j | 
d	|j | |jd	 jd
 d | 
d|jd	 j | d|jd	 j | |jd d|jd j  | |jd d|jd j  t|j }| 
d	| | 
d| | 
d| | |d  | |d  dS )r  r  r  rA  rK   r  r  r  rr   rP  r4   captionnot_editable_fieldr  r  r  r  r  r  N)rF   r.  r   r   r,   r5   rE  rO   rP   rQ   r  r[   r4   rv   r   rJ  r  fieldsr;  rs   r9  r:  rt   ru   r   rS  r?   r?   r@   r    sD   
z;TestMultipleImageUploaderWithCustomImageModel.test_add_postc                 C   r  r  r  rS  r?   r?   r@   r    r  zCTestMultipleImageUploaderWithCustomImageModel.test_add_post_badfilec                    s   d fdd	}|  |dd}  |jd  |d   |jd jd  d	|jd
 j  d|jd
 j t	|j
 } d
|  d|  |d   |d  d S )Nr  c                    r  r  r  rB  r=   r?   r@   r    r  zYTestMultipleImageUploaderWithCustomImageModel.test_add_post_duplicate.<locals>.post_imager  rB  rK   r  rr   r  rP  r  r  r  r  r  )rO   rP   rQ   r[   r4   r  r  r;  r9  r:  rt   ru   rv   r   r?   r=   r@   r    s   
zETestMultipleImageUploaderWithCustomImageModel.test_add_post_duplicatec                 C   s   t  }|jdd}|| j_| j  tj }t	j }| j
tdtdt j |jd}tj }t	j }| || | ||d  | |jd | |d d	 | |d
 dS )z~
        If unique_together validation fails, create an UploadedFile and return a form so the
        user can fix it
        holiday snapsrf   r  r  )r  rk   r*   rK   r  r  r  N)r   ro   rp   rr   rk   r   r#   r9   r   r!   rF   r.  r   r   r,   r5   rE  rs   rO   rP   rQ   )r>   rw   new_collectionimage_count_beforeuploaded_image_count_beforerU   image_count_afteruploaded_image_count_afterr?   r?   r@   rs    s.   





zSTestMultipleImageUploaderWithCustomImageModel.test_unique_together_validation_errorc              	   C   s   | j td| jjfdd| jj dd| jj dd| jj di}| |jd	 | |d
 d t|j	
 }| d| | d| | d| | |d | jj | |d  tjj| jjd}| |jd | |jd | d|j  dS )r  r  r   r  r  r  zfootwear, dystopiaimage-%d-captionz(a boot stamping on a human face, foreverrK   r  r  r  rP  r  r  footwearN)rF   r.  r   rr   rs   rO   rP   r9  r:  rt   ru   r  r;  rv   r#   r9   rG   r4   r  r   r  )r>   rU   r=  r  r?   r?   r@   r    s(   
z<TestMultipleImageUploaderWithCustomImageModel.test_edit_postc                 C   s   t  }|jdd}tjjdt |d | jt	d| j
jfdd| j
j dd| j
j |jd	| j
j d
d| j
j di}| |jd | |d d | |d t|j }| |d | j
j | |d  | d|d  dS )z
        Check that the form returned on failing a unique-together validation error
        includes that error message, despite it being a non-field error
        r  rf   zThe Eiffel Towerrj   r  r   r  zimage-%d-collectionr  rX   r$  z	ooh la larK   r  r  r  r  r  rq  rP  N)r   ro   rp   r#   r9   r:   r,   rF   r.  r   rr   rs   rO   rP   rQ   r9  r:  rt   ru   r   r  )r>   rw   r  rU   r=  r?   r?   r@   *test_edit_fails_unique_together_validation@  s6   zXTestMultipleImageUploaderWithCustomImageModel.test_edit_fails_unique_together_validationc                 C   s   | j td| jjfd}| |jd | |d d | tj	j
| jjd  t|j }| d| | d| | |d | jj | |d  | tj	j
| jjd d	 d
S )r  r  r   rK   r  r  r  r  r  r   N)rF   r.  r   rr   rs   rO   rP   r   r+   r9   r   rc  r9  r:  rt   ru   r  rv   r#   r   rS  r?   r?   r@   r  j  s   "z>TestMultipleImageUploaderWithCustomImageModel.test_delete_postN)r   r   r   r  rA   rK  r  r  r  rs  r  r&  r  r?   r?   r?   r@   r  l  s    	0$%"*r  ztests.CustomImageWithAuthorc                   @   sH   e Zd 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S )1TestMultipleImageUploaderWithCustomRequiredFieldsr  c                 C   s0   |   | _tjjtjt t | jd| _	d S )N)for_content_typer5   r^  )
r7   r8   r!   r9   r:   r   get_for_modelr   r,   uploaded_imager=   r?   r?   r@   rA     s   
z7TestMultipleImageUploaderWithCustomRequiredFields.setUpc                 C   s.   | j td}| |jd | |d dS )r  r  rK   r  N)rF   rG   r   rO   rP   rQ   rT   r?   r?   r@   rK    s   z:TestMultipleImageUploaderWithCustomRequiredFields.test_addc                 C   sd  t j }tj }| jtddtdt j	
 i}t j }tj }| || | ||d  | |jd | |d d | |d | d	|j | |jd	 j	j | d
|j | |jd
 jd d | d|jd
 j | |jd d|jd	 j  | |jd d|jd	 j  t|j }| d
| | d| | |d  dS )z
        A POST request to the add view should create an UploadedFile rather than an image,
        as we do not have enough data to pass CustomImageWithAuthor's validation yet
        r  r  rA  r*   rK   r  r  r  r*  rP  r4   authorr  5/admin/images/multiple/create_from_uploaded_image/%d/r  (/admin/images/multiple/delete_upload/%d/r  N)r$   r9   r   r!   rF   r.  r   r   r,   r5   rE  rO   rP   rQ   r  r[   rv   rg   r  r  rs   r9  r:  rt   ru   r>   r   r!  rU   r"  r#  r=  r?   r?   r@   r    sN   


	


z?TestMultipleImageUploaderWithCustomRequiredFields.test_add_postc                 C   r  r  r  rS  r?   r?   r@   r    r  zGTestMultipleImageUploaderWithCustomRequiredFields.test_add_post_badfilec              	   C   sN  t j }tj }| jtd| jjfdd| jj dd| jj dd| jj di}t j }tj }| 	|| | 	|| | 	|j
d | 	|d	 d
 | d|j | d|jd j | 	|jd d|jd j  | 	|jd d|jd j  | |jd dd t|j }| d| | d|d  | |d  dS )z
        Posting an invalid form to the create_from_uploaded_image view throws a validation error and leaves the
        UploadedFile intact
        1wagtailimages:create_multiple_from_uploaded_imager   uploaded-image-%d-titler  uploaded-image-%d-tagsrX   uploaded-image-%d-authorrK   r  r  rP  r+  r  r,  r*  r  r-  rN   r  N)r$   r9   r   r!   rF   r.  r   r*  rs   rO   rP   r  r[   r  rR  r9  r:  rt   ru   r   r.  r?   r?   r@   $test_create_from_upload_invalid_post  sN   





zVTestMultipleImageUploaderWithCustomRequiredFields.test_create_from_upload_invalid_postc              	   C   sV  t j }tj }| jtd| jjfdd| jj dd| jj dd| jj di}t j }tj }| 	|j
d	 | 	|d
 d t|j }| d| | |d  | 	||d  | 	||d  t jj|d d}| 	|jd | 	|jd | |jj | |j | |j | 	|jd | 	|jd | d|j  dS )zc
        Posting a valid form to the create_from_uploaded_image view will create the image
        r/  r   r0  r  r1  zabstract, squaresr2  zPiet MondrianrK   r  r  r  r  r*   r  rC  rD  abstractN)r$   r9   r   r!   rF   r.  r   r*  rs   rO   rP   r9  r:  rt   ru   r  rv   rG   r4   r+  r5   rg   rJ  r   rH  rI  r   r  )r>   r   r!  rU   r"  r#  r=  rr   r?   r?   r@   test_create_from_upload+  s>   




zITestMultipleImageUploaderWithCustomRequiredFields.test_create_from_uploadc                 C   sv   | j td| jjfd}| |jd | |d d | tj	j
| jjd  t|j }| |d  dS )	z\
        This tests that a POST request to the delete view deletes the UploadedFile
        z$wagtailimages:delete_upload_multipler   rK   r  r  r  r  N)rF   r.  r   r*  rs   rO   rP   r   r!   r9   r   rc  r9  r:  rt   ru   rv   rS  r?   r?   r@   test_delete_uploaded_image[  s   
zLTestMultipleImageUploaderWithCustomRequiredFields.test_delete_uploaded_imageN)r   r   r   r  rA   rK  r  r  r3  r5  r6  r?   r?   r?   r@   r'    s    
870r'  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestURLGeneratorViewc                 C   "   t jjdt d| _|  | _d S r  r+   r9   r:   r,   rr   r7   r8   r=   r?   r?   r@   rA   u  
   zTestURLGeneratorView.setUpc                 C   s~   | j td| jjfd}| |jd | |d | |d | tdddtd	| jjfdd
dddd
dg|j	 dS )l
        This tests that the view responds correctly for a user with edit permissions on this image
        wagtailimages:url_generatorr   rK   z'wagtailimages/images/url_generator.htmlzwagtailadmin/generic/base.htmlrD   r5  r6  r   r   rX   zGenerate URL)r  r7  sublabelN)
rF   rG   r   rr   rs   rO   rP   rQ   r8  rt   rT   r?   r?   r@   r9    s   
zTestURLGeneratorView.test_getc                 C   sZ   d| j _| j jtjjddd | j   | jt	d| j
jfd}| |t	d dS )	z
        This tests that the view returns a "permission denied" redirect if a user without correct
        permissions attempts to access it
        Fr|  r}  ry  r<  r   r  N)r8   r  r  r   r   r9   rG   r   rF   r   rr   rs   rF  rT   r?   r?   r@   test_get_bad_permissions  s   
z-TestURLGeneratorView.test_get_bad_permissionsN)r   r   r   rA   r9  r>  r?   r?   r?   r@   r7  t  s    
r7  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestGenerateURLViewc                 C   r8  r  r9  r=   r?   r?   r@   rA     r:  zTestGenerateURLView.setUpc                 C   s   | j td| jjdfd}| |jd | |d d t|j	
 }| t| ddh d	tjjt| jjdtd
| jjd }| |d | td| jjdfd}| |d | dS )r;  wagtailimages:generate_urlfill-800x600r   rK   r  r  r  preview_urlz@http://localhost/images/%(signature)s/%(image_id)d/fill-800x600/)safe)	signaturer  wagtailimages:previewN)rF   rG   r   rr   rs   rO   rP   r9  r:  rt   ru   rx  ry  r   r   r   r   urlquote_safechars)r>   rU   content_jsonr  expected_preview_urlr?   r?   r@   r9    s*   
zTestGenerateURLView.test_getc                 C   s   d| j _| j jtjjddd | j   | jt	d| j
jdfd}| |jd | |d	 d
 | |j tddi dS )zr
        This tests that the view gives a 403 if a user without correct permissions attempts to access it
        Fr|  r}  ry  r@  rA  r   i  r  r  errorz<You do not have permission to generate a URL for this image.N)r8   r  r  r   r   r9   rG   r   rF   r   rr   rs   rO   rP   assertJSONEqualrt   ru   r9  dumpsrT   r?   r?   r@   r>    s&   
z,TestGenerateURLView.test_get_bad_permissionsc                 C   s^   | j td| jjd dfd}| |jd | |d d | |j	 t
dd	i d
S )z~
        This tests that the view gives a 404 response if a user attempts to use it with an image which doesn't exist
        r@  r*   rA  r   rW  r  r  rI  zCannot find image.NrF   rG   r   rr   rs   rO   rP   rJ  rt   ru   r9  rK  rT   r?   r?   r@   test_get_bad_image  s   z&TestGenerateURLView.test_get_bad_imagec                 C   sZ   | j td| jjdfd}| |jd | |d d | |j	 t
ddi d	S )
zz
        This tests that the view gives a 400 response if the user attempts to use it with an invalid filter spec
        r@  bad-filter-specr   r  r  r  rI  zInvalid filter spec.NrL  rT   r?   r?   r@   test_get_bad_filter_spec  s   z,TestGenerateURLView.test_get_bad_filter_specN)r   r   r   rA   r9  r>  rM  rO  r?   r?   r?   r@   r?    s    
# r?  c                   @   r  )
TestPreviewViewc                 C   r8  r  r9  r=   r?   r?   r@   rA   2  r:  zTestPreviewView.setUpc                 C   s>   | j td| jjdfd}| |jd | |d d dS )z6
        Test a valid GET request to the view
        rE  rA  r   rK   r  rY  Nr  rT   r?   r?   r@   r9  <  s
   zTestPreviewView.test_getc                 C   s~   G dd dt }ttd|g | jtd| jjdfd}W d   n1 s)w   Y  | 	|j
d | 	|d	 d
 dS )z\
        Test that preview works with optimizers

        Willow optimizers require
        c                   @   s2   e Zd ZdZdZedd ZedefddZdS )	zCTestPreviewView.test_preview_with_optimizer.<locals>.DummyOptimizerdummyrA  c                 S   s   dS )NTr?   )clsr?   r?   r@   check_libraryT     zQTestPreviewView.test_preview_with_optimizer.<locals>.DummyOptimizer.check_library	file_pathc                 S   s   d S r%  r?   )rR  rU  r?   r?   r@   processX  rT  zKTestPreviewView.test_preview_with_optimizer.<locals>.DummyOptimizer.processN)	r   r   r   library_nameimage_formatclassmethodrS  r  rV  r?   r?   r?   r@   DummyOptimizerP  s    
rZ  _registered_optimizersrE  rA  r   NrK   r  rY  )r   r   objectr   rF   rG   r   rr   rs   rO   rP   )r>   rZ  rU   r?   r?   r@   test_preview_with_optimizerI  s   z+TestPreviewView.test_preview_with_optimizerc                 C   s.   | j td| jjdfd}| |jd dS )a3  
        Test that an invalid filter spec returns a 400 response

        This is very unlikely to happen in reality. A user would have
        to create signature for the invalid filter spec which can't be
        done with Wagtails built in URL generator. We should test it
        anyway though.
        rE  rN  r   r  Nr  rT   r?   r?   r@   test_get_invalid_filter_specf  s   
z,TestPreviewView.test_get_invalid_filter_specN)r   r   r   rA   r9  r]  r^  r?   r?   r?   r@   rP  1  s
    
rP  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S )TestEditOnlyPermissionsc                 C   s   t jjdt d| _| jdddd}tjjddd	}tjjd
dd	}tjjdd}|j	
| tjj|t |d |j
| | jddd d S )Nr   r3   r"  r#  r  r  rw  r$  ry  r|  r}  r%  rf   r~  r  )r+   r9   r:   r,   rr   r  r   rG   r   r  r   r   r   ro   r  r7   )r>   r8   r'  r  image_changers_groupr?   r?   r@   rA   y  s,   zTestEditOnlyPermissions.setUpc                 C   sF   | j td}| |jd | |d | |d | |d d S )NrD   rK   rL   rM   r   )rF   rG   r   rO   rP   rQ   rS   rR   rT   r?   r?   r@   test_get_index  s
   z&TestEditOnlyPermissions.test_get_indexc                 C   s:   | j tdddi}| |jd | |jd d d S )NrD   rW   rU  rK   rY   )rF   rG   r   rO   rP   r[   rT   r?   r?   r@   r    s   z#TestEditOnlyPermissions.test_searchc                 C   $   | j td}| |td d S )Nr,  r  rF   rG   r   rF  rT   r?   r?   r@   test_get_add     z$TestEditOnlyPermissions.test_get_addc                 C   8   | j td| jjfd}| |jd | |d d S )Nr   r   rK   r  rF   rG   r   rr   rs   rO   rP   rQ   rT   r?   r?   r@   test_get_edit  s   z%TestEditOnlyPermissions.test_get_editc                 C   rf  )Nr  r   rK   r  rg  rT   r?   r?   r@   test_get_delete  s
   z'TestEditOnlyPermissions.test_get_deletec                 C   rb  )Nr  r  rc  rT   r?   r?   r@   test_get_add_multiple  re  z-TestEditOnlyPermissions.test_get_add_multipleN)
r   r   r   rA   ra  r  rd  rh  ri  rj  r?   r?   r?   r@   r_  x  s    r_  c                   @   s   e Zd Zdd Zdd ZdS )TestImageAddMultipleViewc                 C   s6   |    | jtd}| |jd | |d d S )Nr  rK   r  )r7   rF   rG   r   rO   rP   rQ   rT   r?   r?   r@   test_as_superuser  s   z*TestImageAddMultipleView.test_as_superuserc                 C   s   | j ddd}tjjddd}tjjddd}tjjd	d
}|j| tjj|t	
 |d |j| | jddd | jtd}| |jd | |d d S )Neditorr  r  rw  rx  ry  r|  r}  r*  rf   r~  r  rK   r  )r  r   r9   rG   r   r:   r  r   r   r   ro   r  r7   rF   r   rO   rP   rQ   )r>   r8   r,  r  image_adders_grouprU   r?   r?   r@   test_as_ordinary_editor  s&   z0TestImageAddMultipleView.test_as_ordinary_editorN)r   r   r   rl  ro  r?   r?   r?   r@   rk    s    rk  )br  r9  r   unittest.mockr   django.confr   django.contrib.auth.modelsr   r   "django.contrib.contenttypes.modelsr   django.core.files.uploadedfiler   r   django.db.models.lookupsr	   django.template.defaultfiltersr
   django.template.loaderr   django.testr   r   r   r   django.urlsr   django.utils.encodingr   django.utils.htmlr   r   django.utils.httpr   r   django.utils.safestringr   django.utils.textr   willow.optimizers.baser   willow.registryr   wagtail.admin.admin_url_finderr   wagtail.imagesr   wagtail.images.utilsr   wagtail.images.views.imagesr   wagtail.modelsr   r   r    r!   r"   wagtail.test.testapp.modelsr#   r$   r%   r&   wagtail.test.utilsr'   !wagtail.test.utils.template_testsr(   wagtail.test.utils.timestampsr)   utilsr+   r,   r-   rF  r.   r   r#  r*  rt  r  r  r  r  r.  rm  ro  r}  r  r  r  r  r  r'  r7  r?  rP  r_  rk  r?   r?   r?   r@   <module>   s      bt  VP   f} e0-_  !O   v   o< GE