
    h[                        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mZ da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)ag  
test_cameras.py

Purpose:
  Comprehensive test suite for camera management functionality including CRUD
  operations, data validation, API endpoint testing, and database consistency.
  Tests camera adding, renaming, deleting, listing, 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,
  and database state verification.

Test Categories:
  - Camera CRUD operations (add, rename, delete, list)
  - Data validation for camera IDs and names
  - API endpoint testing and responses
  - Database consistency verification
  - User permission boundaries and data isolation
  - Camera ID uniqueness validation
  - Authentication and CSRF protection
    N)get_dbc                      t         dz  a t        t        j                         dz        dz  } t         dz  }t        j                  dd      }| d|d|d}|d	d
 S )z1Generate a unique 12-digit camera ID for testing.   i  i d   
   c   08d02dN   )_test_counterinttimerandomrandint)	timestampcounter_partrandom_part	unique_ids       PC:\Users\algun\Documents\ceba web\Ceba - Github\tests\functional\test_cameras.pyget_unique_camera_idr   !   sh     QMDIIK$&')3I!C'L..R(KS/,s!3K3DEISb>    c                 V   |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                  d       | j                         5 }|j                  dd      }|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  }t        j                  d      dz   d|iz  }
t        t        j                  |
            dx}}dd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}	}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}}	| j"                  j%                         5  t'               }|j)                  d(||d   f      j+                         }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+   }t-        |      }||k(  }|st        j                  d	|fd,||f      t        j                  |      d-t        j                         v st        j                  t,              rt        j                  t,              nd-d.t        j                         v st        j                  |      rt        j                  |      nd.t        j                  |      d/z  }d0d1|iz  }t        t        j                  |            dx}x}}|d   }|d   }	||	k(  }|slt        j                  d	|fd2||	f      t        j                  |      t        j                  |	      d%z  }d&d'|iz  }t        t        j                  |            dx}x}}	ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)3zETest adding cameras with valid 12-digit IDs via POST /api/kamere/add.regularvalid/loginusernamepasswordr   r   data.  ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)slogin_responsepy0py2py5assert %(py7)spy7N/
csrf_token user_idis notz%(py0)s is not %(py3)sr'   py3zUser should be logged inz
>assert %(py5)sr)   /api/kamere/add?csrf_token=camera_name	camera_idr6   application/jsonjsoncontent_type   responsesuccessTisz%(py1)s is %(py4)spy1py4assert %(py6)spy6z=SELECT * FROM cameras WHERE camera_id = ? AND camera_name = ?cameraassert %(py5)sr8   )z0%(py1)s == %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}r   unique_camera_id)rD   r4   rE   rG   assert %(py8)spy8z%(py1)s == %(py4)s)r   poststatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationgetsession_transaction_format_assertmsgr;   loadsr    applicationapp_contextr   executefetchoner   )client
test_userssample_camera_datausercamera_datarJ   r%   @py_assert1@py_assert4@py_assert3@py_format6@py_format8sessr-   r/   @py_assert2@py_format4r>   r    @py_assert0@py_format5@py_format7dbrH   @py_assert5@py_format9s                             r   test_add_camera_valid_datars   -   s    i D$W-K ,- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJsO 
	#	#	%XXlB/
