U
    {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l2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z< d dl=m>Z> d dl?m@Z@ ddlAmBZBmCZCmDZD e"d ZEG dd de>eZFG dd  d e>eZGG d!d" d"e>eZHG d#d$ d$e>eZIG d%d& d&e>eZJG d'd( d(e>eZKed)d*G d+d, d,e>eZLG d-d. d.e>eZMG d/d0 d0e>eZNG d1d2 d2e>eZOG d3d4 d4e>eZPG d5d6 d6e>eZQG d7d8 d8e>eZRG d9d: d:e>eZSG d;d< d<e>eZTG d=d> d>e>eZUG d?d@ d@e>eZVed)d*G dAdB dBe>eZWedCd*G dDdE dEe>eZXG dFdG dGe>eZYG dHdI dIe>eZZG dJdK dKe>eZ[G dLdM dMe>eZ\G dNdO dOe>eZ]dS )P    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)OptimizerBase)registry)AdminURLFinder)get_image_model)generate_signature)ImagesFilterSet)
CollectionGroupCollectionPermissionPageUploadedFileget_root_collection_id)CustomImageCustomImageWithAuthor	EventPageVariousOnDeleteModel)WagtailTestUtils)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=   m/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/images/tests/test_admin_views.pysetUp1   s    
zTestImageIndexView.setUpc                 C   s   | j td|S Nwagtailimages:indexclientgetr   r<   paramsr=   r=   r>   rD   <   s    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-   r4   rD   assertEqualstatus_codeassertTemplateUsedassertContainsassertNotContainsr<   responser=   r=   r>   test_simple?   s    zTestImageIndexView.test_simplec                 C   sb   |  ddi}| |jd | |jd d | |d | |d | |d | |d d S )	Nq rG   query_stringrI   rJ   r-   r4   rD   rL   rM   contextrO   rP   rQ   r=   r=   r>   test_empty_qJ   s    zTestImageIndexView.test_empty_qc                 C   s<   |  ddi}| |jd |  ddi}| |jd d S Npr(   rG   i'    rD   rL   rM   rQ   r=   r=   r>   test_paginationU   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
 |kpd|j
 |k | d|j
 |kpd|j
 |k d S )N
Evil plansnamer(   B   Test image %ir.   r/   r2   r3   
collection   )collection_idr[   rG   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)   r7   r8   r*   imagerD   idrL   rM   contentdecode
assertTrue)r<   root_collectionevil_plans_collectionirR   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orderingr2   rG   page_objr   r(   )rD   rL   rM   rX   object_listr9   r:   )r<   rR   rX   r=   r=   r>   test_order_by_titlex   s
    z&TestImageIndexView.test_order_by_titlec                 C   sP   ddddddg}|D ]6}|  d|i}| |jd |j}| |d	 | qd S )
Nr2   z-title
created_at-created_at	file_sizez
-file_sizerv   rG   current_orderingrD   rL   rM   rX   )r<   Z	orderingsrv   rR   rX   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 )	Nrv   ZbogusrG   r{   r}   rw   r   r(   )rD   rL   rM   rX   rx   r:   r9   )r<   rR   rX   Zdefault_orderingr=   r=   r>   7test_default_ordering_used_if_invalid_ordering_provided   s    zJTestImageIndexView.test_default_ordering_used_if_invalid_ordering_provided   )Z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   s"   g | ]}t d | tdddqS rc   r.   r/   r1   r)   r*   .0rs   r=   r=   r>   
<listcomp>   s
   zDTestImageIndexView.test_default_entries_per_page.<locals>.<listcomp>r(   !   rG   rw   r   
rk   r)   r7   bulk_createrD   rL   rM   rX   rx   len)r<   imagesrR   rx   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   s"   g | ]}t d | tdddqS r   r   r   r=   r=   r>   r      s
   zQTestImageIndexView.test_default_entries_per_page_uses_default.<locals>.<listcomp>r(   r      rG   rw   r   )r<   r   Zdefault_num_entries_per_pagerR   rx   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 dddg d S )Nr_   r`   z
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   re   r=   r=   r>   r      s   z<TestImageIndexView.test_collection_order.<locals>.<listcomp>ZRoot)r   ri   rj   rD   get_souprn   selectrL   )r<   rq   rR   soupZcollection_optionsr=   r=   r>   test_collection_order   s    z(TestImageIndexView.test_collection_orderc                 C   s8   t  }|jdd}|jdd |  }| |d d S Nr_   r`   Eviler plans,&nbsp;&nbsp;&nbsp;&nbsp;&#x21b3 Eviler plansr   ri   rj   rD   rO   r<   rq   Z
evil_plansrR   r=   r=   r>   test_collection_nesting   s
    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 )Nr_   r`   
Test imager.   r/   rd   rg   rG   wagtailimages:editargsz?next=)r   ri   rj   r)   r7   r8   r*   rD   rm   rL   rM   r   urllibparsequote_requestZget_full_pathrO   )r<   rq   rr   rl   rR   Zedit_urlZ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 tagsr1   onetworG   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)   r7   r8   r*   r   addrD   rL   rM   r   rn   r   assertFalseassertCountEqual)r<   image_two_tagsrR   r   Z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 tagsr1   Test image with one tagr   r   r   zTest image with a different tagZ	unrelatedrw      tagrf   r(      r   c                 S   s&   g | ]}| d dk	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)   r7   r8   r*   r   r   rD   rL   rX   	paginatorcountr   rn   r   r   )r<   image_one_tagr   Zimage_unrelated_tagrR   r   r   Z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|kpd|k | d|kpd|k d S )Nr(      rc   r.   r/   r1   rf   r   even)r   r[   rG   rh   z?p=1&amp;tag=evenz?tag=even&amp;p=1z?p=3&amp;tag=evenz?tag=even&amp;p=3)rk   r)   r7   r8   r*   r   r   saverD   rL   rM   rn   ro   rp   )r<   rs   rl   rR   rt   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   Zallow_extra_attrs)rD   rn   ro   r   ZassertTagInHTML)r<   rR   htmlZ
search_urlr=   r=   r>   test_search_form_renderedR  s    

z,TestImageIndexView.test_search_form_rendereddefaultBACKEND+django.core.cache.backends.dummy.DummyCacheZCACHESc              	   C   s   |    | d |    W 5 Q R X tdD ] }tjjd| tddd| _q.| d |    W 5 Q R X | d |    W 5 Q R X d S )N      rc   r.   r/   r1       )rD   assertNumQueriesrk   r)   r7   r8   r*   rl   r<   rs   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   r1   r   rA   T)dataZquerysetrequestZis_searchingc                 S   s   g | ]}t |tr|qS r=   )
isinstancer	   )r   Zclauser=   r=   r>   r     s   
zZTestImageIndexView.test_empty_tag_filter_does_not_perform_id_filtering.<locals>.<listcomp>r   )r)   r7   r8   r*   r   r   r   rD   r   r6   r   allqsquerywherechildrenrL   r   )r<   r   r   Z	filtersetZ
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__r?   rD   rS   rY   r^   ru   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r=   r=   r=   r>   r,   0   s0   

	=

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-   r.   r/   r1   r4   i  r(   i  rf   )
r5   r)   r7   r8   r*   r9   r:   r'   rz   r   r;   r=   r=   r>   r?     s    
zTestImageIndexViewSearch.setUpc                 C   s   | j td|S r@   rB   rE   r=   r=   r>   rD     s    zTestImageIndexViewSearch.getc                 C   sJ   |  ddi}| |jd | |jd d | |d | |d d S )NrT   ZkittenrG   rV   r-   r4   rW   rQ   r=   r=   r>   test_search  s
    z$TestImageIndexViewSearch.test_searchc                 C   sJ   |  ddi}| |jd | |jd d | |d | |d d S )NrT   ZkitrG   rV   r-   r4   rW   rQ   r=   r=   r>   test_search_partial_match  s
    z2TestImageIndexViewSearch.test_search_partial_matchc                 C   s6  t  }|jdd|jddg}ddg}g }tdD ]P}tjj||d   d| td	d
||d  d| _|d dkr4|	| j q4| 
d|d jd}|j}|jd }|jd j}	|jd}
| |d | |d | ||	 tdddD ]}| d| |
 qtd}| |d| d|d j d d S )NzBaker Collectionr`   zOther CollectionZBakerOther
   rf   r   r.   r/   rd   r   )rT   rg   rV   rw   utf-8rG   zBaker %iwagtailimages:add_multiplez	<a href="?collection_id=")r   ri   rj   rk   r)   r7   r8   r*   rl   appendrD   rm   rM   rX   rx   rn   ro   rL   r   assertInr   rO   pk)r<   rq   Zchild_collectionZ
