o
    h                     @   s  d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZ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mZmZmZ G dd dZG dd deZG dd deZe   G dd deZ!e!   G dd deZ"e"   G dd deZ#e#   G dd deZ$G dd deZ%dd Z&G dd deZ'G d d! d!eZ(G d"d# d#eZ)G d$d% d%eZ*G d&d' d'eZ+G d(d) d)eZ,G d*d+ d+eZ-G d,d- d-eZ.G d.d/ d/eZ/d0S )1    )BytesIO)Path)patch)TestCaseoverride_settings)hooks)image_operations)InvalidFilterSpecErrorUnknownOutputImageFormatError)TransformOperation)FilterImage)get_rendition_or_not_found)get_test_image_fileget_test_image_file_avifget_test_image_file_jpegget_test_image_file_tiffget_test_image_file_webpc                   @   s<   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	dS )DummyImageTransformz~
    This class pretends to be a ImageTransform but instead, it records
    the operations that have been performed on it
    c                 C   s   |  | || _g | _d S N)_check_sizesize
operations)selfr    r   j/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/images/tests/test_image_operations.py__init__   s   

zDummyImageTransform.__init__c                 C   s   t | j}| j |_|S r   )r   r   r   copy)r   cloner   r   r   r   $   s   
zDummyImageTransform.clonec                 C   s,   |  | |  }|jd|f ||_|S )z^
        Change the image size, stretching the transform to make it fit the new size.
        resize)r   r   r   appendr   )r   r   r   r   r   r   r   )   s
   
zDummyImageTransform.resizec                 C   s<   |  t|j |  }|jdt|f t|j|_|S )z7
        Crop the image to the specified rect.
        crop)r   tupler   r   r   r    )r   rectr   r   r   r   r!   3   s
   zDummyImageTransform.cropc                 C   sj   t | trt| dkst| d | d kst| d | d kr#td| d dk s/| d dk r3tdd S )N   r      z(Image size must be a 2-tuple of integersz0Image width and height must both be 1 or greater)
isinstancer"   lenint	TypeError
ValueErrorr   r   r   r   r   =   s   zDummyImageTransform._check_sizeN)
__name__
__module____qualname____doc__r   r   r   r!   staticmethodr   r   r   r   r   r      s    