((9%">wd">>>wd>>>>>>w>>>w>>>d>>>$>>>>>>> 
&
 {{8E+;-8-G  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?"d"?d""""?d"""?"""d""""""" 
			'	'	)XK{=9:
 (* 	 "!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!k";c*:&;;"&;;;;;"&;;;;";;;;;;c;;;c;;;;;;*:;;;*:;;;&;;;;;;;;m$BM(BB$(BBBBB$(BBBB$BBB(BBBBBBBB 
*	)% 
&	%$ 
*	)s   CXI+XXX(c                    |d   }|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 |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}}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                  j!                         5  t#               }|j%                  d&|d   f      j'                         }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       y# 1 sw Y   xY w# 1 sw Y   yxY w),zFTest adding cameras with invalid short IDs returns appropriate errors.r   invalid_short_idr   r   r   r   r   r!   r"   r$   r%   r&   r*   r+   Nr,   r-   r.   r5   r8   r6   r7   r9   r:     r>   r?   Fr@   rB   rC   rF   rG   znamenkimessageinz%(py1)s in %(py4)s)SELECT * FROM cameras WHERE camera_id = ?z%(py0)s is %(py3)srH   r3   rI   r)   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r;   r[   r    r\   r]   r   r^   r_   r`   ra   rb   rc   rd   r%   re   rf   rg   rh   ri   rj   r-   r>   r    rm   rk   rn   ro   rp   rH   rl   s                         r    test_add_camera_invalid_short_idr   ^   s    i D$%78K [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJsO		#	#	%XXlB/
 
& {{8E+6{+C-8-G  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?#e#?e####?e###?###e#######(i(:((((:(((:(((((((((( 
			'	'	)X7%'
 (* 	 v~vvv 
*	)# 
&	%" 
*	)s   P'
CP4'P14P=c                    |d   }|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 |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}}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}}| j                  j!                         5  t#               }|j%                  d"|d   f      j'                         }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       y# 1 sw Y   xY w# 1 sw Y   yxY w)(zLTest adding cameras with invalid non-numeric IDs returns appropriate errors.r   invalid_non_numericr   r   r   r   r   r!   r"   r$   r%   r&   r*   r+   Nr,   r-   r.   r5   r8   r6   r7   r9   r:   rv   r>   r?   Fr@   rB   rC   rF   rG   z+SELECT * FROM cameras WHERE camera_name = ?r}   rH   r3   rI   r)   r~   r   s                         r   &test_add_camera_invalid_non_numeric_idr      s    i D$%:;K [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJsO		#	#	%XXlB/
 
& {{8E+6{+C-8-G  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?#e#?e####?e###?###e####### 
			'	'	)X9')
 (* 	 v~vvv 
*	)! 
&	%  
*	)s   N(CN5(N25N>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                  d       | j                         5 }|j                  dd      }dd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}	}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                   j#                         5  t%               }|j'                  d%|f      j)                         }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       y# 1 sw Y    xY w# 1 sw Y   yxY w)+z@Test adding cameras with empty names returns appropriate errors.r   invalid_empty_namer   r   r   r   r   r!   r"   r$   r%   r&   r*   r+   Nr,   r-   r.   r5   r6   r7   r9   r:   rv   r>   r?   Fr@   rB   rC   rF   rG   obaveznorx   ry   r{   r|   r}   rH   r3   rI   r)   )r   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r;   r[   r    r\   r]   r   r^   r_   r`   ra   rb   rc   rd   rJ   r%   re   rf   rg   rh   ri   rj   r-   r>   r    rm   rk   rn   ro   rp   rH   rl   s                          r   test_add_camera_empty_namer      s    i D$%9:K ,- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJsO		#	#	%XXlB/
 
& {{8E+;-8-G  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?#e#?e####?e###?###e#######(i(:((((:(((:(((((((((( 
			'	'	)X7
 (* 	 v~vvv 
*	)# 
&	%" 
*	)s   P+CP8+P58Qc                    |d   }t               }|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                         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       | 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}	}t'        j(                  |j*                        }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   }t-        |t.              }	|	sd d!t        j                         v st        j                  t,              rt        j                  t,              nd!dt        j                         v st        j                  |      rt        j                  |      ndd"t        j                         v st        j                  t.              rt        j                  t.              nd"t        j                  |	      d#z  }t        t        j                  |            d}	t1        |      }d$}||kD  }|st        j                  d%|fd&||f      d't        j                         v st        j                  t0              rt        j                  t0              nd'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+   |k(  s|} n 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   }	||	k(  }|slt        j                  d	|fd-||	f      t        j                  |      t        j                  |	      d.z  }d/d0|iz  }t        t        j                  |            dx}x}}	y# 1 sw Y   xxY w# 1 sw Y   'xY w)1z:Test retrieving camera lists via GET /api/kamere endpoint.r   r   r   r   r   r   r   r!   r"   r$   r%   r&   r*   r+   Nr/   r0   r2   r3   rI   r)   FINSERT INTO cameras (user_id, camera_id, camera_name) VALUES (?, ?, ?)r6   /api/kamerer=   r>   camerasry   )z%(py1)s in %(py3)sr    rD   r4   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancelist)r'   rD   r(   rE   r   )>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slenr'   rD   r4   rG   rK   rL   r8   
our_camerarM   rC   rF   rG   )r   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rY   rX   r\   r]   r   r^   r   commitr;   r[   r    r   r   r   )r`   ra   rb   rc   rJ   rd   r%   re   rf   rg   rh   ri   rj   r/   rk   rl   rp   r>   r    rm   r   rn   rq   ro   rr   r   rH   s                              r   test_retrieve_camera_list_apir      s    i D ,-$W-K [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9%""wd""""wd""""""w"""w"""d""""""" 
&
 
			'	'	)X


Tc*+[-GH	
 			 
* zz-(H&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& ::hmm$D9999oGgt$$$$$$$$:$$$:$$$$$$g$$$g$$$$$$t$$$t$$$$$$$$$$w<!<!<!33ww<! J+"22J 
 "!:T!!!!:T!!!!!!:!!!:!!!T!!!!!!!m$BM(BB$(BBBBB$(BBBB$BBB(BBBBBBBBA 
&	%
 
*	)s   	B7\6"<]6] ]c                 z   |d   }|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       | j                  d       | j                         5 }|j                  dd      }ddd       | j                  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}
}	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}}
| j                  j                         5  t               }|j!                  d)t#        |      f      j-                         }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   }||k(  }|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dd       y# 1 sw Y   xY w# 1 sw Y   yxY w# 1 sw Y   JxY w# 1 sw Y   yxY w).z;Test renaming existing cameras via POST /api/kamere/rename.r   r   zRenamed Test Camerar   r   r   r   r   r!   r"   r$   r%   r&   r*   r+   Nr/   r0   r2   r3   rI   r)   r   r6   r,   r-   r.   /api/kamere/rename?csrf_token=r7   r9   r:   r=   r>   r?   Tr@   rB   rC   rF   rG   r|   rH   )z%(py1)s == %(py3)snew_namer   r   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rY   rX   r\   r]   r   r^   r   r   r;   r[   r    r_   )r`   ra   rb   rc   rd   r   rJ   r%   re   rf   rg   rh   ri   rj   r/   rk   rl   rp   r-   r>   r    rm   rn   ro   rH   s                            r   test_rename_existing_camerar     s    i D$W-K$H ,- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9%""wd""""wd""""""w"""w"""d""""""" 
&
 
			'	'	)X


Tc*+[-GH	
 			 
* JJsO		#	#	%XXlB/
 
& {{;J<H+;-5  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?"d"?d""""?d"""?"""d""""""" 
			'	'	)X7!"$
 (* 	 "!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!m$0$0000$000$0000000000000000 
*	)? 
&	%
 
*	) 
&	%  
*	)s2   B7V
$<V	V$>FV1
VV!$V.1V: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       | 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}}	| j                  j                         5  t               }|j!                  d(t#        |      f      j-                         }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       y# 1 sw Y    xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)+z2Test deleting cameras via POST /api/kamere/delete.r   r   r   r   r   r   r   r!   r"   r$   r%   r&   r*   r+   Nr/   r0   r2   r3   rI   r)   r   r6   r,   r-   r.   z/api/kamere/delete?csrf_token=r8   r9   r:   r=   r>   r?   Tr@   rB   rC   rF   rG   r|   r}   rH   r   )r`   ra   rb   rc   rd   rJ   r%   re   rf   rg   rh   ri   rj   r/   rk   rl   rp   r-   r>   r    rm   rn   ro   rH   s                           r   test_delete_existing_camerar   J  s    i D$W-K ,- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9%""wd""""wd""""""w"""w"""d""""""" 
&
 
			'	'	)X


Tc*+[-GH	
 			 
* JJsO		#	#	%XXlB/
 
& {{;J<H)+;  (:	  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?"d"?d""""?d"""?"""d""""""" 
			'	'	)X7!"$
 (* 	 v~vvv 
*	)= 
&	%
 
*	) 
&	% 
*	)s2   	B7S"<S+S8;CTS(+S58TTc           
         |d   }t               }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       g }| j                  j                         5  t               }t!        ||d   f||d   fg      D ]S  \  }\  }}|j#                  dt%        |      |d    d| f       |j'                  t%        |      |d    d| d       U |j)                          dd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}	}t+        j,                  |j.                        }|d   }| j                  j                         5  t               }|j#                  df      j1                         }ddd       t3        |      }t3              }||k(  }|st        j                  d|fd ||f      d!t        j                         v st        j                  t2              rt        j                  t2              nd!d"t        j                         v st        j                  |      rt        j                  |      nd"t        j                  |      d!t        j                         v st        j                  t2              rt        j                  t2              nd!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}x}}|D ]L  }d}|D ]  }|d'   t5        |d'         k(  s|} n 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   }	||	k(  }|slt        j                  d|fd)||	f      t        j                  |      t        j                  |	      d*z  } d+d,| iz  }!t        t        j                  |!            dx}x}}	O y# 1 sw Y   xY w# 1 sw Y   YxY w# 1 sw Y   xY w)-z6Test database cameras match API responses consistency.r   r   r   r   r   r   r!   r"   r$   r%   r&   r*   r+   Nr/   r0   r2   r3   rI   r)   r   valid_2r   r6    r7   r   r=   r>   r   z'SELECT * FROM cameras WHERE user_id = ?)zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}r   api_cameras
db_cameras)r'   rD   r4   r)   rG   rL   zassert %(py10)spy10r8   
api_camerarM   rC   rF   rG   )r   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rY   rX   r\   r]   r   	enumerater^   r   appendr   r;   r[   r    fetchallr   str)"r`   ra   rb   rc   unique_camera_id_1unique_camera_id_2r%   re   rf   rg   rh   ri   rj   r/   rk   rl   cameras_addedrp   ir8   rd   r>   api_datar   r   @py_assert7rr   @py_format11	db_camerar   camrm   rn   ro   s"                                     r   )test_database_cameras_match_api_responsesr     s    i D ./-/ [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9%""wd""""wd""""""w"""w"""d""""""" 
&
 M				'	'	)X+4!3G!<=!3I!>?6
 ,'A'	; JJX#i.[-G,H!*MN    ^"-m"<!=QqcB" , 			 
*" zz-(H&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&zz(--(H9%K 
			'	'	)XZZ5J
 (* 	 
* {.s:...........3...3......{...{.........s...s......:...:..........  	
C;3y'=#>> 
 
 "&%z%%%%z%%%%%%z%%%z%%%%%%%%%%-(DIm,DD(,DDDDD(,DDDD(DDD,DDDDDDDD  Q 
&	% 
*	). 
*	)s&   B7Z;)B[,[;[[[c                    |d   }|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       | 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}	||	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 ]  }|d    }||k7  }|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%       | j                         5 }|j                  dd      }dd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}
}	t'        j(                  |j*                        }|d,   }d-}
||
u }|slt        j                  d.|fd/||
f      t        j                  |      t        j                  |
      d0z  }d1d2|iz  }t        t        j                  |            dx}x}}
| j                  j                         5  t               }|j!                  d3t#        |      f      j-                         }d}||u}|st        j                  d|fd||f      d4t        j                         v st        j                  |      rt        j                  |      nd4t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}|d   }|d   }
||
k(  }|slt        j                  d
|fd5||
f      t        j                  |      t        j                  |
      d0z  }d1d2|iz  }t        t        j                  |            dx}x}}
ddd       y# 1 sw Y   JxY w# 1 sw Y   xY w# 1 sw Y   $xY w# 1 sw Y   yxY w)6z-Test users can only manage their own cameras.r   limitedr   r   r   r   r   r   r!   r"   r$   r%   r&   r*   r+   Nr/   r0   r2   r3   rI   r)   r   r6   z/logoutr-   r.   r   r=   r>   r   r8   )!=)z%(py1)s != %(py3)srJ   r   r,   r   zHacked Camera Namer7   r9   r:   i  r?   Fr@   rB   rC   rF   rG   r|   rH   rM   r   )r`   ra   rb   user_regularuser_limitedrd   rJ   r%   re   rf   rg   rh   ri   rj   r/   rk   rl   rp   r>   limited_datalimited_camerasrH   rm   r-   r    rn   ro   s                              r   test_user_isolation_camerasr     s    i(Li(L$W-K ,- [[ , ,1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
	#	#	%((9%""wd""""wd""""""w"""w"""d""""""" 
&
 
			'	'	)X


Tc*+[-GH	
 			 
* KK	r 2K3[[ , ,1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, zz-(H&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm,L"9-O "k"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 " JJsO		#	#	%XXlB/
 
& {{;J<H+;-A  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?#e#?e####?e###?###e####### 
			'	'	)X7!"$
 (* 	 "!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!m$BM(BB$(BBBBB$(BBBB$BBB(BBBBBBBB 
*	)g 
&	%
 
*	): 
&	%" 
*	)s2   B7`'<`2`''E`4``$'`14`=c                 4   |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                  d       | j                         5 }|j                  dd      }dd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| |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}	}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                   j#                         5  t%               }|j'                  d't)        |      f      j+                         }t-        |      }d(}||k(  }|st        j                  d	|fd)||f      d*t        j                         v st        j                  t,              rt        j                  t,              nd*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# 1 sw Y   VxY w# 1 sw Y   yxY w)/z%Test camera ID uniqueness validation.r   r   r   r   r   r   r   r!   r"   r$   r%   r&   r*   r+   Nr,   r-   r.   r5   r6   r7   r9   r:   r=   r>   zDifferent Camera Namei  r?   Fr@   rB   rC   rF   rG   u   već postojirx   ry   r{   r|   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   r   r   rK   rL   )r   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r;   r[   r    r\   r]   r   r^   r   r   r   )r`   ra   rb   rc   rd   rJ   r%   re   rf   rg   rh   ri   rj   r-   r>   r    rm   rk   rn   ro   rp   r   rq   rr   s                           r   $test_camera_id_uniqueness_validationr     s    i D$W-K ,- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJsO		#	#	%XXlB/
 
& {{8E+;-8-G  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& {{8E+;-D  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?#e#?e####?e###?###e#######,T)_,>_,,,,>_,,,>,,,_,,,,,,, 
			'	'	)X**7!"$
 (* 	 7| q |q    |q      s   s      7   7   |   q        
*	)7 
&	%6 
*	)s   V3EVVV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 camera operations require authentication.))r   GET)z/api/kamere/addPOST)z/api/kamere/renamer   )z/api/kamere/deleter   r   )r;   )r!   i  i  ry   )z3%(py2)s
{%(py2)s = %(py0)s.status_code
} in %(py5)sr>   r&   r*   r+   Nr!   r,   login)z0%(py3)s in %(py7)s
{%(py7)s = %(py5)s.location
})r4   r)   r+   z%(py9)spy9)z4%(py12)s in %(py16)s
{%(py16)s = %(py14)s.location
})py12py14py16z%(py18)spy18r   zassert %(py21)spy21)rX   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   locationr   _format_boolop)r`   endpoints_to_testendpointmethodr>   re   rf   rg   rh   ri   rk   @py_assert6rm   @py_assert11@py_assert15@py_assert13@py_format10@py_format17@py_format19@py_format20@py_format22s                        r   -test_camera_operations_require_authenticationr   K  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   }|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                  d       | j                         5 }|j                  dd      }dd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}	}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}}	| j                   j#                         5  t%               }|j'                  d!t)        |      f      j+                         }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       y# 1 sw Y   xY w# 1 sw Y   yxY w)(z1Test camera operations work with CSRF protection.r   r   r   r   r   r   r   r!   r"   r$   r%   r&   r*   r+   Nr,   r-   r.   r5   r6   r7   r9   r:   r=   r>   r?   Tr@   rB   rC   rF   rG   r|   r0   r2   rH   r3   rI   r)   )r   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r;   r[   r    r\   r]   r   r^   r   r_   r   s                          r   $test_camera_add_with_csrf_protectionr   e  s    i D$W-K ,- [[$$1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJsO		#	#	%XXlB/
 
& {{8E+;-8-G  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?"d"?d""""?d"""?"""d""""""" 
			'	'	)X7!"$
 (* 	 "!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!! 
*	)# 
&	%" 
*	)s   N5CO5N?O)__doc__builtinsrR   _pytest.assertion.rewrite	assertionrewriterP   pytestr;   r   r   app_modules.dbr   r   r   markr   rs   r   r   r   r   r   r   r   r   r   r   r    r   r   <module>r      s  .      ! 	 -C -C` % %P $ $N ( (V 0C 0Cf 71 71t 4 4n @E @EF KC KC\ 2! 2!j L L2 (" ("r   