o
    ?hn\                     @   s&  d Z ddlZddlm  mZ ddlZddlZddl	Z	ddl
Z
ddlZddlmZ dd Zdd Zejjdd	 Zejjd
d Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd ZdS ) a  
test_images.py

Purpose:
  Comprehensive test suite for image management functionality including image upload
  simulation, gallery display, deletion, share link generation, and media access.
  Tests image storage, retrieval, pagination, filtering, and user permission boundaries.
  
  This module implements red-team level security testing with comprehensive input
  validation and follows modular, well-organized patterns for production Apache2
  deployment scenarios. Each test ensures proper authentication, CSRF protection,
  file system security, and database state verification.

Test Categories:
  - Image file upload simulation and storage
  - Gallery pagination and image listing
  - Camera-specific gallery filtering  
  - Image detail viewing with access control
  - Image deletion and cleanup verification
  - Share link generation with expiration
  - Media URL generation and access
  - User permission boundaries and data isolation
  - Database vs filesystem consistency
    N)get_dbc                  C   s8   t t d d } t t d d }| d|dS )z1Generate a unique 12-digit camera ID for testing.i  i i@B i'  08d04d)inttime)	timestamprandom_part r	   -/var/www/html/tests/functional/test_images.pyget_unique_camera_id"   s   r   c                 C   sl   t d}d| d| d}tj| |}t|d}||d  W d   n1 s,w   Y  d| S )	z;Create a test image file in the temporary static directory.z%Y%m%d_%H%M%SPICT__.jpgwbdataNUser-photos/)r   strftimeospathjoinopenwrite)temp_static_dir	camera_id
image_datar   filename
image_pathfr	   r	   r
   create_test_image_file)   s   

r   c                 C   s  |d }|d }t  }| jd|d |d dd}|j}d}	||	k}
|
sXtd	|
fd
||	fdt v s9t|r>t|ndt|t|	d }dd|i }t	t
|d } }
}	|  I}|d}d}||u}|std|fd||fdt v st|rt|ndt|d }dd|i }t	t
|d }}W d   n1 sw   Y  | j  t }|d|t|df |  W d   n1 sw   Y  t|||}tj|}tj||}tj}|j}
|
|}|s8ddt v sttrttndt|t|
dt v s#t|r(t|ndt|d }t	t
|d } }
}tj|}|j}d}
||
}|s{ddt v s^t|rct|ndt|t|
t|d }t	t
|d } }
}||v }|std |fd!||fd"t v st|rt|nd"dt v st|rt|ndd# }d$d%|i }t	t
|d}|j}d&}
||
}|sd'dt v st|rt|ndt|t|
t|d }t	t
|d } }
}dS )(z?Test image file upload simulation with proper camera ID naming.regularjpg/loginusernamepasswordr"   r#   r   .  ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)slogin_responsepy0py2py5assert %(py7)spy7Nuser_id)is not)z%(py0)s is not %(py3)sr,   py3assert %(py5)sr.   FINSERT INTO cameras (user_id, camera_id, camera_name) VALUES (?, ?, ?)zTest Camera for Imagesbassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py5)s)
}r   abs_pathr,   r-   py4r.   r0   r   Lassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}r   r,   r-   r:   py6in)z%(py0)s in %(py2)sunique_camera_idr,   r-   assert %(py4)sr:   r   zJassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.endswith
}(%(py4)s)
})r   poststatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationsession_transactiongetapplicationapp_contextr   executer   commitr   r   r   basenamer   exists
startswithendswith)client
test_userstemp_staticsample_image_datauserr   r@   r*   @py_assert1@py_assert4@py_assert3@py_format6@py_format8sessr1   @py_assert2@py_format4dbrel_pathr   r8   @py_assert6@py_assert5@py_format7@py_format3@py_format5r	   r	   r
   !test_image_file_upload_simulation9   s8   


z
	z~rk   c                 C   s^  |d }|d }t  }| jd|d |d dd}|j}d}	||	k}
