
    Ѥhn\                        d Z ddlZddlmc 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 Zd Zej                   j"                  d        Zej                   j"                  d        Zej                   j"                  d        Zej                   j"                  d	        Zej                   j"                  d
        Zej                   j"                  d        Zej                   j"                  d        Zej                   j"                  d        Zej                   j"                  d        Zej                   j"                  d        Zej                   j"                  d        Zej                   j"                  d        Zy)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                      t        t        j                         dz        dz  } t        t        j                         dz        dz  }| d|dS )z1Generate a unique 12-digit camera ID for testing.i  i i@B i'  08d04d)inttime)	timestamprandom_parts     OC:\Users\algun\Documents\ceba web\Ceba - Github\tests\functional\test_images.pyget_unique_camera_idr   "   sJ    DIIK$&')3IdiikG+,u4K_[-..    c                     t        j                  d      }d| d| d}t        j                  j	                  | |      }t        |d      5 }|j                  |d          ddd       d| S # 1 sw Y   xY w)	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fs          r   create_test_image_filer!   )   st     o.Iyk9+T2Hox8J	j$	1	
6"# 
  ($$ 
 	s   A--A6c                    |d   }|d   }t               }| j                  d|d   |d   d      }|j                  }d}	||	k(  }
|
st        j                  d	|
fd
||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}
}	| j                         5 }|j                  d      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}ddd       | j                  j                         5  t               }|j!                  dt#        |      df       |j%                          ddd       t'        |||      }t(        j*                  j-                  |      }t(        j*                  j/                  ||      }t(        j*                  }|j0                  }
 |
|      }|sddt        j                         v st        j                  t(              rt        j                  t(              ndt        j                  |      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}
}t(        j*                  j-                  |      }|j2                  }d}
 ||
      }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      t        j                  |      dz  }t        t        j                  |            dx}x}
}||v }|st        j                  d |fd!||f      d"t        j                         v st        j                  |      rt        j                  |      nd"dt        j                         v st        j                  |      rt        j                  |      ndd#z  }d$d%|iz  }t        t        j                  |            d}|j4                  }d&}
 ||
      }|sd'dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      t        j                  |      dz  }t        t        j                  |            dx}x}
}y# 1 sw Y   3xY w# 1 sw Y   xY w)(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r0   py3assert %(py5)sr2   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r0   r1   py4r2   r4   r   Lassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}r   r0   r1   r>   py6in)z%(py0)s in %(py2)sunique_camera_idr0   r1   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   rD   r.   @py_assert1@py_assert4@py_assert3@py_format6@py_format8sessr5   @py_assert2@py_format4dbrel_pathr   r<   @py_assert6@py_assert5@py_format7@py_format3@py_format5s                             r   !test_image_file_upload_simulationro   9   s    i D"5)J+- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9%""wd""""wd""""""w"""w"""d""""""" 
&
 
			'	'	)X


Tc*+-EF	
 			 
* &k3CZPH ww)Hww||K2H77#7>>#>(########2###2###7###>######(###(########## ww)H'w'w''''''''8'''8''''''w''''''''''x''''x'''''''''''''''x'''x'''''''$V$V$$$$$$$$8$$$8$$$$$$V$$$$$$$$$$3 
&	%
 
*	)s   	B7W1"9W>1W;>Xc                    |d   }|d   }t               }| j                  d|d   |d   d      }|j                  }d}	||	k(  }
|
st        j                  d	|
fd
||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}
}	| j                         5 }|j                  d      }ddd       | j                  j                         5  t               }|j!                  dt#        |      df       |j%                          ddd       t'        |||      }|j(                  }d}
 ||
      }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      t        j                  |      dz  }t        t        j                  |            dx}x}
}t*        j,                  }|j.                  }
 |
|      }|sddt        j                         v st        j                  t*              rt        j                  t*              ndt        j                  |      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}
}t*        j,                  }|j0                  }
 |