title_listZanswer_listrs   rR   rM   rV   Zresponse_listrt   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 tortoiser.   r/   r1   i  r(   Zcuterz   )rT   rv   rG   rV   rw   z(select[name="ordering"] option[selected]valueTr   ZOldest)r)   r7   r8   r*   r'   rz   r   rD   rL   rM   rX   listrx   r9   r:   r   rn   r   ZassertIsNotNoner   )r<   Z	old_imagerR   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   r1   r   r   r   r   test)r   rT   rw   rf   )r)   r7   r8   r*   r   r   rD   rL   rX   r   r   )r<   r   r   rR   r=   r=   r>   #test_tag_filtering_with_search_term  s     z<TestImageIndexViewSearch.test_tag_filtering_with_search_termN)r   r   r   fixturesr?   rD   r   r   r   r   r   r=   r=   r=   r>   r     s   #r   c                   @   s.   e Zd ZdgZdd Zi fddZdd ZdS )	TestImageListingResultsViewr   c                 C   s   |    d S Nr5   r;   r=   r=   r>   r?   	  s    z!TestImageListingResultsView.setUpc                 C   s   | j td|S )Nr   rB   rE   r=   r=   r>   rD     s    zTestImageListingResultsView.getc                 C   sD   t jjdt d}| ddi}| |jd | |d|j  d S )NzA scary monsterr1   rT   monsterrG   z5/admin/images/%d/?next=/admin/images/%%3Fq%%3Dmonster)	r)   r7   r8   r*   rD   rL   rM   rO   rm   )r<   r   rR   r=   r=   r>   r     s    z'TestImageListingResultsView.test_searchN)r   r   r   r   r?   rD   r   r=   r=   r=   r>   r     s   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	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   s   |    d S r   r   r;   r=   r=   r>   r?     s    zTestImageAddView.setUpc                 C   s   | j td|S Nwagtailimages:addrB   rE   r=   r=   r>   rD   "  s    zTestImageAddView.getc                 C   s   | j td|S r   rC   postr   r<   	post_datar=   r=   r>   r   %  s    zTestImageAddView.postc                 C   sJ   |   }| |jd | |d | |d | |d | |d d S )NrG   wagtailimages/images/add.htmlK<label class="w-field__label" for="id_collection" id="id_collection-label">enctype="multipart/form-data"wagtailadmin/js/draftail.js)rD   rL   rM   rN   rP   rO   rQ   r=   r=   r>   test_get(  s    zTestImageAddView.test_getc                 C   sR   t  }|jdd |  }| |jd | |d | |d | |d d S )Nr_   r`   rG   r   r   )r   ri   rj   rD   rL   rM   rN   rO   )r<   rq   rR   r=   r=   r>   test_get_with_collections:  s    z*TestImageAddView.test_get_with_collectionsc                 C   s8   t  }|jdd}|jdd |  }| |d d S r   r   r   r=   r=   r>    test_get_with_collection_nestingH  s
    z1TestImageAddView.test_get_with_collection_nestingtests.CustomImageZWAGTAILIMAGES_IMAGE_MODELc                 C   sJ   |   }| |jd | |d | |d | |d | |d d S )NrG   r   r   zname="fancy_caption"r   rD   rL   rM   rN   rO   rQ   r=   r=   r>    test_get_with_custom_image_modelQ  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.pngr1   rA   r2   r(       )r   r   r*   r3   getvalueassertRedirectsr   r)   r7   r   rL   r   firstwidthheightrp   r|   	file_hashr   ri   re   )r<   rR   r   rl   rq   r=   r=   r>   test_add`  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_typer1   rG   formr3   QNot a supported image format. Supported formats: AVIF, GIF, JPG, JPEG, PNG, WEBP.N)	r   r   r+   r3   r  rL   rM   assertFormErrorrX   rQ   r=   r=   r>   test_add_svg_denied~  s    
z$TestImageAddView.test_add_svg_deniedsvgZWAGTAILIMAGES_EXTENSIONSc                 C   sT   |  dtdt j ddd}| |td tjj	dd}| 
| d d S )	Nr   r  r  r  r1   rA   r	  r(   )r   r   r+   r3   r  r  r   r)   r7   r   rL   r   r<   rR   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
        r  	image/pngr   r   r   r1   rA   r	  r(   r
  r  N)r*   r   r0   writer3   r  seekr   r  r   r)   r7   r   rL   r   r  r  r  rp   r|   r  r   ri   re   )r<   Ztest_image_fileZuploaded_filerR   r   rl   rq   r=   r=   r>    test_add_temporary_uploaded_file  s0       
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   r  r1   rA   r	  )r   r   r*   r3   r  r  r   rp   r)   r7   r   existsrQ   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 )Nr2   r   rG   r   r  r3   rJ   )r   rL   rM   rN   r  rX   rQ   r=   r=   r>   test_add_no_file_selected  s       z*TestImageAddView.test_add_no_file_selectedr(   Z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   r  r1   rG   r   r  r3   zEThis file is too big ({file_size}). Maximum filesize {max_file_size}.r(   )r|   Zmax_file_size)r*   r3   r  r   r   rL   rM   rN   r  rX   formatr
   r   r<   Zfile_contentrR   r=   r=   r>   test_add_too_large_file  s     
z(TestImageAddView.test_add_too_large_file)ZWAGTAILIMAGES_MAX_IMAGE_PIXELSc                 C   sT   t  j }| dtd|d}| |jd | |d | |j	d dd d S )	Nr   r  r1   rG   r   r  r3   z9This file has too many pixels (307200). Maximum pixels 1.)
r*   r3   r  r   r   rL   rM   rN   r  rX   r,  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 )	Nr_   r`   r   r  rd   rA   r	  r(   )r   ri   rj   r   r   r*   r3   r  rm   r  r   r)   r7   r   rL   r   r  re   )r<   rq   rr   rR   r   rl   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 picsr`   r   r   rG   zoption value="z
" selected)
r   ri   rj   rC   rD   r   r   rL   rM   rO   )r<   rq   re   rR   r=   r=   r>   !test_add_with_selected_collection>  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 )	Nr_   r`   r   rd   r  rG   r   ;Custom image with this Title and Collection already exists.)r   ri   rj   r"   r7   r8   r*   r   r   r3   r  rm   rL   rM   rN   rO   r<   rq   rr   rR   r=   r=   r>   %test_unique_together_validation_errorJ  s,     
 z6TestImageAddView.test_unique_together_validation_errorN)r   r   r   r?   rD   r   r  r  r  r   r  r  r  r  r"  r   r%  r(  r)  r-  r.  r/  r0  r3  r=   r=   r=   r>   r     s>   	