|
sXtd	|
fd
||	fdt v s9t|r>t|ndt|t|	d }dd|i }t	t
|d } }
}	|  }|d}W d   n1 srw   Y  | j  t }|d|t|df |  W d   n1 sw   Y  t|||}|j}d}
||
}|sddt v st|rt|ndt|t|
t|d }t	t
|d } }
}tj}|j}
|
|}|s'ddt v sttrttndt|t|
dt v st|rt|ndt|d }t	t
|d } }
}tj}|j}
|
|}|sxddt v sHttrMttndt|t|
dt v sct|rht|ndt|d }t	t
|d } }
}tj|}tj||}tj}|j}
|
|}|sddt v sttrttndt|t|
dt v st|rt|ndt|d }t	t
|d } }
}tj}|j}
|
|}|s'ddt v sttrttndt|t|
dt v st|rt|ndt|d }t	t
|d } }
}dS )z>Test image storage in correct User-photos directory structure.r   r    r!   r"   r#   r$   r%   r&   r'   r)   r*   r+   r/   r0   Nr1   r6   zTest Camerar   r;   re   r<   r7   r   rY   r9   zaassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isdir
}(%(py5)s)
}r8   zbassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isfile
}(%(py5)s)
})r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r   rQ   r   rR   r   rU   r   r   rT   isdirrS   r   isfile)rW   rX   rY   rZ   r[   r   r@   r*   r\   r]   r^   r_   r`   ra   r1   rd   re   rg   rh   rf   r   r8   r	   r	   r
   +test_image_storage_in_user_photos_directoryd   s6   


	trn   c                 C   s^  |d }t  }| jd|d |d dd}|j}d}||k}	|	sTtd|	fd	||fd
t v s5t|r:t|nd
t|t|d }
dd|
i }t	t
|d } }	}|  }|d}W d   n1 snw   Y  | j  t }|d|t|df |  W d   n1 sw   Y  g }tdD ]}t|||d }|| td q| d}|j}d}||k}	|	std|	fd	||fdt v st|rt|ndt|t|d }
dd|
i }t	t
|d } }	}g }d}|j}||v }|}|sd}|j}||v }|}|std|fd||ft|dt v s8t|r=t|ndt|d }dd|i }|| |std|fd||ft|dt v sot|rtt|ndt|d  }d!d"|i }|| t|d#i  }d$d%|i }t	t
|d } } } } } } }}dS )&zBTest gallery pagination and image listing via /galerija endpoints.r   r!   r"   r#   r$   r%   r&   r'   r)   r*   r+   r/   r0   Nr1   r6   zGallery Test Camera   r    g?	/galerija   response   <!DOCTYPE html>   <htmlr>   z,%(py3)s in %(py7)s
{%(py7)s = %(py5)s.data
}r4   r.   r0   %(py9)spy9z0%(py12)s in %(py16)s
{%(py16)s = %(py14)s.data
}py12py14py16%(py18)spy18   assert %(py21)spy21)r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r   rQ   r   rR   ranger   appendr   sleepr   _format_boolop)rW   rX   rY   rZ   r[   r@   r*   r\   r]   r^   r_   r`   ra   r1   rd   image_filesire   rr   rb   rf   @py_assert0@py_assert11@py_assert15@py_assert13@py_format10@py_format17@py_format19@py_format20@py_format22r	   r	   r
   )test_gallery_pagination_and_image_listing   s6   


	