|      }|sddt        j                         v st        j                  t*              rt        j                  t*              ndt        j                  |      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}
}t*        j,                  j3                  |      }t*        j,                  j5                  ||      }t*        j,                  }|j.                  }
 |
|      }|sddt        j                         v st        j                  t*              rt        j                  t*              ndt        j                  |      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}
}t*        j,                  }|j6                  }
 |
|      }|sddt        j                         v st        j                  t*              rt        j                  t*              ndt        j                  |      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}
}y# 1 sw Y   xY w# 1 sw Y   {xY w)z>Test image storage in correct User-photos directory structure.r#   r$   r%   r&   r'   r(   r)   r*   r+   r-   r.   r/   r3   r4   Nr5   r:   zTest Camerar   r?   ri   r@   r;   r   r]   r=   zaassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isdir
}(%(py5)s)
}r<   zbassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isfile
}(%(py5)s)
})r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   r   rU   r   rV   r!   rY   r   r   rX   isdirrW   r   isfile)r[   r\   r]   r^   r_   r   rD   r.   r`   ra   rb   rc   rd   re   r5   rh   ri   rk   rl   rj   r   r<   s                         r   +test_image_storage_in_user_photos_directoryrs   d   s&    i D"5)J+- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9% 
& 
			'	'	)X


Tc*+];	
 			 
* &k3CZPH .~.~........8...8......~..........77&7>>&>+&&&&&&&&2&&&2&&&7&&&>&&&&&&+&&&+&&&&&&&&&&77%7==%=%%%%%%%%2%%%2%%%7%%%=%%%%%%%%%%%%%%%%%%% ww)Hww||K2H77#7>>#>(########2###2###7###>######(###(##########77#7>>#>(########2###2###7###>######(###(##########/ 
&	% 
*	)s   	["=9[/"[,/[9c                    |d   }t               }| j                  d|d   |d   d      }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}| j                         5 }|j                  d      }ddd       | j                  j                         5  t               }|j!                  dt#        |      df       |j%                          ddd       g }t'        d      D ]8  }t)        |||d         }|j+                  |       t-        j.                  d       : | j                  d      }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}g }d}|j0                  }||v }|}|sd}|j0                  }||v }|}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j+                  |       |st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d z  }d!d"|iz  }|j+                  |       t        j2                  |d#      i z  }d$d%|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}y# 1 sw Y   FxY w# 1 sw Y   xY w)&zBTest gallery pagination and image listing via /galerija endpoints.r#   r%   r&   r'   r(   r)   r*   r+   r-   r.   r/   r3   r4   Nr5   r:   zGallery Test Camera   r$   g?	/galerija   response   <!DOCTYPE html>   <htmlrB   z,%(py3)s in %(py7)s
{%(py7)s = %(py5)s.data
}r8   r2   r4   %(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   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   r   rU   r   rV   ranger!   appendr   sleepr   _format_boolop)r[   r\   r]   r^   r_   rD   r.   r`   ra   rb   rc   rd   re   r5   rh   image_filesiri   rx   rf   rj   @py_assert0@py_assert11@py_assert15@py_assert13@py_format10@py_format17@py_format19@py_format20@py_format22s                                 r   )test_gallery_pagination_and_image_listingr      s    i D+- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9% 
& 
			'	'	)X


Tc*+-BC	
 			 
* K1X)+7GIZ[`Iab8$

3  zz+&H&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& LKK.K(KhmmK(m2KKKKKKKKKKKKKKKKKKKKKKKKKKK(mKKK(KKKKKKhKKKhKKKmKKKKKKKKKKKKKK/ 
&	% 
*	)s   Q89Q'Q$'Q1c                 ~   |d   }t               }| j                  d|d   |d   d      }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}| j                         5 }|j                  d      }ddd       | j                  j                         5  t               }|j!                  dt#        |      df       |j%                          ddd       t'        |||d         }| j                  d|       }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}g }d}|j(                  }||v }|}|sd}|j(                  }||v }|}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j+                  |       |st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd |iz  }|j+                  |       t        j,                  |d!      i z  }d"d#|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}y# 1 sw Y   xY w# 1 sw Y   xY w)$zATest camera-specific gallery filtering via /galerija/<camera_id>.r#   r%   r&   r'   r(   r)   r*   r+   r-   r.   r/   r3   r4   Nr5   r:   zCamera Filter Testr$   z
/galerija/rw   rx   ry   rz   rB   r{   r|   r}   r~   r   r   r   r   r   r   r   r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   r   rU   r   rV   r!   r   r   r   r[   r\   r]   r^   r_   rD   r.   r`   ra   rb   rc   rd   re   r5   rh   ri   rx   rf   rj   r   r   r   r   r   r   r   r   r   s                               r   &test_camera_specific_gallery_filteringr      s    i D+- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9% 
& 
			'	'	)X