r   c                   @   s\   e Zd ZdZg Zg Zg Zg Zedd Z	edd Z
edd Zedd	 Zed
d ZdS )ImageTransformOperationTestCaseNc                    s     fdd}t d |_|S )Nc                    s8   | j d }  D ]\}}| t||| qd S N-)operation_classsplititemsassertEqualgetattr)r   	operationattrvalueexpected_outputfilter_specr   r   test_filter_specT   s   zOImageTransformOperationTestCase.make_filter_spec_test.<locals>.test_filter_specztest_filter_%sstrr,   )clsr>   r=   r?   r   r<   r   make_filter_spec_testR   s   z5ImageTransformOperationTestCase.make_filter_spec_testc                    s$    fdd}t d tj|_|S )Nc                    s    | j t| jg dR   d S r2   )assertRaisesr	   r4   r5   r   r>   r   r   test_filter_spec_error`   s
   z[ImageTransformOperationTestCase.make_filter_spec_error_test.<locals>.test_filter_spec_errorztest_filter_{}_raises_{})rA   formatr	   r,   )rB   r>   rG   r   rF   r   make_filter_spec_error_test^   s   z;ImageTransformOperationTestCase.make_filter_spec_error_testc                    s"    fdd}t d |_|S )Nc                    sL   t di }| jd }t|j|jf}|||}| |j  d S Nr3   r   )	r   r4   r5   r   widthheightrunr7   r   r   imager9   contextr=   r>   image_kwargsr   r   test_runn   s
   z?ImageTransformOperationTestCase.make_run_test.<locals>.test_runztest_run_%sr@   )rB   r>   rR   r=   rS   r   rQ   r   make_run_testl   s   z-ImageTransformOperationTestCase.make_run_testc                    s     fdd}t d  |_|S )Nc                    sj   t di }| j d }t|j|jf}| t ||| W d    d S 1 s.w   Y  d S rJ   )	r   r4   r5   r   rK   rL   rD   r*   rM   rN   r>   rR   r   r   
test_norun   s   "zCImageTransformOperationTestCase.make_norun_test.<locals>.test_norunztest_norun_%sr@   )rB   r>   rR   rV   r   rU   r   make_norun_test   s   z/ImageTransformOperationTestCase.make_norun_testc                 C   s   | j d u rd S | jD ]}| j| }t| |j| q
| jD ]}| |}t| |j| q| jD ]}| j| }t| |j| q.| j	D ]}| j
| }t| |j| q@d S r   )r4   filter_spec_testsrC   setattrr,   filter_spec_error_testsrI   	run_testsrT   norun_testsrW   )rB   argsfilter_spec_testr>   filter_spec_error_testrun_test
norun_testr   r   r   setup_test_methods   s   








z2ImageTransformOperationTestCase.setup_test_methods)r,   r-   r.   r4   rX   rZ   r[   r\   classmethodrC   rI   rT   rW   rb   r   r   r   r   r1   K   s     



r1   c                   @   s  e Zd ZejZdddddfdddddfdddddfdddd	dfd
ddddfdddd	dfdddddfgZg dZddddddgfddddddgfddddddgfddddddddddgfdddddddddgfd d!dd!ddddd"gfd#d!ddddd$dd%d&gfd'dddd(gfd)d*dd+ddddd,gfd-d*d*d+d+d*d*dd.gfd/d	d	dd0gfd1d	d	dd0gfd2d	d	dd0gfgZd3S )4TestFillOperationzfill-800x600   X  r   )rK   rL   crop_closenesszhello-800x600zfill-800x600-c0zfill-800x600-c100r%   zfill-800x600-c50g      ?zfill-800x600-c1000zfill-800000x100i 5 d   )fillzfill-800zfill-abczfill-800xabczfill-800x600-zfill-800x600x10zfill-800x600-d100  rK   rL   )r!   )r   }   rj   ik  )r   )re   rf   zfill-200x200  i  )r!   )r   Z   rm   iv  )r   )   ro   z
fill-80x60  )rK   rL   focal_point_xfocal_point_yfocal_point_widthfocal_point_height)r   )P   <   zfill-80x60-c100)r!   )i    rj     zfill-100x60-c100  )r!   )il  rw   ry   rx   zfill-50x50-c100   )r!   )i  i  i  i&  )r   )2   r{   zfill-1000x800)r!   )r   
   rh   rn   zfill-1000x800-c100  i  )r!   )   rh   i  i  zfill-1500x1500-c100)r!   )r   r   r}   r}   fill-100x100)r!   )r   r   r%   r%   zfill-100x150zfill-150x100N)	r,   r-   r.   r   FillOperationr4   rX   rZ   r[   r   r   r   r   rd      s    






	
 rd   c                   @   s~   e Zd ZejZdddddfdddddfgZg dZdd	d	d
dgfdd	d	d
dgfdd	dd
dgfddd	d
dgfgZdS )TestMinMaxOperationzmin-800x600minre   rf   )methodrK   rL   zmax-800x600max)r   zmin-800zmin-abczmin-800xabczmin-800x600-zmin-800x600-c100zmin-800x600x10rj   rk   )r   )re   re   )r   )rf   rf   zmax-400x400r%   r   )  r%   r   )r%   r   N)	r,   r-   r.   r   MinMaxOperationr4   rX   rZ   r[   r   r   r   r   r   x  s6    			r   c                   @   sz   e Zd ZejZddddfddddfgZg dZd	d
dddgfdd
dddgfd	d
dddgfdddddgfgZdS )TestWidthHeightOperationz	width-800rK   re   )r   r   z
height-600rL   rf   )rK   zwidth-800x600z	width-abczwidth-800-c100	width-400rj   rp   rk   )r   )r   ro   z
height-400)r   )re   r   r%   r   r   N)	r,   r-   r.   r   WidthHeightOperationr4   rX   rZ   r[   r   r   r   r   r     s6    
			r   c                   @   s   e Zd ZejZddddfddddfgZg dZddd	d
dgfddd	d
dgfddd	d
dededffgfdddd
dgfddd	d
dgfgZ	dS )TestScaleOperationz	scale-100scalerh   )r   percentzscale-50r{   )r   zscale-800x600z	scale-abczscale-800-c100rj   rp   rk   )r   )rj   rp   )r   )rp   r~   zscale-83.0322r   gjt@gjty@r%   )r   )rp   r%   )r   )r%   r~   N)
r,   r-   r.   r   ScaleOperationr4   rX   rZ   r(   r[   r   r   r   r   r     s@    
				r   c                   @   $   e Zd Zdd Zdd Zdd ZdS )TestCacheKeyc                 C   0   t ddd}tdd}||}| |d d S )Nrj   rk   zmax-100x100spec r   r   get_cache_keyr7   r   rO   fil	cache_keyr   r   r   test_cache_key&     

zTestCacheKey.test_cache_keyc                 C   r   )Nrj   rk   r   r   2e16d0bar   r   r   r   r   test_cache_key_fill_filter-  r   z'TestCacheKey.test_cache_key_fill_filterc                 C   s8   t ddddddd}tdd}||}| |d d S )Nrj   rh   rp   )rK   rL   rs   rt   rq   rr   r   r   0bbe3b2fr   r   r   r   r   +test_cache_key_fill_filter_with_focal_point4  s   

z8TestCacheKey.test_cache_key_fill_filter_with_focal_pointN)r,   r-   r.   r   r   r   r   r   r   r   r   %  s    r   c                   @   r   )DummyOperationc                 C      d S r   r   rE   r   r   r   	constructD     zDummyOperation.constructc                 C   r   r   r   r   rP   rO   r   r   r   run_mockG  r   zDummyOperation.run_mockc                 C   s   |  || |S r   )r   r   r   r   r   rM   J  s   zDummyOperation.runN)r,   r-   r.   r   r   rM   r   r   r   r   r   C  s    r   c                   C   s   dt fdt fgS )N
operation1
operation2)r   r   r   r   r   register_image_operations_hookO  s   r   c                   @   s,   e Zd Zeedededd Z	dS )
TestFilterr   register_image_operationsc                 C   s<   t dd}tjjdt d}||t  | |jd d S )Noperation1|operation2r   
Test imagetitlefiler$   )	r   r   objectscreater   rM   r   r7   
call_count)r   r   r   rO   r   r   r   test_runs_operationsT  s   
zTestFilter.test_runs_operationsN)
r,   r-   r.   r   objectr   r   register_temporarilyr   r   r   r   r   r   r   S  s    
r   c                   @   s    e Zd Zededd ZdS )TestUnknownOutputImageFormatr   c                 C   4   t dd}tjjdt d}| t|j|t  d S )Nr   r   r   r   )	r   r   r   r   r   rD   r
   rM   r   r   r   rO   r   r   r   test_run_raises_errord  s
   
z2TestUnknownOutputImageFormat.test_run_raises_errorN)r,   r-   r.   r   r   r   r   r   r   r   r   r   c  s
    r   c                   @   sl   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )TestFormatFilterc                 C   <   t dd}tjjdt d}||t }| |jd d S )Nwidth-400|format-avifr   r   r   avif	r   r   r   r   r   rM   r   r7   format_namer   r   rO   outr   r   r   	test_avifp     
zTestFormatFilter.test_avifc                 C   l   t dd}tjjdt d}t }td}||| W d    n1 s&w   Y  |j|dddd	 d S )
Nzwidth-400|format-avif-losslessr   r   r   PIL.Image.Image.saveAVIF  qualitychroma	r   r   r   r   r   r   r   rM   assert_called_withr   r   rO   fsaver   r   r   test_avif_losslessz     

z#TestFormatFilter.test_avif_losslessc                 C   r   )Nzwidth-400|format-jpegr   r   r   jpegr   r   r   r   r   	test_jpeg  r   zTestFormatFilter.test_jpegc                 C   r   )Nzwidth-400|format-pngr   r   r   pngr   r   r   r   r   test_png  r   zTestFormatFilter.test_pngc                 C   r   )Nzwidth-400|format-gifr   r   r   gifr   r   r   r   r   test_gif  r   zTestFormatFilter.test_gifc                 C   r   )Nwidth-400|format-webpr   r   r   webpr   r   r   r   r   	test_webp  r   zTestFormatFilter.test_webpc                 C   r   )Nwidth-400|format-icor   r   r   icor   r   r   r   r   test_ico  r   zTestFormatFilter.test_icoc                 C   s@   t dd}tjjdt d}t||}| t|jj	j
d d S )Nr   r   r   r   z.ico)r   r   r   r   r   r   r7   r   r   namesuffix)r   r   
good_image	renditionr   r   r   test_ico_rendition  s   

z#TestFormatFilter.test_ico_renditionc                 C   r   )
Nzwidth-400|format-webp-losslessr   r   r   r   WEBPru   Tr   losslessr   r   r   r   r   test_webp_lossless  r   z#TestFormatFilter.test_webp_losslessc                 C   r   )Nzwidth-400|format-heicr   r   r   heicr   r   r   r   r   	test_heic  r   zTestFormatFilter.test_heicc                 C   r   )
Nzwidth-400|format-heic-losslessr   r   r   r   HEIFr   r   r   r   r   r   r   r   test_heic_lossless     

z#TestFormatFilter.test_heic_losslessc                 C   r   )Nzwidth-400|format-foor   r   r   )	r   r   r   r   r   rD   r	   rM   r   r   r   r   r   test_invalid     
zTestFormatFilter.test_invalidN)r,   r-   r.   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   o  s    







r   c                   @   X   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zedddd Z	edddd Z
dS )TestAvifQualityFilterc                 C   j   t dd}tjjdt d}t }td}||| W d    n1 s&w   Y  |j|ddd d S )	Nr   r   r   r   r   r   ru   r   )	r   r   r   r   r   r   r   rM   r   r   r   r   r   test_default_quality     

z*TestAvifQualityFilter.test_default_qualityc                 C   r   	Nz$width-400|avifquality-40|format-avifr   r   r   r   r   (   r   	r   r   r   r   r   r   r   rM   r   r   r   r   r   test_avif_quality_filter   r   z.TestAvifQualityFilter.test_avif_quality_filterc                 C   r   )Nz%width-400|avifquality-abc|format-avifr   r   r   	r   r   r   r   r   rD   r	   rM   r   r   r   r   r    test_avif_quality_filter_invalid  r   z6TestAvifQualityFilter.test_avif_quality_filter_invalidc                 C   r   )Nzwidth-400|avifqualityr   r   r   r   r   r   r   r   !test_avif_quality_filter_no_value  r   z7TestAvifQualityFilter.test_avif_quality_filter_no_valuec                 C   r   )Nz%width-400|avifquality-101|format-avifr   r   r   r   r   r   r   r    test_avif_quality_filter_too_big  r   z6TestAvifQualityFilter.test_avif_quality_filter_too_bigr{   )WAGTAILIMAGES_AVIF_QUALITYc                 C   r   )	Nr   r   r   r   r   r   r{   r   r   r   r   r   r   test_avif_quality_setting%     

z/TestAvifQualityFilter.test_avif_quality_settingc                 C   r   r   r   r   r   r   r   *test_avif_quality_filter_overrides_setting3  r   z@TestAvifQualityFilter.test_avif_quality_filter_overrides_settingN)r,   r-   r.   r   r   r   r   r   r   r   r  r   r   r   r   r         
r   c                   @   r   )TestJPEGQualityFilterc                 C   n   t dd}tjjdt d}t }td}||| W d    n1 s&w   Y  |j|ddddd	 d S )
Nr   r   r   r   r   JPEGU   Tr   optimizeprogressiver   r   r   r   r   r   C     

z*TestJPEGQualityFilter.test_default_qualityc                 C   r  
Nzwidth-400|jpegquality-40r   r   r   r   r  r   Tr  r   r   r   r   r   test_jpeg_quality_filterP  r
  z.TestJPEGQualityFilter.test_jpeg_quality_filterc                 C   r   )Nzwidth-400|jpegquality-abcr   r   r   r   r   r   r   r    test_jpeg_quality_filter_invalid]  r   z6TestJPEGQualityFilter.test_jpeg_quality_filter_invalidc                 C   r   )Nzwidth-400|jpegqualityr   r   r   r   r   r   r   r   !test_jpeg_quality_filter_no_valuee  r   z7TestJPEGQualityFilter.test_jpeg_quality_filter_no_valuec                 C   r   )Nzwidth-400|jpegquality-101r   r   r   r   r   r   r   r    test_jpeg_quality_filter_too_bigm  r   z6TestJPEGQualityFilter.test_jpeg_quality_filter_too_bigr{   )WAGTAILIMAGES_JPEG_QUALITYc                 C   r  )
Nr   r   r   r   r   r  r{   Tr  r   r   r   r   r   test_jpeg_quality_settingu     

z/TestJPEGQualityFilter.test_jpeg_quality_settingc                 C   r  r  r   r   r   r   r   *test_jpeg_quality_filter_overrides_setting  r  z@TestJPEGQualityFilter.test_jpeg_quality_filter_overrides_settingN)r,   r-   r.   r   r  r  r  r  r   r  r  r   r   r   r   r  B  r  r  c                   @   r   )TestWebPQualityFilterc                 C   r   )
Nr   r   r   r   r   r   ru   Fr   r   r   r   r   r   r     r   z*TestWebPQualityFilter.test_default_qualityc                 C   r   
Nz$width-400|webpquality-40|format-webpr   r   r   r   r   r   Fr   r   r   r   r   r   test_webp_quality_filter  r   z.TestWebPQualityFilter.test_webp_quality_filterc                 C   r   )Nz%width-400|webpquality-abc|format-webpr   r   r   r   r   r   r   r    test_webp_quality_filter_invalid  r   z6TestWebPQualityFilter.test_webp_quality_filter_invalidc                 C   r   )Nzwidth-400|webpqualityr   r   r   r   r   r   r   r   !test_webp_quality_filter_no_value  r   z7TestWebPQualityFilter.test_webp_quality_filter_no_valuec                 C   r   )Nz%width-400|webpquality-101|format-webpr   r   r   r   r   r   r   r    test_webp_quality_filter_too_big  r   z6TestWebPQualityFilter.test_webp_quality_filter_too_bigr{   )WAGTAILIMAGES_WEBP_QUALITYc                 C   r   )
Nr   r   r   r   r   r   r{   Fr   r   r   r   r   r   test_webp_quality_setting     

z/TestWebPQualityFilter.test_webp_quality_settingc                 C   r   r  r   r   r   r   r   *test_webp_quality_filter_overrides_setting  r  z@TestWebPQualityFilter.test_webp_quality_filter_overrides_settingN)r,   r-   r.   r   r  r  r  r  r   r  r  r   r   r   r   r    r  r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestBackgroundColorFilterc                 C   <   t dd}tjjdt d}||t }| |  d S )Nr   r   r   r   )	r   r   r   r   r   rM   r   
assertTrue	has_alphar   r   r   r   test_original_has_alpha  s   
z1TestBackgroundColorFilter.test_original_has_alphac                 C   r  )Nzwidth-400|bgcolor-fffr   r   r   	r   r   r   r   r   rM   r   assertFalser!  r   r   r   r   test_3_digit_hex  r   z*TestBackgroundColorFilter.test_3_digit_hexc                 C   r  )Nzwidth-400|bgcolor-ffffffr   r   r   r#  r   r   r   r   test_6_digit_hex  r   z*TestBackgroundColorFilter.test_6_digit_hexc                 C   r   )Nzwidth-400|bgcolor-foor   r   r   	r   r   r   r   r   rD   r*   rM   r   r   r   r   r   r     r   z&TestBackgroundColorFilter.test_invalidc                 C   r   )Nzwidth-400|bgcolor-1234r   r   r   r'  r   r   r   r   test_invalid_length
  r   z-TestBackgroundColorFilter.test_invalid_lengthN)r,   r-   r.   r"  r%  r&  r   r(  r   r   r   r   r    s    

r  c                   @   s*   e Zd Zdd Zeddiddd ZdS )TestWebpFormatConversionc                 C   <   t dd}tjjdt d}||t }| |jd dS )z0by default, webp images will be converted to pngr   r   r   r   r   N	r   r   r   r   r   rM   r   r7   r   r   r   r   r   test_webp_convert_to_png  s   
z1TestWebpFormatConversion.test_webp_convert_to_pngr   ) WAGTAILIMAGES_FORMAT_CONVERSIONSc                 C   r*  )zMWAGTAILIMAGES_FORMAT_CONVERSIONS can be overridden to disable webp conversionr   r   r   r   r   Nr+  r   r   r   r   !test_override_webp_convert_to_png   s   
z:TestWebpFormatConversion.test_override_webp_convert_to_pngN)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 )TestCheckSizec              	   C   sX   g d}|D ]#}| j |d | tjj|dd W d    n1 s$w   Y  qd S )N)      ?r1  r1  r%   r%   r1  r%   r%   r+   Tallow_floating_point)subTestassertIsNoner   ImageTransformr   )r   sizesr   r   r   r   #test_check_size_when_floats_allowed/  s   z1TestCheckSize.test_check_size_when_floats_allowedc              
   C   s   g d}|D ]5}| j |d% | t tjj|dd W d    n1 s'w   Y  W d    n1 s6w   Y  q| tjjddd d S )N)r0  r2  r3  r+   Fr5  r4  )r7  rD   r)   r   r9  r   r8  )r   
fail_sizesr   r   r   r   %test_check_size_when_floats_forbidden>  s    z3TestCheckSize.test_check_size_when_floats_forbiddenN)r,   r-   r.   r;  r=  r   r   r   r   r/  .  s    r/  N)0ior   pathlibr   unittest.mockr   django.testr   r   wagtailr   wagtail.imagesr   wagtail.images.exceptionsr	   r
   wagtail.images.image_operationsr   wagtail.images.modelsr   r   wagtail.images.shortcutsr   wagtail.images.tests.utilsr   r   r   r   r   r   r1   rd   rb   r   r   r   r   r   r   r   r   r   r   r  r  r  r)  r/  r   r   r   r   <module>   sF    	2a J63; PPP1