& 


r   c                   @   sD   e Zd Zdd Zi fddZi fddZdd Zd	d
 Zdd ZdS )0TestImageAddViewWithLimitedCollectionPermissionsc                 C   s   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Zcontent_type__app_labelcodenamewagtailadminaccess_adminr_   r`   zEvil conspiratorsgroupre   Z
permissionZmoriartyzmoriarty@example.compasswordusernameemailr>  r@  r>  r   r7   rD   r   ri   rj   rr   r   r8   permissionsr   r   create_usergroupsr5   r<   Zadd_image_permissionadmin_permissionrq   Zconspirators_groupr6   r=   r=   r>   r?   k  s0        z6TestImageAddViewWithLimitedCollectionPermissions.setUpc                 C   s   | j td|S r   rB   rE   r=   r=   r>   rD     s    z4TestImageAddViewWithLimitedCollectionPermissions.getc                 C   s   | j td|S r   r   r   r=   r=   r>   r     s    z5TestImageAddViewWithLimitedCollectionPermissions.postc                 C   s2   |   }| |jd | |d | |d d S )NrG   r   r   )rD   rL   rM   rN   rP   rQ   r=   r=   r>   r    s    z9TestImageAddViewWithLimitedCollectionPermissions.test_getc                 C   s@   | j jdd |  }| |jd | |d | |d d S )Nr   r`   rG   r   r   )rr   rj   rD   rL   rM   rO   rQ   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 r&  )r   r   r*   r3   r  r  r   rp   r)   r7   r   r'  rL   rD   re   rr   rQ   r=   r=   r>   r    s     

 z9TestImageAddViewWithLimitedCollectionPermissions.test_addN)	r   r   r   r?   rD   r   r  r  r  r=   r=   r=   r>   r4  j  s   r4  c                   @   s,  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ejdddiiddd Zdd Zdd Zdd Zdd Zeejdddiiddd  Zd!d" Zd#d$ Zd%d& Ze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   r1   )	r5   r6   r)   r7   r8   r*   rl   r3   storager;   r=   r=   r>   r?     s    
zTestImageEditView.setUpc                 C   s   t jj| jjd| _d S )N)r   )r)   r7   rD   rl   r   r;   r=   r=   r>   update_from_db  s    z TestImageEditView.update_from_dbc                 C   s   | j td| jjfd|S Nr   r   rC   rD   r   rl   rm   rE   r=   r=   r>   rD     s     zTestImageEditView.getc                 C   s   | j td| jjfd|S rM  rC   r   r   rl   rm   r   r=   r=   r>   r     s     zTestImageEditView.postc                 C   s>   |   }| |jd | |d | |d | |d d S NrG   wagtailimages/images/edit.htmlr   r   rK   rQ   r=   r=   r>   rS     s
    zTestImageEditView.test_simplec                 C   s8   t  }|jdd}|jdd |  }| |d d S r   r   r   r=   r=   r>   #test_simple_with_collection_nesting  s
    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 )Nr_   r`   r   r.   r/   rd   rA   ?rg   r   r   nextrG   z<input type="hidden" value="z" name="next">)r   ri   rj   r)   r7   r8   r*   r   r   rm   rC   rD   rL   rM   rO   r<   rq   rr   rl   Zexpected_next_urlrR   r=   r=   r>   %test_next_url_is_present_in_edit_form  s,      
z7TestImageEditView.test_next_url_is_present_in_edit_formc                 C   sJ   |   }| |jd | |d | |d d| jj }| || d S )NrG   rQ  zUsed 0 times/admin/images/usage/%d/rD   rL   rM   rN   rO   rl   rm   r<   rR   expected_urlr=   r=   r>   test_with_usage_count  s    z'TestImageEditView.test_with_usage_countr   r   r#  r$  c                 C   s&   |   }| |jd | |d d S )NrG   rQ  )rD   rL   rM   rN   rQ   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 )Nr2   EditedrA   z/admin/images/%d/)r   r  r   rL  rL   rl   r2   r   r6   rm   get_edit_url)r<   rR   
url_finderrZ  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 )Nr_   r`   r   r.   r/   rd   rA   rS  rg   r   r   r]  )r2   re   rT  )r   ri   rj   r)   r7   r8   r*   r   r   rm   rC   r   r  refresh_from_dbrL   r2   rU  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;  r8  r2   r]  .  )r6   is_superuseruser_permissionsr   r   r7   rD   r   r   rL   rM   r   ZassertIsNoner^  rl   )r<   rR   r_  r=   r=   r>   "test_edit_with_limited_permissionsG  s      
 
z4TestImageEditView.test_edit_with_limited_permissionsc                 C   sx   t  j }d| j_d| j_| j  | dtd|d}| 	|t
d |   | | jjd | | jjd d S Ni Zabcedfr]  znew.pngr1   rA   r*   r3   r  rl   r|   r  r   r   r   r  r   rL  assertNotEqualr,  r=   r=   r>   test_edit_with_new_image_fileZ  s    
z/TestImageEditView.test_edit_with_new_image_filec                 C   sx   t  j }d| j_d| j_| j  | dtd|d}| 	|t
d |   | | jjd | | jjd d S rg  rh  r,  r=   r=   r>   2test_edit_with_new_image_file_and_external_storagep  s    	
zDTestImageEditView.test_edit_with_new_image_file_and_external_storagec                 C   s4   | j jd |  }| |jd | |d d S )NFrG   rQ  )rl   r3   deleterD   rL   rM   rN   rQ   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   r1   r   r   rG   rQ  zFile not found)r)   r7   r8   r*   r3   rK  rl  ra   rC   rD   r   r   rL   rM   rN   rO   )r<   rl   rR   r=   r=   r>   'check_get_missing_file_displays_warning  s    z9TestImageEditView.check_get_missing_file_displays_warningc                 C   s   |    d S r   rn  r;   r=   r=   r>   ;test_get_missing_file_displays_warning_with_default_storage  s    zMTestImageEditView.test_get_missing_file_displays_warning_with_default_storagec                 C   s   |    d S r   ro  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 kr| j j}z|jr"|d | W S |  X d S )Nrb)rl   r3   closeclosedopenread)r<   fr=   r=   r>   get_content  s    
zTestImageEditView.get_contentc              	   C   sN  | 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 5 Q R X 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colourr1   rA   original_images/N)rl   r3   r|   rx  get_renditionfilenamer   r*   r  r0   r   r2   r  r   rL  r   rK  r'  ra   rp   ri  rL   assertRaisestypeDoesNotExistra  r<   Zold_fileZold_sizeZold_dataZold_renditionZold_rendition_datanew_namenew_filenew_sizerR   Znew_renditionr=   r=   r>   test_reupload_same_name  s:     z)TestImageEditView.test_reupload_same_namec              	   C   sJ  | 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 5 Q R X dS )	z}
        Checks that reuploading the image file with a different file name
        correctly uses the new file name.
        ry  z test_reupload_different_name.pngrz  r{  r1   rA   r}  N)rl   r3   r|   rx  r~  r   r*   r  r0   r   r2   r  r   rL  r   rK  r'  ra   rp   rL   ri  r  r  r  ra  r  r=   r=   r>   test_reupload_different_name  s:     z.TestImageEditView.test_reupload_different_nameT)ZUSE_L10NZ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  r/   i   i  i  i  )r2   r3   Zfocal_point_xZfocal_point_yZfocal_point_widthZ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)   r7   r8   r*   rC   rD   r   rm   rO   )r<   Zlarge_imagerR   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 )Nr_   r`   r   r1   r]  rd   )r2   re   rG   rQ  r1  )r   ri   rj   r"   r7   r8   r*   rl   r   rm   rL   rM   rN   rO   r2  r=   r=   r>   r3    s,       z7TestImageEditView.test_unique_together_validation_error)N)r   r   r   r?   rL  rD   r   rS   rR  rV  r[  r   r   r%  r\  r`  rb  rf  rj  rk  rm  rn  rp  rq  rx  r  r  r  r3  r=   r=   r=   r>   rI    sb   	 
 

 