b r   c                 C   s>  |d }t  }| jd|d |d dd}|j}d}||k}	|	sTtd|	fd	||fd
t v s5t|r:t|nd
t|t|d }
dd|
i }t	t
|d } }	}|  }|d}W d   n1 snw   Y  | j  t }|d|t|df |  W d   n1 sw   Y  t|||d }| d| }|j}d}||k}	|	std|	fd	||fdt v st|rt|ndt|t|d }
dd|
i }t	t
|d } }	}g }d}|j}||v }|}|s
d}|j}||v }|}|std|fd||ft|dt v s(t|r-t|ndt|d }dd|i }|| |sxtd|fd||ft|dt v s_t|rdt|ndt|d }dd |i }|| t|d!i  }d"d#|i }t	t
|d } } } } } } }}dS )$zATest camera-specific gallery filtering via /galerija/<camera_id>.r   r!   r"   r#   r$   r%   r&   r'   r)   r*   r+   r/   r0   Nr1   r6   zCamera Filter Testr    z
/galerija/rq   rr   rs   rt   r>   ru   rv   rw   rx   ry   rz   r~   r   r   r   r   r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r   rQ   r   rR   r   r   r   r   rW   rX   rY   rZ   r[   r@   r*   r\   r]   r^   r_   r`   ra   r1   rd   re   rr   rb   rf   r   r   r   r   r   r   r   r   r   r	   r	   r
   &test_camera_specific_gallery_filtering   .   


	b r   c                 C   s>  |d }t  }| jd|d |d dd}|j}d}||k}	|	sTtd|	fd	||fd
t v s5t|r:t|nd
t|t|d }
dd|
i }t	t
|d } }	}|  }|d}W d   n1 snw   Y  | j  t }|d|t|df |  W d   n1 sw   Y  t|||d }| d| }|j}d}||k}	|	std|	fd	||fdt v st|rt|ndt|t|d }
dd|
i }t	t
|d } }	}g }d}|j}||v }|}|s
d}|j}||v }|}|std|fd||ft|dt v s(t|r-t|ndt|d }dd|i }|| |sxtd|fd||ft|dt v s_t|rdt|ndt|d }dd |i }|| t|d!i  }d"d#|i }t	t
|d } } } } } } }}dS )$zBTest image detail viewing via /slika endpoint with access control.r   r!   r"   r#   r$   r%   r&   r'   r)   r*   r+   r/   r0   Nr1   r6   zDetail View Test Camerar    /slika?rel=rq   rr   rs   rt   r>   ru   rv   rw   rx   ry   rz   r~   r   r   r   r   r   r   r	   r	   r
   -test_image_detail_viewing_with_access_control   r   r   c                 C   s  |d }t  }| jd|d |d dd}|j}d}||k}	|	sTtd|	fd	||fd
t v s5t|r:t|nd
t|t|d }
dd|
i }t	t
|d } }	}|  }|d}W d   n1 snw   Y  | j  t }|d|t|df |  W d   n1 sw   Y  t|||d }tj|}tj||}tj}|j}	|	|}|sddt v sttrttndt|t|	dt v st|rt|ndt|d }t	t
|d } }	}| d |  }|dd}W d   n	1 sw   Y  | jd| d|idd}td|j  td|j  |jd kr|j}g d!}||v }	|	std"|	fd#||fd$t v sct|rht|nd$t|t|d }
dd|
i }t	t
|d } }	}dS t|j}|d% }d&}	||	u }|std'|fd(||	ft|t|	d) }d*d+|i }t	t
|d } }}	td,tj|  dS )-z/Test image deletion via POST /api/image/delete.r   r!   r"   r#   r$   r%   r&   r'   r)   r*   r+   r/   r0   Nr1   r6   zDelete Test Camerar    r7   r   r8   r9   /
csrf_token /api/image/delete?csrf_token=relapplication/jsonjsoncontent_typezDelete response status: zDelete response data: rq   )rq       i  r>   z3%(py2)s
{%(py2)s = %(py0)s.status_code
} in %(py5)srr   successTisz%(py1)s is %(py4)spy1r:   assert %(py6)sr=   zFile exists after deletion: )r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r   rQ   r   rR   r   r   r   rS   r   rT   printr   r   loads)rW   rX   rY   rZ   r[   r@   r*   r\   r]   r^   r_   r`   ra   r1   rd   re   r   r8   rf   r   rr   r   r   rb   rj   rh   r	   r	   r
   test_image_deletion_via_api   sL   


	