Tc*+-AB	
 			 
* &k3CEVW\E]^H zzJ'7&89:H&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& LKK.K(KhmmK(m2KKKKKKKKKKKKKKKKKKKKKKKKKKK(mKKK(KKKKKKhKKKhKKKmKKKKKKKKKKKKKK' 
&	% 
*	)   P%89P2%P/2P<c                 ~   |d   }t               }| j                  d|d   |d   d      }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}| j                         5 }|j                  d      }ddd       | j                  j                         5  t               }|j!                  dt#        |      df       |j%                          ddd       t'        |||d         }| j                  d|       }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}g }d}|j(                  }||v }|}|sd}|j(                  }||v }|}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j+                  |       |st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd |iz  }|j+                  |       t        j,                  |d!      i z  }d"d#|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}y# 1 sw Y   xY w# 1 sw Y   xY w)$zBTest image detail viewing via /slika endpoint with access control.r#   r%   r&   r'   r(   r)   r*   r+   r-   r.   r/   r3   r4   Nr5   r:   zDetail View Test Camerar$   /slika?rel=rw   rx   ry   rz   rB   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   s                               r   -test_image_detail_viewing_with_access_controlr      s    i D+- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9% 
& 
			'	'	)X


Tc*+-FG	
 			 
* &k3CEVW\E]^H zzKz23H&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& LKK.K(KhmmK(m2KKKKKKKKKKKKKKKKKKKKKKKKKKK(mKKK(KKKKKKhKKKhKKKmKKKKKKKKKKKKKK' 
&	% 
*	)r   c                 Z
   |d   }t               }| j                  d|d   |d   d      }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}| j                         5 }|j                  d      }ddd       | j                  j                         5  t               }|j!                  dt#        |      df       |j%                          ddd       t'        |||d         }t(        j*                  j-                  |      }t(        j*                  j/                  ||      }t(        j*                  }|j0                  }	 |	|      }|sddt        j                         v st        j                  t(              rt        j                  t(              ndt        j                  |      t        j                  |	      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}	}| j                  d       | j                         5 }|j                  dd      }ddd       | j                  d d|id      }t3        d|j                          t3        d|j4                          |j                  d k7  r|j                  }g d!}||v }	|	st        j                  d"|	fd#||f      d$t        j                         v st        j                  |      rt        j                  |      nd$t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}yt7        j8                  |j4                        }|d%   }d&}	||	u }|slt        j                  d'|fd(||	f      t        j                  |      t        j                  |	      d)z  }d*d+|iz  }t        t        j                  |            dx}x}}	t3        d,t(        j*                  j1                  |              y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)-z/Test image deletion via POST /api/image/delete.r#   r%   r&   r'   r(   r)   r*   r+   r-   r.   r/   r3   r4   Nr5   r:   zDelete Test Camerar$   r;   r   r<   r=   /