((

rI  r  r  c                   @   s(   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 rJ  )r5   r"   r7   r8   r*   rl   r3   rK  r;   r=   r=   r>   r?   =  s    z+TestImageEditViewWithCustomImageModel.setUpc                 C   s   | j td| jjfd|S rM  rN  rE   r=   r=   r>   rD   H  s     z)TestImageEditViewWithCustomImageModel.getc                 C   s>   |   }| |jd | |d | |d | |d d S rP  r  rQ   r=   r=   r>   r  M  s
    zFTestImageEditViewWithCustomImageModel.test_get_with_custom_image_modelN)r   r   r   r?   rD   r  r=   r=   r=   r>   r  ;  s   r  c                   @   s\   e Zd Zdd Zi fddZi fddZdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )TestImageDeleteViewc                 C   s6   |   | _tjjdt d| _td| jjfd| _	d S )Nr   r1   wagtailimages:deleter   )
r5   r6   r)   r7   r8   r*   rl   r   rm   
delete_urlr;   r=   r=   r>   r?   Z  s    
zTestImageDeleteView.setUpc                 C   s   | j | j|S r   )rC   rD   r  rE   r=   r=   r>   rD   e  s    zTestImageDeleteView.getc                 K   s   | j j| j|f|S r   )rC   r   r  )r<   r   kwargsr=   r=   r>   r   h  s    zTestImageDeleteView.postc                 C   sl   |   }| |jd | |d | |d | |d | |d | |d | |d| j d d S )	NrG   (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">)rD   rL   rM   rN   rP   rO   r  rQ   r=   r=   r>   rS   k  s    zTestImageDeleteView.test_simplec                 C   sJ   |   }| |jd | |d | |d d| jj }| || d S )NrG   r  z This image is referenced 0 timesrW  rX  rY  r=   r=   r>   test_usage_link{  s    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)followrA   r   r	  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   r  r   r)   r7   r   rL   r   rX   r   r  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;  r8  rc  )r6   rd  re  r   r   r7   rD   r   r   rL   rM   rQ   r=   r=   r>   $test_delete_with_limited_permissions  s     
z8TestImageDeleteView.test_delete_with_limited_permissionsc                 C   s   t jj| jd |  }| |jd | |d | |d | |t	d| jj
fdd  | |d | |d	 | |d
 | |d | |d| j d d S )NZprotected_imagerG   r  r  wagtailimages:image_usager   z?describe_on_delete=1r  z+Are you sure you want to delete this image?r  r  r   r  )r%   r7   r8   rl   rD   rL   rM   rN   rO   r   rm   rP   r  rQ   r=   r=   r>   (test_delete_get_with_protected_reference  s,    z<TestImageDeleteView.test_delete_get_with_protected_referencec                 C   sH   t jj| jd |  }| |td | tjj	| jj
d  d S )Nr  wagtailadmin_homerm   )r%   r7   r8   rl   r   r  r   rp   r)   r   rm   r'  rQ   r=   r=   r>   )test_delete_post_with_protected_reference  s    z=TestImageDeleteView.test_delete_post_with_protected_referenceN)r   r   r   r?   rD   r   rS   r  r  r  r  r  r=   r=   r=   r>   r  Y  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   s    |    tjjdt d| _d S rJ  r5   r)   r7   r8   r*   rl   r;   r=   r=   r>   r?     s
    zTestUsage.setUpc              
   C   s   t jjdd}|jtdd| jtj ddddd	 
  | jtd	| jjgd
}| |d | |d | j|ddd d S )Nrf   r  	Christmas	christmasprivateTestr2   ZslugZ
feed_imageZ	date_fromZaudiencelocationZcostinstancer  r   <table class="listing"><td>Event page</td>Tr   )r   r7   rD   rj   r$   rl   datetimedatetodaysave_revisionpublishrC   r   rm   rO   )r<   	home_pagerR   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  )rC   rD   r   rl   rm   rP   rQ   r=   r=   r>   test_usage_page_no_usage  s    z"TestUsage.test_usage_page_no_usagec                 C   sB   | j jd | j   | jtd| j jgd}| |d d S )NZillustrationr  r   r  )	rl   r   r   r   rC   rD   r   rm   rP   rQ   r=   r=   r>   test_usage_no_tags  s    
zTestUsage.test_usage_no_tagsc              
   C   s  t jjdd}|jtdd| jtj ddddd	 
  | 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 )Nrf   r  r  r  r  r  r  r  