lr   c           "      C   s  |d }t  }| jd|d |d dd}|j}d}||k}	|	sTtd|	fd	||fd
t v s5t|r:t|nd
t|t|d }
dd|
i }t	t
|d } }	}|  }|d}W d   n1 snw   Y  | j  t }|d|t|df |  W d   n1 sw   Y  t|||d }| d |  }|dd}W d   n1 sw   Y  | jd| |dddd}|jdkr|j}d}||k}	|	std|	fd	||fdt v st|rt|ndt|t|d }
dd|
i }t	t
|d } }	}dS |j}d}||k}	|	s_td|	fd	||fdt v s@t|rEt|ndt|t|d }
dd|
i }t	t
|d } }	}t|j}|d }d}	||	u }|std |fd!||	ft|t|	d" }d#d$|i }t	t
|d } }}	d%}||v }|std&|fd'||ft|d(t v st|rt|nd(d) }d*d+|i }
t	t
|
d }}d,}||v }|std&|fd'||ft|d(t v st|r	t|nd(d) }d*d+|i }
t	t
|
d }}tt }|d, }||k}|sqtd-|fd.||fd,t v sGt|rLt|nd,d/t v sZt|r_t|nd/d0 }d1d2|i }t	t
|d}d}	d3}|	| }|| }d4}|| }||k}|std5|fd6||fd,t v st|rt|nd,d/t v st|rt|nd/t|	t|t|d7 } d8d9| i }!t	t
|!d } }	 } } } }}dS ):z@Test share link generation via POST /share_link with expiration.r   r!   r"   r#   r$   r%   r&   r'   r)   r*   r+   r/   r0   Nr1   r6   zShare Test Camerar    r   r   r   /share_link?csrf_token=   )r   ttl_minutesr   r   r   rr   rq   r   Tr   r   r   r   r=   urlr>   z%(py1)s in %(py3)sr   r   r4   r5   r.   
expires_at)>)z%(py0)s > %(py2)scurrent_timerA   rB   r:   <   
   )<=)z7%(py0)s <= ((%(py2)s + (%(py4)s * %(py6)s)) + %(py10)s))r,   r-   r:   r=   py10zassert %(py13)spy13)r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r   rQ   r   rR   r   r   r   r   r   )"rW   rX   rY   rZ   r[   r@   r*   r\   r]   r^   r_   r`   ra   r1   rd   re   r   rr   r   r   rb   rj   rh   rc   r   r   ri   rg   @py_assert7@py_assert8@py_assert9r   @py_format12@py_format14r	   r	   r
   *test_share_link_generation_with_expiration=  sR   


	