csrf_token /api/image/delete?csrf_token=relapplication/jsonjsoncontent_typezDelete response status: zDelete response data: rw   )rw       i  rB   z3%(py2)s
{%(py2)s = %(py0)s.status_code
} in %(py5)srx   successTisz%(py1)s is %(py4)spy1r>   assert %(py6)srA   zFile exists after deletion: )r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   r   rU   r   rV   r!   r   r   rW   r   rX   printr   r   loads)r[   r\   r]   r^   r_   rD   r.   r`   ra   rb   rc   rd   re   r5   rh   ri   r   r<   rj   r   rx   r   r   rf   rn   rl   s                             r   test_image_deletion_via_apir      s    i D+- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9% 
& 
			'	'	)X


Tc*+-AB	
 			 
* &k3CEVW\E]^Hww)Hww||K2H 77#7>>#>(########2###2###7###>######(###(########## JJsO		#	#	%XXlB/
 
& {{::,G %x0'9  ;H 
$X%9%9$:
;<	"8==/
23s" ##;';;#';;;;;#';;;;;;;x;;;x;;;#;;;';;;;;;;;::hmm$D	?"d"?d""""?d"""?"""d"""""""
 
()A(B
CDY 
&	% 
*	)$ 
&	%s$   T89T?T TT T*c                 Z   |d   }t               }| j                  d|d   |d   d      }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}| j                         5 }|j                  d      }ddd       | j                  j                         5  t               }|j!                  dt#        |      df       |j%                          ddd       t'        |||d         }| j                  d       | j                         5 }|j                  dd      }ddd       | j                  d |ddd      }|j                  dk(  r|j                  }d}||k(  }	|	st        j                  d|	fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}y|j                  }d}||k(  }	|	st        j                  d|	fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}t)        j*                  |j,                        }|d   }d}	||	u }|slt        j                  d |fd!||	f      t        j                  |      t        j                  |	      d"z  }d#d$|iz  }t        t        j                  |            dx}x}}	d%}||v }|st        j                  d&|fd'||f      t        j                  |      d(t        j                         v st        j                  |      rt        j                  |      nd(d)z  }d*d+|iz  }
t        t        j                  |
            dx}}d,}||v }|st        j                  d&|fd'||f      t        j                  |      d(t        j                         v st        j                  |      rt        j                  |      nd(d)z  }d*d+|iz  }
t        t        j                  |
            dx}}t#        t/        j.                               }|d,   }||kD  }|st        j                  d-|fd.||f      d,t        j                         v st        j                  |      rt        j                  |      nd,d/t        j                         v st        j                  |      rt        j                  |      nd/d0z  }d1d2|iz  }t        t        j                  |            d}d}	d3}|	|z  }||z   }d4}||z   }||k  }|st        j                  d5|fd6||f      d,t        j                         v st        j                  |      rt        j                  |      nd,d/t        j                         v st        j                  |      rt        j                  |      nd/t        j                  |	      t        j                  |      t        j                  |      d7z  } d8d9| iz  }!t        t        j                  |!            dx}x}	x}x}x}x}}y# 1 sw Y   rxY w# 1 sw Y   $xY w# 1 sw Y   xY w):z@Test share link generation via POST /share_link with expiration.r#   r%   r&   r'   r(   r)   r*   r+   r-   r.   r/   r3   r4   Nr5   r:   zShare Test Camerar$   r   r   r   /share_link?csrf_token=   )r   ttl_minutesr   r   r   rx   rw   r   Tr   r   r   r   rA   urlrB   z%(py1)s in %(py3)sr   r   r8   r9   r2   
expires_at)>)z%(py0)s > %(py2)scurrent_timerE   rF   r>   <   
   )<=)z7%(py0)s <= ((%(py2)s + (%(py4)s * %(py6)s)) + %(py10)s))r0   r1   r>   rA   py10zassert %(py13)spy13)r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   r   rU   r   rV   r!   r   r   r   r   )"r[   r\   r]   r^   r_   rD   r.   r`   ra   rb   rc   rd   re   r5   rh   ri   r   rx   r   r   rf   rn   rl   rg   r   r   rm   rk   @py_assert7@py_assert8@py_assert9r   @py_format12@py_format14s"                                     r   *test_share_link_generation_with_expirationr   =  s    i D+- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9% 
& 
			'	'	)X


Tc*+-@A	
 			 
* &k3CEVW\E]^H JJsO		#	#	%XXlB/
 