changeonlychangeonly@example.comr>  r?  r6  change_imager8  r:  r;  Image changersr`   r<  rB  r  r   rG   z(Private page)r  Tr  )r   r7   rD   rj   r$   rl   r  r  r  r  r  rE  r   r   r8   Zchangers_groupr   r   ri   rF  r   re  r5   rC   r   rm   rL   rM   rP   rO   )r<   r  r6   change_permissionrH  rR   r=   r=   r>   +test_usage_page_with_only_change_permission  sR        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 )NZaddonlyzaddonly@example.comr>  r?  r6  r7  r8  r:  r;  Image addersr`   r<  rB  r  r   rc  )rE  r   r7   rD   r   r8   Zadders_groupr   r   ri   rF  r   re  r5   rC   r   rl   rm   rL   rM   )r<   r6   add_permissionrH  rR   r=   r=   r>   )test_usage_page_without_change_permission  s4        z3TestUsage.test_usage_page_without_change_permissionN)	r   r   r   r?   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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   s   |   | _d S r   r5   r6   r;   r=   r=   r>   r?   8  s    zTestImageChooserView.setUpc                 C   s   | j td|S Nwagtailimages_chooser:chooserB   rE   r=   r=   r>   rD   ;  s    zTestImageChooserView.getc                 C   sV   |   }| |jd t|j }| |d d | |d | d|d  d S )NrG   stepchoose"wagtailimages/chooser/chooser.htmlr   r   )	rD   rL   rM   jsonloadsrn   ro   rN   assertNotInr<   rR   response_jsonr=   r=   r>   rS   >  s    z TestImageChooserView.test_simplec                 C   s8   t  }|jdd}|jdd |  }| |d d S r   r   r   r=   r=   r>   rR  H  s
    z8TestImageChooserView.test_simple_with_collection_nestingc           
      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Bakersr`   r:  r;  r8  r  Bakeryr  r6  Zchoose_imager<  ZOfficebakerr>  rB  zSweetBuns.jpgrd   zPromotionalPoster.jpgrG   r  r   )r   r7   r8   r   rD   rD  r   r   r!   rj   r   rE  rF  r5   r)   r*   rL   rM   rN   rO   r2   rP   )
r<   bakers_groupaccess_admin_permrootbakery_collectionZoffice_collectionr  Z
sweet_bunsZposterrR   r=   r=   r>   test_choose_permissionsQ  sd       	z,TestImageChooserView.test_choose_permissionsr  r  c                 C   sf   |   }| |jd t|j }| |d d | |d | d|d  | d|d  d S )NrG   r  r  r  z)name="image-chooser-upload-fancy_caption"r   r   )	rD   rL   rM   r  r  rn   ro   rN   r   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 )NrT   HellorG   Zsearch_queryr~   rQ   r=   r=   r>   r     s    z TestImageChooserView.test_searchc                 C   s<   |  ddi}| |jd |  ddi}| |jd d S rZ   r]   rQ   r=   r=   r>   r^     s    z$TestImageChooserView.test_pagination   )ZWAGTAILIMAGES_CHOOSER_PAGE_SIZEc                 C   sF   dd t ddD }tj| |  }| |d | |jd d S )Nc                 S   s"   g | ]}t d | tdddqS r   r   r   r=   r=   r>   r     s
   z?TestImageChooserView.test_chooser_page_size.<locals>.<listcomp>r(   r   zPage 1 of 3rG   )rk   r)   r7   r   rD   rO   rL   rM   )r<   r   rR   r=   r=   r>   test_chooser_page_size  s    z+TestImageChooserView.test_chooser_page_sizec                 C   sv   t ddD ]2}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 oner1   rf   r   r   rG   zTest image 2 is even betterzTest image 3 is even better)rk   r)   r7   r8   r*   r   r   rD   rL   rM   rO   rP   )r<   rs   rl   rR   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 5 Q R X  t|j	d d	  |j	d d
 | d S )NTest image shownr2   r3   uploaded_by_userTest image not shownr1   c                    s   | j  jdS N)r  r   r6   r   r   r;   r=   r>   filter_images  s    zOTestImageChooserView.test_construct_queryset_hook_browse.<locals>.filter_images construct_image_chooser_querysetresultsr(   r   
r)   r7   r8   r*   r6   register_hookrD   rL   r   rX   r<   rl   r  rR   r=   r;   r>   #test_construct_queryset_hook_browse  s    z8TestImageChooserView.test_construct_queryset_hook_browser   r   r   r   c              	   C   s   |  d |   W 5 Q R X tdD ] }tjjd| tddd| _q&|  d |   W 5 Q R X |  d |   W 5 Q R X d S )	N   r   rc   r.   r/   r1   r   r   )r   rD   rk   r)   r7   r8   r*   rl   r   r=   r=   r>   r     s    
z%TestImageChooserView.test_num_queriesN)r   r   r   r?   rD   rS   rR  r  r   r  r   r^   r  r  r  r   r=   r=   r=   r>   r  7  s"   
	I


r  c                   @   s.   e Zd ZdgZdd Zi fddZdd ZdS )	TestImageChooserViewSearchr   c                 C   s   |   | _d S r   r  r;   r=   r=   r>   r?   
  s    z TestImageChooserViewSearch.setUpc                 C   s   | j td|S r  rB   rE   r=   r=   r>   rD     s    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 5 Q R X  t|j	d
 d  |j	d
 d | d S )Nr  r  r  r1   c                    s   | j  jdS r  r  r  r;   r=   r>   r    s    zUTestImageChooserViewSearch.test_construct_queryset_hook_search.<locals>.filter_imagesr  rT   r  r  r(   r   r  r  r=   r;   r>   #test_construct_queryset_hook_search  s    z>TestImageChooserViewSearch.test_construct_queryset_hook_searchN)r   r   r   r   r?   rD   r  r=   r=   r=   r>   r    s   r  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 S rJ  r  r;   r=   r=   r>   r?   '  s
    z TestImageChooserChosenView.setUpc                 C   s   | j td| jjfd|S )Nwagtailimages_chooser:chosenr   rN  rE   r=   r=   r>   rD   0  s     zTestImageChooserChosenView.getc                 C   sN   |   }| |jd t|j }| |d d | |d d d d S )NrG   r  chosenresultr2   r   )rD   rL   rM   r  r  rn   ro   r  r=   r=   r>   rS   5  s
    z&TestImageChooserChosenView.test_simplec                 C   sn   | j ddid}| |jd t|j }| |d d | t|d d | |d d d	 d
 d S )NZmultipler(   rF   rG   r  r  r  r   r2   r   rD   rL   rM   r  r  rn   ro   r   r  r=   r=   r>   test_with_multiple_flag=  s    z2TestImageChooserChosenView.test_with_multiple_flagN)r   r   r   r?   rD   rS   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S )"TestImageChooserChosenMultipleViewc                 C   sH   |    tjjdt d| _tjjdt d| _tjjdt d| _d S )Nr   r1   Another test imagezUnchosen test image)r5   r)   r7   r8   r*   image1image2Zimage3r;   r=   r=   r>   r?   I  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)rC   rD   r   r  r   r  rE   r=   r=   r>   rD   [  s    z&TestImageChooserChosenMultipleView.getc                 C   sp   |   }| |jd t|j }| |d d | t|d d dd |d D }| |dd	h d S )
NrG   r  r  r  rf   c                 S   s   h | ]}|d  qS r	  r=   )r   itemr=   r=   r>   	<setcomp>l  s     z>TestImageChooserChosenMultipleView.test_get.<locals>.<setcomp>r   r  r  )r<   rR   r  titlesr=   r=   r>   r  e  s    z+TestImageChooserChosenMultipleView.test_getN)r   r   r   r?   rD   r  r=   r=   r=   r>   r  H  s   
r  c                   @   s\   e Zd Zdd Zi fddZi fddZdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS ) TestImageChooserSelectFormatViewc                 C   s    |    tjjdt d| _d S rJ  r  r;   r=   r=   r>   r?   q  s
    z&TestImageChooserSelectFormatView.setUpc                 C   s   | j td| jjfd|S N#wagtailimages_chooser:select_formatr   rN  rE   r=   r=   r>   rD   z  s    z$TestImageChooserSelectFormatView.getc                 C   s   | j td| jjfd|S r  rO  r   r=   r=   r>   r     s    z%TestImageChooserSelectFormatView.postc                 C   sF   |   }| |jd t|j }| |d d | |d d S )NrG   r  Zselect_formatz(wagtailimages/chooser/select_format.html)rD   rL   rM   r  r  rn   ro   rN   r  r=   r=   r>   rS     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  rG   z value=\"some previous alt text\"=id=\"id_image-chooser-insertion-image_is_decorative\" checked)rD   rL   rM   rO   rP   rQ   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  rU   r  rG   r  )rD   rL   rM   rO   rQ   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_textrG   Content-Typeapplication/jsonr  r  r  rm   r2   r   r+  altz*alt="Arthur &quot;two sheds&quot; Jackson"r   )r   rL   rM   r  r  rn   ro   strrl   rm   r   r<   rR   r  r  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  r  r  rU   zalt=""r   )r   r  r  rn   ro   rL   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   rU   Fr  z@Please add some alt text for your image or mark it as decorativer   )r   r  r  rn   ro   r   r  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   r?   rD   r   rS   r  r  r
  r  r  r=   r=   r=   r>   r  p  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ejdddiiddd Zedddd ZdS )TestImageChooserUploadViewc                 C   s   |    d S r   r   r;   r=   r=   r>   r?     s    z TestImageChooserUploadView.setUpc                 C   s   | j td|S )Nwagtailimages_chooser:createrB   rE   r=   r=   r>   rD     s    zTestImageChooserUploadView.getc                 C   sF   |   }| |jd | |d t|j }| |d d d S )NrG   /wagtailadmin/generic/chooser/creation_form.htmlr  Zreshow_creation_form)rD   rL   rM   rN   r  r  rn   ro   r  r=   r=   r>   rS     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   r  image-chooser-upload-titleimage-chooser-upload-filerG   r	  r(   r
  r  )rC   r   r   r   r*   r3   r  rL   rM   r)   r7   r   r   r  r  r  rp   r|   r  )r<   rR   r   rl   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   rG   r  r  r3   rJ   )rC   r   r   rL   rM   rN   r  rX   rQ   r=   r=   r>   test_upload_no_file_selected  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                    s&    j td| tdt j dS )Nr  r  r  rC   r   r   r   r*   r3   r  r	  r;   r=   r>   
post_image  s     
zDTestImageChooserUploadView.test_upload_duplicate.<locals>.post_imageTest duplicate imager	  rG   z3wagtailimages/chooser/confirm_duplicate_upload.html	new_imageexisting_imager  r   confirm_duplicate_upload_actionr  rS  rT  cancel_duplicate_upload_actionr  duplicate_found)r   )rL   rM   rN   r   r7   rD   rX   r   rm   r   r  r  rn   ro   	r<   r  rR   r)   r  r  Zchoose_new_image_actionZchoose_existing_image_actionr  r=   r;   r>   test_upload_duplicate  sP    
     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=truer  r  r  r	  r;   r=   r>   r  F  s    
 
zRTestImageChooserUploadView.test_upload_duplicate_select_format.<locals>.post_imager  r	  rG   r  r   r   r  r  rS  rT  r  r  r  )r   )rL   rM   r   r7   rD   r   rm   rX   r   r  r  rn   ro   r  r=   r;   r>   #test_upload_duplicate_select_formatE  sH    
   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  rG   r  r  r3   YUpload a valid image. The file you uploaded was either not an image or a corrupted image.action=\"%s\")
r   rC   r   r   rL   rM   rN   r  rX   rO   r<   Z
submit_urlrR   Zexpected_action_attrr=   r=   r>   /test_select_format_flag_after_upload_form_errorz  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  rG   r  r  r3   r  r#  N)r   rC   r   r   r*   r3   r  rL   rM   rN   r  rX   rO   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   r  r  rG   r	  )rC   r   r   r   r*   r3   r  rL   rM   rp   r)   r7   r   r'  rQ   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 )Nr_   r`   r   rd   r  r  )r  r  zimage-chooser-upload-collectionrG   r  r1  )r   ri   rj   r"   r7   r8   r*   rC   r   r   r   r3   r  rm   rL   rM   rN   rO   r2  r=   r=   r>   test_unique_together_validation  s4     
  z:TestImageChooserUploadView.test_unique_together_validationN)r   r   r   r?   rD   rS   r  r  r  r!  r%  r&  r   r   r%  r'  r(  r=   r=   r=   r>   r    s(   	85 