l~~r   c              	   C   s  |d }t  }| jd|d |d dd}|j}d}||k}	|	sTtd|	fd	||fd
t v s5t|r:t|nd
t|t|d }
dd|
i }t	t
|d } }	}|  }|d}W d   n1 snw   Y  | j  t }|d|t|df |  W d   n1 sw   Y  t|||d }| j C ddlm} ||}d}||v }|std|fd||ft|dt v st|rt|ndd }dd|i }
t	t
|
d }}|dd }| d| }|jdkrU|j}d}||k}	|	sFtd|	fd	||fdt v s't|r,t|ndt|t|d }
dd|
i }t	t
|d } }	}	 W d   dS |j}d}||k}	|	std|	fd	||fdt v sxt|r}t|ndt|t|d }
dd|
i }t	t
|d } }	}|j}|j}	d }|	|}|sd!dt v st|rt|ndt|t|	t|t|d" }t	t
|d } }	 }}W d   dS 1 sw   Y  dS )#zATest media URL generation and access via /media/<token> endpoint.r   r!   r"   r#   r$   r%   r&   r'   r)   r*   r+   r/   r0   Nr1   r6   zMedia Test Camerar    r   )build_media_urlz/media/r>   r   	media_urlr   r5   r.   r   rr   rq   zimage/znassert %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.content_type
}.startswith
}(%(py6)s)
})r,   r-   r:   r=   py8)r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r   rQ   r   rR   r   app_modules.helpersr   splitr   rU   )rW   rX   rY   rZ   r[   r@   r*   r\   r]   r^   r_   r`   ra   r1   rd   re   r   r   r   rb   rc   tokenrr   rg   r   @py_format9r	   r	   r
   $test_media_url_generation_and_accessy  s@   


	x$r   c                 C   s  |d }|d }t  }| jd|d |d dd}|j}d}	||	k}
|
sXtd	|
fd
||	fdt v s9t|r>t|ndt|t|	d }dd|i }t	t
|d } }
}	|  }|d}W d   n1 srw   Y  | j  t }|d|t|df |  W d   n1 sw   Y  t|||d }| jdddid | jd|d |d dd}|j}d}	||	k}
|
std	|
fd
||	fdt v st|rt|ndt|t|	d }dd|i }t	t
|d } }
}	| d| }|j}ddg}	||	v }
|
sNtd|
fd||	fdt v s/t|r4t|ndt|t|	d }dd|i }t	t
|d } }
}	| d |  }|dd}W d   n	1 sow   Y  | jd| d|id d!}|j}d}	||	k}
|
std	|
fd
||	fdt v st|rt|ndt|t|	d }dd|i }t	t
|d } }
}	t|j}|d" }d#}
||
u }|std$|fd%||
ft|t|
d& }d'd(|i }t	t
|d } }}
tj|}tj||}tj}|j}
|
|}|s]d)d*t v s-ttr2ttnd*t|t|
d+t v sHt|rMt|nd+t|d, }t	t
|d } }
}dS )-z,Test users can only access their own images.r   limitedr!   r"   r#   r$   r%   r&   r'   r)   r*   r+   r/   r0   Nr1   r6   zIsolation Test Camerar    z/logoutr   r   r   r   r   r>   r   rr   r   r   r   r   r   r   Fr   r   r   r   r=   r7   r   r8   r9   )r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r   rQ   r   rR   r   r   r   r   r   r   rS   r   rT   )rW   rX   rY   rZ   user_regularuser_limitedr@   r*   r\   r]   r^   r_   r`   ra   regular_user_idrd   re   rr   r   r   r   rb   rj   rh   r   r8   rf   r	   r	   r
    test_user_isolation_image_access  sT   


	


lr   c                 C   s  |d }t  }| jd|d |d dd}|j}d}||k}	|	sTtd|	fd	||fd
t v s5t|r:t|nd
t|t|d }
dd|
i }t	t
|d } }	}|  }|d}W d   n1 snw   Y  t|||d }| j  t }|d|t|d|f |  W d   n1 sw   Y  | d |  }|dd}W d   n1 sw   Y  | jd| d|idd}|j}d}||k}	|	std|	fd	||fdt v st|rt|ndt|t|d }
dd|
i }t	t
|d } }	}t|j}|d }d}	||	u }|sKtd|fd||	ft|t|	d  }d!d"|i }t	t
|d } }}	tj|}tj||}td#tj|  | j p t }|d$t|f }|r|d% r|d% }||v}|std&|fd'||fd(t v st|rt|nd(t|d) }d*d+|i }
t	t
|
d }}W d   dS W d   dS W d   dS 1 sw   Y  dS ),z9Test cleanup of database file_paths after image deletion.r   r!   r"   r#   r$   r%   r&   r'   r)   r*   r+   r/   r0   Nr1   r    zUINSERT INTO cameras (user_id, camera_id, camera_name, file_paths) VALUES (?, ?, ?, ?)zCleanup Test Camerar   r   r   r   r   r   r   rq   rr   r   Tr   r   r   r   r=   z*File exists after database deletion test: z2SELECT file_paths FROM cameras WHERE camera_id = ?
file_paths)not in)z%(py0)s not in %(py3)sre   r3   r5   r.   )r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   r   rO   rP   r   rQ   r   rR   r   r   r   r   r   rS   r   r   rT   fetchone)rW   rX   rY   rZ   r[   r@   r*   r\   r]   r^   r_   r`   ra   r1   re   rd   r   rr   r   r   rb   rj   rh   r   r8   camerarc   r	   r	   r
   &test_image_cleanup_database_file_paths  s`   