& {{4ZLA%--/  (:  ;H s"##*s*#s****#s******x***x***#***s*******&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?"d"?d""""?d"""?"""d"""""""5D=5D5DD<4<4<44 tyy{#Ll#J$$$$:$$$$$$:$$$:$$$$$$$$$$$$$$$$)+6b6b616B61B66:66666:6666666:666:666666666666666b666B66666666W 
&	% 
*	) 
&	%s$   ^89^*^ ^^ ^*c           	      p
   |d   }t               }| j                  d|d   |d   d      }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}| j                         5 }|j                  d      }ddd       | j                  j                         5  t               }|j!                  dt#        |      df       |j%                          ddd       t'        |||d         }| j                  j                         5  ddlm}  ||      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }
t        t        j                  |
            dx}}|j-                  d      d   }| j                  d|       }|j                  dk(  r|j                  }d}||k(  }	|	st        j                  d|	fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}	 ddd       y|j                  }d}||k(  }	|	st        j                  d|	fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}|j.                  }|j0                  }	d } |	|      }|sd!dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |      t        j                  |      d"z  }t        t        j                  |            dx}x}	x}}ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)#zATest media URL generation and access via /media/<token> endpoint.r#   r%   r&   r'   r(   r)   r*   r+   r-   r.   r/   r3   r4   Nr5   r:   zMedia Test Camerar$   r   )build_media_urlz/media/rB   r   	media_urlr   r9   r2   r   rx   rw   zimage/znassert %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.content_type
}.startswith
}(%(py6)s)
})r0   r1   r>   rA   py8)r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   r   rU   r   rV   r!   app_modules.helpersr   splitr   rY   )r[   r\   r]   r^   r_   rD   r.   r`   ra   rb   rc   rd   re   r5   rh   ri   r   r   r   rf   rg   tokenrx   rk   r   @py_format9s                             r   $test_media_url_generation_and_accessr   y  s    i D+- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9% 
& 
			'	'	)X


Tc*+-@A	
 			 
* &k3CEVW\E]^H 
			'	'	)7#H-	 %yI%%%%yI%%%y%%%%%%I%%%I%%%%%%%	*2. ::w/0 3&''.3.'3....'3......8...8...'...3....... 
*	)$ ##*s*#s****#s******x***x***#***s*******$$9$//99/99999999x999x999$999/9999999999999' 
*	) 
&	% 
*	) 
*	)s,   T89T#F4T, F)T,TT),T5c                 8   |d   }|d   }t               }| j                  d|d   |d   d      }|j                  }d}	||	k(  }
|
st        j                  d	|
fd
||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}
}	| j                         5 }|j                  d      }ddd       | j                  j                         5  t               }|j!                  dt#        |      df       |j%                          ddd       t'        |||d         }| j                  dddi       | j                  d|d   |d   d      }|j                  }d}	||	k(  }
|
st        j                  d	|
fd
||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}
}	| j                  d|       }|j                  }ddg}	||	v }
|
st        j                  d|
fd||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}
}	| j                  d       | j                         5 }|j                  dd      }ddd       | j                  d d|id !      }|j                  }d}	||	k(  }
|
st        j                  d	|
fd
||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}
}	t)        j*                  |j,                        }|d"   }d#}
||
u }|slt        j                  d$|fd%||
f      t        j                  |      t        j                  |
      d&z  }d'd(|iz  }t        t        j                  |            dx}x}}
t.        j0                  j3                  |      }t.        j0                  j5                  ||      }t.        j0                  }|j6                  }
 |
|      }|sd)d*t        j                         v st        j                  t.              rt        j                  t.              nd*t        j                  |      t        j                  |
      d+t        j                         v st        j                  |      rt        j                  |      nd+t        j                  |      d,z  }t        t        j                  |            dx}x}
}y# 1 sw Y   \xY w# 1 sw Y   xY w# 1 sw Y   xY w)-z,Test users can only access their own images.r#   limitedr%   r&   r'   r(   r)   r*   r+   r-   r.   r/   r3   r4   Nr5   r:   zIsolation Test Camerar$   z/logoutr   r   r   r   r   rB   r   rx   r   r   r   r   r   r   Fr   r   r   r   rA   r;   r   r<   r=   )r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   r   rU   r   rV   r!   r   r   r   r   r   rW   r   rX   )r[   r\   r]   r^   user_regularuser_limitedrD   r.   r`   ra   rb   rc   rd   re   regular_user_idrh   ri   rx   r   r   r   rf   rn   rl   r   r<   rj   s                              r    test_user_isolation_image_accessr     s    i(Li(L+- [[ , ,1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9- 
& 
			'	'	)X


Tc"235LM	
 			 
* &k3CEVW\E]^H KK	r 2K3[[ , ,1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, zzKz23H-C:-:----:------8---8------:------- JJsO		#	#	%XXlB/
 
& {{::,G %x0'9  ;H
 &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?#e#?e####?e###?###e####### ww)Hww||K2H77#7>>#>(########2###2###7###>######(###(##########] 
&	% 
*	)6 
&	%s$   	Y5=9ZZ5Y?ZZc                 	   |d   }t               }| j                  d|d   |d   d      }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}| j                         5 }|j                  d      }ddd       t        |||d         }| j                  j                         5  t!               }|j#                  dt%        |      d|f       |j'                          ddd       | j                  d       | j                         5 }|j                  dd      }ddd       | j                  d d|id      }|j                  }d}||k(  }	|	st        j                  d|	fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}t)        j*                  |j,                        }|d   }d}	||	u }|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      d z  }d!d"|iz  }t        t        j                  |            dx}x}}	t.        j0                  j3                  |      }t.        j0                  j5                  ||      }t7        d#t.        j0                  j9                  |              | j                  j                         5  t!               }|j#                  d$t%        |      f      j;                         }|r|d%   r|d%   }||v}|st        j                  d&|fd'||f      d(t        j                         v st        j                  |      rt        j                  |      nd(t        j                  |      d)z  }d*d+|iz  }
t        t        j                  |
            dx}}ddd       y# 1 sw Y   xY w# 1 sw Y   CxY w# 1 sw Y   xY w# 1 sw Y   yxY w),z9Test cleanup of database file_paths after image deletion.r#   r%   r&   r'   r(   r)   r*   r+   r-   r.   r/   r3   r4   Nr5   r$   zUINSERT INTO cameras (user_id, camera_id, camera_name, file_paths) VALUES (?, ?, ?, ?)zCleanup Test Camerar   r   r   r   r   r   r   rw   rx   r   Tr   r   r   r   rA   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)sri   r7   r9   r2   )r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   r!   rS   rT   r   rU   r   rV   r   r   r   r   r   rW   r   r   rX   fetchone)r[   r\   r]   r^   r_   rD   r.   r`   ra   rb   rc   rd   re   r5   ri   rh   r   rx   r   r   rf   rn   rl   r   r<   camerarg   s                              r   &test_image_cleanup_database_file_pathsr     s    i D+- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9% 
& &k3CEVW\E]^H				'	'	)X


cc*+-BHM	
 			 
* JJsO		#	#	%XXlB/
 
& {{::,G %x0'9  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?"d"?d""""?d"""?"""d""""""" ww)Hww||K2H	6rww~~h7O6P
QR 
			'	'	)X@!"$
 (* 	 f\*#),#778#777778#777777787778777#77777777 
*	)I 
&	% 
*	) 
&	%& 
*	)s1   R6:S+S	C$S6S SSS&c                    g d}|D ]  \  }}|dk(  r| j                  |      }n| j                  |i       }|j                  }g d}||v }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }d	d
|iz  }	t        t        j                  |	            dx}x}}|j                  dk(  sg }d}
|j                  }|
|v }|}|sd}|j                  }||v }|}|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }|j                  |       |st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}
x}x}x}x}} y)z-Test image operations require authentication.))rv   GET)z/galerija/123456789012r   )z/slika?rel=User-photos/test.jpgr   )z/api/image/deletePOST)z/share_linkr   r   )r   )r*   i  r   rB   r   rx   r/   r3   r4   Nr*   r   login)z0%(py3)s in %(py7)s
{%(py7)s = %(py5)s.location
}r|   r}   r~   )z4%(py12)s in %(py16)s
{%(py16)s = %(py14)s.location
}r   r   r   r   r   r   )rR   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   locationr   r   )r[   endpoints_to_testendpointmethodrx   r`   ra   rb   rc   rd   rf   rj   r   r   r   r   r   r   r   r   r   s                        r   ,test_image_operations_require_authenticationr   *  s   
 .&U?zz(+H{{8"{5H ##66#6666#666666x666x666#6666666666 3&K3K(++K3++KwK(:K:KKw:K/KKKKK3+KKK3KKKKKK(KKK(KKK+KKKKKKKw:KKKKwKKKKKK(KKK(KKK:KKKKKKKKKKKKKKKK .r   c                    |d   }| j                  d|d   |d   d      }|j                  }d}||k(  }|st        j                  d|fd	||f      d
t	        j
                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}| j                  d       | j                         5 }	|	j                  dd      }
ddd       | j                  d
 i d      }|j                  }d}||k(  }|st        j                  d|fd	||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t        j                  |j                        d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}fddD        }t        |      }|sd d!t	        j
                         v st        j                  t              rt        j                  t              nd!t        j                  |      t        j                  |      d"z  }t        t        j                  |            dx}}| j                  d|
 d#d$id      }|j                  }d}||k(  }|st        j                  d|fd	||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t        j                  |j                        d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}d%}d&   }||v }|slt        j                  d'|fd(||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}| j                  d)|
 i d      }|j                  d*k(  r|j                  }d*}||k(  }|st        j                  d|fd	||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y|j                  }d}||k(  }|st        j                  d|fd	||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t        j                  |j                        d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}fd+dD        }t        |      }|sd d!t	        j
                         v st        j                  t              rt        j                  t              nd!t        j                  |      t        j                  |      d"z  }t        t        j                  |            dx}}y# 1 sw Y   =xY w),z(Test image operations with invalid data.r#   r%   r&   r'   r(   r)   r*   r+   r-   r.   r/   r3   r4   Nr   r   r   r   r   r   i  rx   r   Fr   r   r   r   rA   c              3   ,   K   | ]  }|d    v   ywmessageN .0msgr   s     r   	<genexpr>z0test_invalid_image_operations.<locals>.<genexpr>_       `1_#sd9o%1_   )zNedostaje slikaNeispravno ime datotekez,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r0   r1   r>   r   zinvalid_filename.jpgr   r   rB   )z%(py1)s in %(py4)sr   r   c              3   ,   K   | ]  }|d    v   ywr   r   r   s     r   r   z0test_invalid_image_operations.<locals>.<genexpr>z  r   r   )rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rR   rQ   r   r   r   r   )r[   r\   r_   r.   r`   ra   rb   rc   rd   re   r   rx   r   rf   rn   rl   r   s                   @r   test_invalid_image_operationsr   E  sk    i D [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJsO		#	#	%XXlB/
 
& {{::,G!'9  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?#e#?e####?e###?###e#######`1_``3`````````3```3`````````````` {{::,G %'=>'9  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?#e#?e####?e###?###e#######$7Y7$7777$777$7777777777 {{4ZLA!'9  ;H
 s"##*s*#s****#s******x***x***#***s*******&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?#e#?e####?e###?###e#######`1_``3`````````3```3``````````````O 
&	%s   aa$)__doc__builtinsrK   _pytest.assertion.rewrite	assertionrewriterI   pytestr   r   r   tempfileapp_modules.dbr   r   r!   markimagesro   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r     s  2    	   !/%  '% '%T %$ %$P $L $LT  L  LF  L  LF 9E 9Ex 87 87v /: /:d <$ <$~ :8 :8z L L4 4a 4ar   