r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
0TestImageChooserUploadViewWithLimitedPermissionsc                 C   s   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 r5  rC  rG  r=   r=   r>   r?     s0        z6TestImageChooserUploadViewWithLimitedPermissions.setUpc                 C   s:   | j td}| |jd | |d | |d d S )Nr  rG   r  r   rC   rD   r   rL   rM   rN   rP   rQ   r=   r=   r>   r  		  s     z9TestImageChooserUploadViewWithLimitedPermissions.test_getc                 C   s:   | j td}| |jd | |d | |d d S )Nr  rG   r  r   r*  rQ   r=   r=   r>   test_get_chooser	  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   r  r  rG   r	  r(   )rC   r   r   r   r*   r3   r  rL   rM   r)   r7   r   r   rp   r'  rD   re   rr   r  r=   r=   r>   r  #	  s"     

 z9TestImageChooserUploadViewWithLimitedPermissions.test_addN)r   r   r   r?   r  r+  r  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 rJ  )r5   r6   r)   r7   r8   r*   rl   r;   r=   r=   r>   r?   B	  s
    
zTestMultipleImageUploader.setUpc                 C   s:   | j td}| |jd | |d | |d dS R
        This tests that the add view responds correctly on a GET request
        r   rG   wagtailimages/multiple/add.htmlr   Nr*  rQ   r=   r=   r>   r  K	  s    z"TestMultipleImageUploader.test_add  r*  c                 C   s8   | j td}| |jd d | |jd d d S )Nr   Zmax_filesizer0  error_max_file_sizeu3   This file is too big. Maximum filesize 1000 bytes.)rC   rD   r   rL   rX   rQ   r=   r=   r>   (test_add_max_file_size_context_variables[	  s    zBTestMultipleImageUploader.test_add_max_file_size_context_variablesc           	      C   s   t d}d}| j|}| |jd | || d}t|j}| || | t	|| t
 |}| j|_|j }tt||d< t|||d}| || | t	|| d S )Nr   r/  rG   z=Too big. <br/><br/><a href='/admin/images/add/'>Try this.</a>r1  rX   r   r   rC   rD   rL   rM   rN   r   rn   r  r   r   r6   Zcontext_datacopyr   r   r   	r<   r   Ztemplate_namerR   r   Zresponse_contentr   rX   r   r=   r=   r>   $test_add_error_max_file_size_escapede	  s(    

z>TestMultipleImageUploader.test_add_error_max_file_size_escapedc           	      C   s   t d}d}| j|}| |jd | || d}t|j}| || | t	|| t
 |}| j|_|j }tt||d< t|||d}| || | t	|| d S )Nr   r/  rG   z1Invalid image type. <a href='/help'>Get help.</a>Zerror_accepted_file_typesr3  r4  r6  r=   r=   r>   *test_add_error_accepted_file_types_escaped}	  s(    

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 titler  r2   files[]rG   r  r  3wagtailadmin/generic/multiple_upload/edit_form.htmlrl   r	  r2   .pngr  edit_action/admin/images/multiple/%d/delete_action!/admin/images/multiple/%d/delete/image_idsuccess	duplicateN)rC   r   r   r   r*   r3   r  rL   rM   rN   r   rX   r2   rp   r|   r  r   r7   rD   r  r  rm   initialr  r  rn   ro   r   r<   rR   rl   r  r=   r=   r>   test_add_post	  sP     
 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.pngZXMLHttpRequest)ZHTTP_X_REQUESTED_WITHrG   r  r  rl   r	  r>  r  r2   rD  N)rC   r   r   r   r*   r3   r  rL   rM   r   rX   rp   r|   r  r   r7   rD   r  rF  r  r  rn   ro   rG  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)rC   r   r   rL   rM   rQ   r=   r=   r>   test_add_post_nofile	  s    z.TestMultipleImageUploader.test_add_post_nofilec                 C   s   | 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<  r  s   This is not an image!rG   r  r  rC  r  rD  error_messager"  NrC   r   r   r   rL   rM   r  r  rn   ro   r  r   r   r  r=   r=   r>   test_add_post_badfile	  s$     z/TestMultipleImageUploader.test_add_post_badfileZjpgZgifr  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.txtr  rG   r  r  rC  r  rD  rM  z:Not a supported image format. Supported formats: JPG, GIF.N)rC   r   r   r   r*   r3   r  rL   rM   r  r  rn   ro   r  r   r   )r<   rR   Zpost_with_invalid_extensionr  r=   r=   r>   test_add_post_bad_extension
  sZ      
	  
	 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                    s&    j td| tdt j dS Nr   r  r;  r  r	  r;   r=   r>   r  R
  s     