l$r   c                 C   s(  g d}|D ]
\}}|dkr|  |}n| j|i d}|j}g d}||v }|s]td|fd||fdt v s>t|rCt|ndt|t|d }d	d
|i }	t	t
|	d } }}|jdkrg }d}
|j}|
|v }|}|sd}|j}||v }|}|std|fd|
|ft|
dt v st|rt|ndt|d }	dd|	i }|| |std|fd||ft|dt v st|rt|ndt|d }dd|i }|| t|di  }dd|i }t	t
|d } } }
 } } } }}qdS )z-Test image operations require authentication.))rp   GET)z/galerija/123456789012r   )z/slika?rel=User-photos/test.jpgr   )z/api/image/deletePOST)z/share_linkr   r   )r   )r&   i  r   r>   r   rr   r+   r/   r0   Nr&   r   login)z0%(py3)s in %(py7)s
{%(py7)s = %(py5)s.location
}rv   rw   rx   )z4%(py12)s in %(py16)s
{%(py16)s = %(py14)s.location
}rz   r~   r   r   r   r   )rN   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   locationr   r   )rW   endpoints_to_testendpointmethodrr   r\   r]   r^   r_   r`   rb   rf   r   r   r   r   r   r   r   r   r   r	   r	   r
   ,test_image_operations_require_authentication*  s   R r   c                    s>  |d }| j d|d |d dd}|j}d}||k}|sQtd|fd	||fd
t v s2t|r7t|nd
t|t|d }dd|i }tt	|d } }}| 
d |  }	|	
dd}
W d   n1 sqw   Y  | j d|
 i dd}|j}d}||k}|std|fd	||fdt v st|rt|ndt|t|d }dd|i }tt	|d } }}t|j  d }d}||u }|std|fd||ft|t|d }dd|i }tt	|d } }} fddd D }t|}|s8d!d"t v sttr$ttnd"t|t|d# }tt	|d }}| j d|
 d$d%idd}|j}d}||k}|std|fd	||fdt v slt|rqt|ndt|t|d }dd|i }tt	|d } }}t|j  d }d}||u }|std|fd||ft|t|d }dd|i }tt	|d } }}d&} d' }||v }|std(|fd)||ft|t|d }dd|i }tt	|d } }}| j d*|
 i dd}|jd+kr^|j}d+}||k}|sVtd|fd	||fdt v s7t|r<t|ndt|t|d }dd|i }tt	|d } }}dS |j}d}||k}|std|fd	||fdt v st|rt|ndt|t|d }dd|i }tt	|d } }}t|j  d }d}||u }|std|fd||ft|t|d }dd|i }tt	|d } }} fd,dd D }t|}|sd!d"t v s ttrttnd"t|t|d# }tt	|d }}dS )-z(Test image operations with invalid data.r   r!   r"   r#   r$   r%   r&   r'   r)   r*   r+   r/   r0   Nr   r   r   r   r   r   i  rr   r   Fr   r   r   r   r=   c                 3       | ]	}| d  v V  qdS messageNr	   .0msgr%   r	   r
   	<genexpr>_      z0test_invalid_image_operations.<locals>.<genexpr>)zNedostaje slikaNeispravno ime datotekez,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r,   r-   r:   r   zinvalid_filename.jpgr   r   r>   )z%(py1)s in %(py4)sr   r   c                 3   r   r   r	   r   r%   r	   r
   r   z  r   )rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rN   rM   r   r   r   r   )rW   rX   r[   r*   r\   r]   r^   r_   r`   ra   r   rr   r   rb   rj   rh   r	   r%   r
   test_invalid_image_operationsE  sJ   


jvlllzr   )__doc__builtinsrG   _pytest.assertion.rewrite	assertionrewriterE   pytestr   r   r   tempfileapp_modules.dbr   r   r   markimagesrk   rn   r   r   r   r   r   r   r   r   r   r   r	   r	   r	   r
   <module>   sB    "
*
(
*
#
#
<
;
2
?
=