zETestMultipleImageUploader.test_add_post_duplicate.<locals>.post_imagetest title duplicater	  rG   2wagtailimages/images/confirm_duplicate_upload.htmlrl   r  confirm_duplicate_uploadrD  rE  N)r:  )rL   rM   rN   rX   r2   r  r  rn   ro   r   rp   r<   r  rR   r  r=   r;   r>   test_add_post_duplicateL
  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.
        r  r`   r:  r;  r8  r  r  r  r6  r7  r<  r:  c                    s*   j td| tdt j  jdS )Nr   r  )r2   r<  re   )rC   r   r   r   r*   r3   r  rm   r	  r  r<   r=   r>   r  
  s     
zWTestMultipleImageUploader.test_add_post_duplicate_choose_permission.<locals>.post_imageFrR  r	  rG   rS  rl   rD  rE  r  rT  N)r:  )r   r7   r8   r   rD   rD  r   r   r!   rj   r   r6   rd  rF  r   rL   rM   ZassertTemplateNotUsedrX   r2   r  r  rn   ro   rp   r   r   r  )r<   r  r  r  r  rR   r  r=   rW  r>   )test_add_post_duplicate_choose_permissions
  sB      

 zCTestMultipleImageUploader.test_add_post_duplicate_choose_permissionc                 C   s,   | 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rC   rD   r   rl   rm   rL   rM   rQ   r=   r=   r>   test_edit_get
  s    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
        rY  r   image-%d-title
New title!image-%d-tagszcromarty, finisterrerG   r  r  rC  r  rD  r  ZcromartyN)rC   r   r   rl   rm   rL   rM   r  r  rn   ro   r   r  rp   r)   r7   rD   r2   r   names)r<   rR   r  rl   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
        rY  r   r^  rU   r`  rG   r  r  r=  r  r2   rJ   rC  rD  N)rC   r   r   rl   rm   rL   rM   rN   r  rX   r  r  rn   ro   r   r   r  r=   r=   r>   test_edit_post_validation_error
  s2    
 
 	   z9TestMultipleImageUploader.test_edit_post_validation_errorc                 C   s,   | j td| jjfd}| |jd dS )zn
        This tests that a GET request to the delete view returns a 405 "METHOD NOT ALLOWED" response
        wagtailimages:delete_multipler   rZ  Nr[  rQ   r=   r=   r>   test_delete_get  s    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
        rd  r   rG   r  r  r  rC  rD  N)rC   r   r   rl   rm   rL   rM   r   r)   r7   r   r'  r  r  rn   ro   r   rp   r  r=   r=   r>   test_delete_post  s    z*TestMultipleImageUploader.test_delete_postN)r   r   r   __doc__r?   r  r   r2  r7  r8  rH  rI  rK  rO  rP  rV  rX  r\  rb  rc  re  rg  r=   r=   r=   r>   r,  =	  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   s    |    tjjdt d| _d S )Ntest-image.pngr1   )r5   r"   r7   r8   r*   rl   r;   r=   r=   r>   r?   ,  s
    z3TestMultipleImageUploaderWithCustomImageModel.setUpc                 C   s:   | j td}| |jd | |d | |d dS r-  )rC   rD   r   rL   rM   rN   rO   rQ   r=   r=   r>   r  5  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 )r9  r   r<  r  rG   r  r  r=  rl   r  r2   captionnot_editable_fieldr?  r@  rA  rB  rD  rE  N)rC   r   r   r   r*   r3   r  rL   rM   rN   r   rX   r2   rp   r|   r  rF  fieldsr  rm   r  r  rn   ro   r   r  r=   r=   r>   rH  C  sJ      

 z;TestMultipleImageUploaderWithCustomImageModel.test_add_postc                 C   s   | j tddtddi}| |jd | |d d t|j	 }| 
d| | 
d	| | d
| | d| | |d
  | |d d dS rL  rN  r  r=   r=   r>   rO  s  s$     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                    s&    j td| tdt j dS rQ  r  r	  r;   r=   r>   r    s     
zYTestMultipleImageUploaderWithCustomImageModel.test_add_post_duplicate.<locals>.post_imagerR  r	  rG   rS  rl   rl  r  rm  rT  rD  rE  )r:  )rL   rM   rN   rX   r2   r   rn  r  r  r  rn   ro   rp   rU  r=   r;   r>   rV    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 snapsr`   r   rk  )r<  re   r(   rG   r  r  r=  N)r   ri   rj   rl   re   r   r"   r7   r   r    rC   r   r   r   r*   r3   r  rm   rL   rM   rN   )r<   rq   new_collectionimage_count_beforeuploaded_image_count_beforerR   image_count_afteruploaded_image_count_afterr=   r=   r>   r3    s2    


 



 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]  rY  r   r^  r_  r`  zfootwear, dystopiaimage-%d-captionz(a boot stamping on a human face, foreverrG   r  r  rC  r  rD  r  ZfootwearN)rC   r   r   rl   rm   rL   rM   r  r  rn   ro   r   r  rp   r"   r7   rD   r2   rl  r   ra  )r<   rR   r  r  r=   r=   r>   rb    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
        ro  r`   zThe Eiffel Towerrd   rY  r   r^  zimage-%d-collectionr`  rU   ru  z	ooh la larG   r  r  r=  rC  rD  r1  r  N)r   ri   rj   r"   r7   r8   r*   rC   r   r   rl   rm   rL   rM   rN   r  r  rn   ro   r   r   )r<   rq   rp  rR   r  r=   r=   r>   *test_edit_fails_unique_together_validation  s@    
 
 
 
  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 )rf  rd  r   rG   r  r  r  rC  rD  r   N)rC   r   r   rl   rm   rL   rM   r   r)   r7   r   r'  r  r  rn   ro   r   rp   r"   r   r  r=   r=   r>   rg  #  s    z>TestMultipleImageUploaderWithCustomImageModel.test_delete_postN)r   r   r   rh  r?   r  rH  rO  rV  r3  rb  rv  rg  r=   r=   r=   r>   ri  %  s   	0$%"*ri  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 )1TestMultipleImageUploaderWithCustomRequiredFieldsrj  c                 C   s0   |   | _tjjtjt t | jd| _	d S )N)Zfor_content_typer3   r  )
r5   r6   r    r7   r8   r   Zget_for_modelr   r*   uploaded_imager;   r=   r=   r>   r?   E  s    
z7TestMultipleImageUploaderWithCustomRequiredFields.setUpc                 C   s.   | j td}| |jd | |d dS )r.  r   rG   r/  N)rC   rD   r   rL   rM   rN   rQ   r=   r=   r>   r  O  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<  r  r(   rG   r  r  r=  rx  r  r2   authorr?  5/admin/images/multiple/create_from_uploaded_image/%d/rA  (/admin/images/multiple/delete_upload/%d/rD  N)r#   r7   r   r    rC   r   r   r   r*   r3   r  rL   rM   rN   r   rX   rp   ra   rF  rn  rm   r  r  rn   ro   r<   rq  rr  rR   rs  rt  r  r=   r=   r>   rH  Z  sT    

  
	

 

z?TestMultipleImageUploaderWithCustomRequiredFields.test_add_postc                 C   s   | j tddtddi}| |jd | |d d t|j	 }| 
d| | 
d	| | d
| | d| | |d
  | |d d dS rL  rN  r  r=   r=   r>   rO    s$     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-tagsrU   uploaded-image-%d-authorrG   r  r  r  ry  r?  rz  rx  rA  r{  rJ   rD  N)r#   r7   r   r    rC   r   r   rx  rm   rL   rM   r   rX   rn  r  r  r  rn   ro   r   r|  r=   r=   r>   $test_create_from_upload_invalid_post  sX    


 
 
 



  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   r~  r_  r  zabstract, squaresr  zPiet MondrianrG   r  r  rC  rD  r(   r  r
  r  ZabstractN)r#   r7   r   r    rC   r   r   rx  rm   rL   rM   r  r  rn   ro   r   rp   rD   r2   ry  r3   ra   r  r|   r  r  r   ra  )r<   rq  rr  rR   rs  rt  r  rl   r=   r=   r>   test_create_from_upload  sB    


 

 

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   rG   r  r  r  rD  N)rC   r   r   rx  rm   rL   rM   r   r    r7   r   r'  r  r  rn   ro   rp   r  r=   r=   r>   test_delete_uploaded_image  s     zLTestMultipleImageUploaderWithCustomRequiredFields.test_delete_uploaded_imageN)r   r   r   rh  r?   r  rH  rO  r  r  r  r=   r=   r=   r>   rw  >  s   
870rw  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestURLGeneratorViewc                 C   s"   t jjdt d| _|  | _d S rJ  r)   r7   r8   r*   rl   r5   r6   r;   r=   r=   r>   r?   .  s
    zTestURLGeneratorView.setUpc                 C   s8   | j td| jjfd}| |jd | |d dS )l
        This tests that the view responds correctly for a user with edit permissions on this image
        wagtailimages:url_generatorr   rG   z'wagtailimages/images/url_generator.htmlNrC   rD   r   rl   rm   rL   rM   rN   rQ   r=   r=   r>   r  8  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;  r8  r  r   r  N)r6   rd  re  r   r   r7   rD   r   rC   r   rl   rm   r  rQ   r=   r=   r>   test_get_bad_permissionsE  s     
z-TestURLGeneratorView.test_get_bad_permissionsN)r   r   r   r?   r  r  r=   r=   r=   r>   r  -  s   
r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestGenerateURLViewc                 C   s"   t jjdt d| _|  | _d S rJ  r  r;   r=   r=   r>   r?   ]  s
    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   rG   r  r  r   Zpreview_urlz@http://localhost/images/%(signature)s/%(image_id)d/fill-800x600/)safe)	signaturerC  wagtailimages:previewN)rC   rD   r   rl   rm   rL   rM   r  r  rn   ro   setkeysr   r   r   r   urlquote_safechars)r<   rR   Zcontent_jsonrZ  Zexpected_preview_urlr=   r=   r>   r  g  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;  r8  r  r  r   i  r  r  errorz<You do not have permission to generate a URL for this image.N)r6   rd  re  r   r   r7   rD   r   rC   r   rl   rm   rL   rM   assertJSONEqualrn   ro   r  dumpsrQ   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(   r  r   r\   r  r  r  zCannot find image.NrC   rD   r   rl   rm   rL   rM   r  rn   ro   r  r  rQ   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   rJ  r  r  r  zInvalid filter spec.Nr  rQ   r=   r=   r>   test_get_bad_filter_spec  s      
 z,TestGenerateURLView.test_get_bad_filter_specN)r   r   r   r?   r  r  r  r  r=   r=   r=   r>   r  \  s
   
# r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestPreviewViewc                 C   s"   t jjdt d| _|  | _d S rJ  r  r;   r=   r=   r>   r?     s
    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
        r  r  r   rG   r  r  Nr[  rQ   r=   r=   r>   r    s
    zTestPreviewView.test_getc              	   C   sj   G dd dt }ttd|g" | jtd| jjdfd}W 5 Q R X | 	|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edddZdS )	zCTestPreviewView.test_preview_with_optimizer.<locals>.DummyOptimizerdummyZpngc                 S   s   dS )NTr=   )clsr=   r=   r>   check_library   s    zQTestPreviewView.test_preview_with_optimizer.<locals>.DummyOptimizer.check_library)	file_pathc                 S   s   d S r   r=   )r  r  r=   r=   r>   process  s    zKTestPreviewView.test_preview_with_optimizer.<locals>.DummyOptimizer.processN)	r   r   r   Zlibrary_nameZimage_formatclassmethodr  r  r  r=   r=   r=   r>   DummyOptimizer  s   
r  Z_registered_optimizersr  r  r   rG   r  r  N)r   r   objectr   rC   rD   r   rl   rm   rL   rM   )r<   r  rR   r=   r=   r>   test_preview_with_optimizer  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.
        r  r  r   rJ  Nr[  rQ   r=   r=   r>   test_get_invalid_filter_spec  s    
z,TestPreviewView.test_get_invalid_filter_specN)r   r   r   r?   r  r  r  r=   r=   r=   r>   r    s   
r  c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	d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   r1   r  r  r>  r?  r6  r  r8  r:  r;  r  r`   r<  rB  )r)   r7   r8   r*   rl   rE  r   rD   r   rD  r   r   r   ri   rF  r5   )r<   r6   r  rH  Zimage_changers_groupr=   r=   r>   r?   %  s4        zTestEditOnlyPermissions.setUpc                 C   sF   | j td}| |jd | |d | |d | |d d S )NrA   rG   rH   rI   r   )rC   rD   r   rL   rM   rN   rP   rO   rQ   r=   r=   r>   test_get_indexB  s
    z&TestEditOnlyPermissions.test_get_indexc                 C   s:   | j tdddi}| |jd | |jd d d S )NrA   rT   r  rG   rV   )rC   rD   r   rL   rM   rX   rQ   r=   r=   r>   r   M  s    z#TestEditOnlyPermissions.test_searchc                 C   s$   | j td}| |td d S )Nr   r  rC   rD   r   r  rQ   r=   r=   r>   test_get_addR  s    z$TestEditOnlyPermissions.test_get_addc                 C   s8   | j td| jjfd}| |jd | |d d S )Nr   r   rG   rQ  r  rQ   r=   r=   r>   test_get_editW  s    z%TestEditOnlyPermissions.test_get_editc                 C   s8   | j td| jjfd}| |jd | |d d S )Nr  r   rG   r  r  rQ   r=   r=   r>   test_get_delete\  s
    z'TestEditOnlyPermissions.test_get_deletec                 C   s$   | j td}| |td d S )Nr   r  r  rQ   r=   r=   r>   test_get_add_multiplec  s    z-TestEditOnlyPermissions.test_get_add_multipleN)
r   r   r   r?   r  r   r  r  r  r  r=   r=   r=   r>   r  $  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   rG   r/  )r5   rC   rD   r   rL   rM   rN   rQ   r=   r=   r>   test_as_superuserj  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 )NZeditorr>  rB  r6  r7  r8  r:  r;  r  r`   r<  r   rG   r/  )rE  r   r7   rD   r   r8   rD  r   r   r   ri   rF  r5   rC   r   rL   rM   rN   )r<   r6   r  rH  Zimage_adders_grouprR   r=   r=   r>   test_as_ordinary_editorp  s*      z0TestImageAddMultipleView.test_as_ordinary_editorN)r   r   r   r  r  r=   r=   r=   r>   r  i  s   r  )^r  r  r   Zunittest.mockr   Zdjango.confr   Zdjango.contrib.auth.modelsr   r   Z"django.contrib.contenttypes.modelsr   Zdjango.core.files.uploadedfiler   r   Zdjango.db.models.lookupsr	   Zdjango.template.defaultfiltersr
   Zdjango.template.loaderr   Zdjango.testr   r   r   r   Zdjango.urlsr   Zdjango.utils.encodingr   Zdjango.utils.htmlr   r   Zdjango.utils.httpr   r   Zdjango.utils.safestringr   Zwillow.optimizers.baser   Zwillow.registryr   Zwagtail.admin.admin_url_finderr   Zwagtail.imagesr   Zwagtail.images.utilsr   Zwagtail.images.views.imagesr   Zwagtail.modelsr   r   r   r    r!   Zwagtail.test.testapp.modelsr"   r#   r$   r%   Zwagtail.test.utilsr&   Zwagtail.test.utils.timestampsr'   utilsr)   r*   r+   r  r,   r   r   r   r4  rI  r  r  r  r  r  r  r  r  r  r)  r,  ri  rw  r  r  r  r  r  r=   r=   r=   r>   <module>   s     dt  NP   dz Q"(_  !O   k   o/ GE