
    hv                        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 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ej                  j                   d        Zej                  j                   d        Zej                  j                   d        Zy)a  
test_admin.py

Purpose:
  Comprehensive test suite for administrative functionality including user management,
  audit logging, cross-user data oversight, and admin-specific security controls.
  Tests admin panel operations, user CRUD operations, and administrative APIs.
  
  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, authorization,
  audit logging, and database state verification.

Test Categories:
  - Admin panel access and authentication
  - User management (add, remove, password changes)
  - Admin JSON APIs for user and camera management
  - Cross-user data access and management
  - Audit logging and security oversight
  - Admin-specific input validation
  - Authorization boundary testing
  - Database integrity verification
    N)get_dbc                  R    t        t        j                         dz        dz  } d|  S )z'Generate a unique username for testing.  @B 	testuser_inttime)	timestamps    NC:\Users\algun\Documents\ceba web\Ceba - Github\tests\functional\test_admin.pyget_unique_usernamer       s)    DIIK$&''1Iyk""    c                      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.r   i r   i'  08d04dr   )r   random_parts     r   get_unique_camera_idr   &   sJ    DIIK$&')3IdiikG+,u4K_[-..r   c                 h   |d   }|d   }| j                  d      }|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|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}}| 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}}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)&zATest admin panel access via GET /admin with proper authorization.adminregular/admin.  i  i  inz3%(py2)s
{%(py2)s = %(py0)s.status_code
} in %(py5)sresponsepy0py2py5assert %(py7)spy7N/loginusernamepasswordr%   r&   datar   ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)slogin_response/logout
csrf_token    s   <!DOCTYPE html>s   <html)z,%(py3)s in %(py7)s
{%(py7)s = %(py5)s.data
}py3r!   r#   %(py9)spy9)z0%(py12)s in %(py16)s
{%(py16)s = %(py14)s.data
}py12py14py16%(py18)spy18   assert %(py21)spy21)getstatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationpostr)   append_format_boolop)client
test_users
admin_userregular_userr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8r-   @py_assert2@py_assert6@py_assert0@py_assert11@py_assert15@py_assert13@py_format10@py_format17@py_format19@py_format20@py_format22s                         r   *test_admin_panel_access_and_authenticationr`   -   s    G$Ji(L zz(#H2?2?2222?22222282228222222?2222222 [[ , ,1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,,zz(#H&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& KK	r 2K3 [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,,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Kr   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                  d       | j                         5 }|j                  dd      }ddd       | j                  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                  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   }||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}}t$        j&                  }|j(                  }d} ||      }|d    }|j(                  }d} ||      } |||      }|sbd!d"t        j                         v st        j                  t$              rt        j                  t$              nd"t        j                  |      d#t        j                         v st        j                  |      rt        j                  |      nd#t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      d$z  }t        t        j                  |            dx}x}x}x}x}x}x}x}}ddd       y# 1 sw Y   IxY w# 1 sw Y   yxY w)%z+Test adding users via POST /admin/add_user.r   newuserpass123r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nr   r/   r0   /admin/add_user?csrf_token=r   z<SELECT username, password_hash FROM users WHERE username = ?is notz%(py0)s is not %(py3)suserr   r3   assert %(py5)sr!   z%(py1)s == %(py3)sunique_usernamepy1r3   utf-8password_hashassert %(py19)s
{%(py19)s = %(py2)s
{%(py2)s = %(py0)s.checkpw
}(%(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.encode
}(%(py7)s)
}, %(py17)s
{%(py17)s = %(py13)s
{%(py13)s = %(py11)s.encode
}(%(py15)s)
})
}bcrypttest_passwordr   r    r3   r!   r#   r5   py11py13py15py17py19)r   rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   r?   session_transactionapplicationapp_contextr   executefetchonerq   checkpwencode)rL   rM   rN   rk   rr   r-   rP   rQ   rR   rS   rT   sessr/   r   dbrg   rU   @py_format4rW   rV   @py_assert8@py_assert10@py_assert12@py_assert14@py_assert16@py_assert18r^   s                              r   !test_admin_add_user_functionalityr   R   s    G$J)+O$M [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJx		#	#	%XXlB/
 
& {{8E*9*7   H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& 
			'	'	)XzzJ
 (* 	  t4t4tt4J2?2222?222222222?222?2222222 ~~cm22c7c27;cT/=Rc=R=Y=YcZac=YZa=bc~;=bccccccccvcccvccc~ccccccmcccmccc2ccc7ccc;ccc=Rccc=YcccZaccc=bcccccccccccc 
*	) 
&	% 
*	)s   U1-L;U>1U;>V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
 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}}| 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}}y# 1 sw Y   xY w)z$Test user addition input validation.r   r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nr   r/   r0   rc   abpassword123r   TestUservaliduser123rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   r?   ry   )rL   rM   rN   r-   rP   rQ   rR   rS   rT   r   r/   r   s               r   test_admin_add_user_validationr   |   s    G$J [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJx		#	#	%XXlB/
 
& {{8E*.*7   H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& {{8E*4*7   H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& {{8E*8*,   H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&9 
&	%s   O

Oc                 N
   |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                  j                         5  t               }t        j                  |j!                  d      t        j"                               j%                  d      }|j'                  d||f      }|j(                  }t+               }|j'                  d|t-        |      df       |j/                          ddd       | j1                  d       | j3                         5 }|j1                  dd      }ddd       | j                  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                  j                         5  t               }|j'                  d|f      j5                         }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}}|j'                  d!|f      j7                         }t9        |      }d"}||k(  }|st        j                  d	|fd#||f      d$t        j                         v st        j                  t8              rt        j                  t8              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   JxY w# 1 sw Y   xY w# 1 sw Y   yxY w))z:Test removing users via POST /admin/remove_user/<user_id>.r   removetest123r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nrn   z9INSERT INTO users (username, password_hash) VALUES (?, ?)FINSERT INTO cameras (user_id, camera_id, camera_name) VALUES (?, ?, ?)zTest Camera for Removalr   r/   r0   /admin/remove_user/?csrf_token=r   z SELECT * FROM users WHERE id = ?isz%(py0)s is %(py3)srg   rh   ri   r!   z'SELECT * FROM cameras WHERE user_id = ?r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slencamerasr   rm   r3   py6assert %(py8)spy8)r   rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   rz   r{   r   rq   hashpwr   gensaltdecoder|   	lastrowidr   r	   commitr?   ry   r}   fetchallr   )rL   rM   rN   rk   rr   r-   rP   rQ   rR   rS   rT   r   pwd_hashcursortest_user_idunique_camera_idr   r/   r   rg   rU   r   r   @py_assert5@py_format7@py_format9s                             r   $test_admin_remove_user_functionalityr      s    G$J)+O#M [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
			'	'	)X==!5!5g!>@PQXXY`aGh'
 '' 01


T3/02KL	
 			 
*$ JJx		#	#	%XXlB/
 
& {{0l:,WXH&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& 
			'	'	)X zz.O
 (* 	 tt|ttttt **5O
 (* 	 7| q |q    |q      s   s      7   7   |   q        
*	)9 
*	)& 
&	% 
*	)s&   B)T"T6HTTTT$c                 
   |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       | j                         5 }|j                  dd      }ddd       | j                  d|d    d d|i      }|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                  j                         5  t               }|j                  d|d   f      j!                         }|
	 ddd       yt"        j$                  }|j&                  }d} ||      }|d   }|j&                  }d} ||      } |||      }|sbddt	        j
                         v st        j                  t"              rt        j                  t"              ndt        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}x}x}x}x}x}x}}ddd       | j                  dddi       | 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}}y# 1 sw Y   xY w# 1 sw Y   xY w) zGTest changing user passwords via POST /admin/change_password/<user_id>.r   limitednewchangedpass123r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nr   r/   r0   /admin/change_password/idr   new_passwordr   z,SELECT password_hash FROM users WHERE id = ?rn   ro   rp   rq   rs   r.   )rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   r?   ry   rz   r{   r   r|   r}   rq   r~   r   )rL   rM   rN   target_userr   r-   rP   rQ   rR   rS   rT   r   r/   r   r   rg   rV   r   r   r   r   r   r   r^   s                           r   (test_admin_change_password_functionalityr      s    G$JY'K&L [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJx		#	#	%XXlB/
 
& {{4[5F4G|T^S_` .=  ?H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& 
			'	'	)Xzz: 
 (* 	 < 
*	) ~~bl11b'b1':bD<Qb<Q<X<XbY`b<XY`<ab~:<abbbbbbbbvbbbvbbb~bbbbbblbbblbbb1bbb'bbb:bbb<Qbbb<XbbbY`bbb<abbbbbbbbbbbb 
*  KK	r 2K3[[
+ 1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,,A 
&	% 
*	)s   T(-2T5(GT5(T25T?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                  }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}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 ]  }|j                  d      |d   k(  sd%}|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}} n |sed/d0d1t	        j
                         v st        j                  |      rt        j                  |      nd1iz  }t        t        j                  |            y)2z3Test admin users listing via GET /admin/users.json.r   r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   N/admin/users.jsonr1   r   usersr   z%(py1)s in %(py3)sr)   rl   ri   r!   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancelistr   rm   r    py4   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr   r   r   r   FTis_adminr   z%(py1)s is %(py4)srm   r   assert %(py6)sr   camera_countrg   r   zassert %(py0)sr   admin_found)rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   r?   jsonloadsr)   r   r   r   )rL   rM   rN   r-   rP   rQ   rR   rS   rT   r   r)   rW   rU   r   r   @py_format5r   r   r   r   rg   @py_format1s                         r   test_admin_users_json_apir     s    G$J [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, zz-.H&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D7d?7d7ddMEeT"""""""":""":""""""e"""e""""""T"""T""""""""""u::?:33uu: K88J:j#99K
#+t+#t++++#t+++#+++t+++++++!)>T))))>T)))>))))))T)))T)))))))44<44444  ;;;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                  j                         5  t               }|j                  d|d   f      j                         }|soddl} |j"                  |d   j%                  d       |j&                               j)                  d      }|j                  d|d   ||d   f      }|j*                  }n|d   }|j                  d|t-        |      df       |j/                          ddd       | j                  j                         5  t               }|j                  d|d   f      j                         }|r|d   n|d   }ddd       | j1                  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}}t3        j4                  |j6                        }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   }t9        |t:              }|sd#d$t        j                         v st        j                  t8              rt        j                  t8              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}d}|D ]#  }t=        |j1                  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   }xY w# 1 sw Y   -xY w)1zKTest admin user cameras listing via GET /admin/user/<user_id>/cameras.json.r   r   r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   N'SELECT id FROM users WHERE username = ?r   rn   FINSERT INTO users (username, password_hash, is_admin) VALUES (?, ?, ?)r   r   r   zAdmin Test Camera/admin/user//cameras.jsonr1   r   r   r   r   r)   rl   ri   r!   r   r   r   r   	camera_idrd   rf   
our_camerarh   camera_name)z%(py1)s == %(py4)sr   r   r   )r   rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   rz   r{   r   r|   r}   rq   r   r   r   r   r   r	   r   r?   r   r   r)   r   r   str)rL   rM   rN   rO   r   r-   rP   rQ   rR   rS   rT   r   
user_checkrq   ro   r   actual_user_id
user_in_dbr   r)   rW   rU   r   r   r   r   camerar   s                               r    test_admin_user_cameras_json_apir   <  s{    G$Ji(L+- [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
			'	'	)XZZ ILYcLdKfgppr
)FMM,z*B*I*I'*RTbTZTbTbTdellmtuMZZXj)=,z:RSF $--N'-N


TS!124GH	
 			) 
*. 
			'	'	)XZZ ILYcLdKfgppr
-7D)\$=O 
*
 zzL(8FGH&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D9999oGgt$$$$$$$$:$$$:$$$$$$g$$$g$$$$$$t$$$t$$$$$$$$$$ Jvzz+&'+;;J 
 "!:T!!!!:T!!!!!!:!!!:!!!T!!!!!!!m$;(;;$(;;;;;$(;;;;$;;;(;;;;;;;;Y 
*	). 
*	)s   CY!;Y.!Y+.Y8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                  j                         5  t               }|j                  d|d   f      j                         }|soddl} |j"                  |d   j%                  d       |j&                               j)                  d      }|j                  d|d   ||d   f      }|j*                  }n|d   }|j                  d|t-        |      df       |j/                          ddd       ddlm}  ||||d         }| j                  j                         5  t               }|j                  d|d   f      j                         }|r|d   n|d   }ddd       | j5                  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}
}	t7        j8                  |j:                        }y# 1 sw Y   wxY w# 1 sw Y   xY w)zITest admin user images listing via GET /admin/user/<user_id>/images.json.r   r   r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nr   r   rn   r   r   r   r   zImages Test Cameracreate_test_image_filejpgr   /images.jsonr1   r   )r   rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   rz   r{   r   r|   r}   rq   r   r   r   r   r   r	   r   tests.functional.test_imagesr   r?   r   r   r)   )rL   rM   temp_staticsample_image_datarN   rO   r   r-   rP   rQ   rR   rS   rT   r   r   rq   ro   r   r   r   rel_pathr   r   r)   s                           r   test_admin_user_images_json_apir   z  s    G$Ji(L+- [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
			'	'	)XZZ ILYcLdKfgppr
)FMM,z*B*I*I'*RTbTZTbTbTdellmtuMZZXj)=,z:RSF $--N'-N


TS!124HI	
 			) 
*. D%k3CEVW\E]^H 
			'	'	)XZZ ILYcLdKfgppr
-7D)\$=O 
*
 zzL(8EFH&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& ::hmm$DI 
*	)6 
*	)s   CM;M(M%(M2c                    |d   }|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                  j                         5  t               }|j                  d|d   f      j                         }|soddl} |j"                  |d   j%                  d       |j&                               j)                  d      }|j                  d|d   ||d   f      }|j*                  }n|d   }|j                  d|t-        |      df       |j/                          ddd       | j1                  d       | j3                         5 }|j1                  dd      }ddd       | j                  j                         5  t               }|j                  d|d   f      j                         }|r|d   n|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}	}t5        j6                  |j8                        }|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/d0|iz  }
t        t        j                  |
            dx}}|d1   }||k(  }|st        j                  d
|fd2||f      t        j                  |      d3t        j                         v st        j                  |      rt        j                  |      nd3d4z  }d/d0|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   MxY w# 1 sw Y   yxY w)5zITest admin camera renaming via POST /admin/user/<user_id>/cameras/rename.r   r   zAdmin Renamed Camerar$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nr   r   rn   r   r   r   r   zOriginal Camera Namer   r/   r0   r   z/cameras/rename?csrf_token=)r   r   application/jsonr   content_typer1   r   successTr   r   r   r   r   z3SELECT camera_name FROM cameras WHERE camera_id = ?rd   rf   r   rh   ri   r!   r   rj   new_camera_namerl   r   rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   rz   r{   r   r|   r}   rq   r   r   r   r   r   r	   r   r?   ry   r   r   r)   )rL   rM   rN   rO   r   r   r-   rP   rQ   rR   rS   rT   r   r   rq   ro   r   r   r   r/   r   r   r)   rW   rU   r   r   r   r   s                                r   test_admin_rename_user_camerar     sn    G$Ji(L+-,O [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
			'	'	)XZZ ILYcLdKfgppr
)FMM,z*B*I*I'*RTbTZTbTbTdellmtuMZZXj)=,z:RSF $--N'-N


TS!124JK	
 			) 
*. JJx		#	#	%XXlB/
 
& 
			'	'	)XZZ ILYcLdKfgppr
-7D)\$=O 
*
 {{\.)99TU_T`a+;-<  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?"d"?d""""?d"""?"""d""""""" 
			'	'	)XA!"$
 (* 	 "!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!m$7$7777$777$7777777777777777 
*	)[ 
*	)0 
&	% 
*	)" 
*	)s2   CV2V?;W&FW2V<?W	WW"c                 r
   |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                  j                         5  t               }|j                  d|d   f      j                         }|soddl} |j"                  |d   j%                  d       |j&                               j)                  d      }|j                  d|d   ||d   f      }|j*                  }n|d   }|j                  d|t-        |      df       |j/                          ddd       | j1                  d       | j3                         5 }|j1                  dd      }ddd       | j                  j                         5  t               }|j                  d|d   f      j                         }|r|d   n|d   }ddd       | 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}}t5        j6                  |j8                        }|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)/zITest admin camera deletion via POST /admin/user/<user_id>/cameras/delete.r   r   r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nr   r   rn   r   r   r   r   zCamera to Deleter   r/   r0   r   z/cameras/delete?csrf_token=r   r   r   r1   r   r   Tr   r   r   r   r   z)SELECT * FROM cameras WHERE camera_id = ?r   r   rh   ri   r!   r   )rL   rM   rN   rO   r   r-   rP   rQ   rR   rS   rT   r   r   rq   ro   r   r   r   r/   r   r   r)   rW   rU   r   r   r   r   s                               r   test_admin_delete_user_camerar     s    G$Ji(L+- [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
			'	'	)XZZ ILYcLdKfgppr
)FMM,z*B*I*I'*RTbTZTbTbTdellmtuMZZXj)=,z:RSF $--N'-N


TS!124FG	
 			) 
*. JJx		#	#	%XXlB/
 
& 
			'	'	)XZZ ILYcLdKfgppr
-7D)\$=O 
*
 {{\.)99TU_T`a +-=>'9  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?"d"?d""""?d"""?"""d""""""" 
			'	'	)X7!"$
 (* 	 v~vvv 
*	)U 
*	)0 
&	% 
*	) 
*	)s2   CTT;T #CT-TT T*-T6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                  j                         5  t               }|j                  d|d   f      j                         }|soddl} |j"                  |d   j%                  d       |j&                               j)                  d      }|j                  d|d   ||d   f      }|j*                  }n|d   }|j                  d|t-        |      df       |j/                          ddd       ddlm}  ||||d         }| j5                  d       | j7                         5 }|j5                  dd      }ddd       | j                  j                         5  t               }|j                  d|d   f      j                         }|r|d   n|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}
}	t9        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}}
y# 1 sw Y   7xY w# 1 sw Y   xY w# 1 sw Y   xY w)*z7Test admin image deletion via POST /admin/image/delete.r   r   r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nr   r   rn   r   r   r   r   zImage Delete Test Camerar   r   r   r/   r0   z/admin/image/delete?csrf_token=)reluser_idr   r   r1   r   r   Tr   r   r   r   r   )r   rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   rz   r{   r   r|   r}   rq   r   r   r   r   r   r	   r   r   r   r?   ry   r   r   r)   )rL   rM   r   r   rN   rO   r   r-   rP   rQ   rR   rS   rT   r   r   rq   ro   r   r   r   r   r   r/   r   r   r)   rW   rU   r   r   s                                 r   test_admin_delete_user_imager   :  sk    G$Ji(L+- [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 
			'	'	)XZZ ILYcLdKfgppr
)FMM,z*B*I*I'*RTbTZTbTbTdellmtuMZZXj)=,z:RSF $--N'-N


TS!124NO	
 			) 
*. D%k3CEVW\E]^H JJx		#	#	%XXlB/
 
& 
			'	'	)XZZ ILYcLdKfgppr
-7D)\$=O 
*
 {{<ZLI%-)7  (:  ;H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&::hmm$D	?"d"?d""""?d"""?"""d"""""""] 
*	)8 
&	% 
*	)s%   CP"P(;P5P%(P25P?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}}ddd|d    dd|d    dg}	|	D ]  }
| j                  |
      }|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       ddddfd|d    i fd|d    ddifg}|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}} y# 1 sw Y   xY w) z.Test admin operation authorization boundaries.r   r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nr   r   r   r   r   r   r   /r/   r0   /admin/add_usertestr   r   r   newpassr   r   )rL   rM   rO   r-   rP   rQ   rR   rS   rT   admin_endpointsendpointr   r   r/   admin_post_operationsr)   s                   r   #test_admin_authorization_boundariesr   }  s    i(L [[ , ,1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, 	
|D)*-8
|D)*,7	O $::h'##*s*#s****#s******x***x***#***s******* $
 JJsO		#	#	%XXlB/
 
& 
VDE|D12	3R8"<#5"6	7.)9TU 0$;;(<
|D4;P##*s*#s****#s******x***x***#***s******* 0 
&	%s   ?L!!L+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                  d       | j                         5 }|j                  dd      }ddd       | j                  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(  rt        j                  |j                        }t         t"        f}t%        ||      }|sd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  }	t        t        j                  |	            dx}}y|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}}y# 1 sw Y   xY w)z%Test audit logging for admin actions.r   auditlogtest123r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nr   r/   r0   rc   r   z/admin/logs.jsonr1   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}r   r)   )r   rm   r3   r!     i  r   r   )r   rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   r?   ry   r   r   r)   dictr   r   )rL   rM   rN   rk   rr   r-   rP   rQ   rR   rS   rT   r   r/   r   r)   rU   s                   r   test_admin_audit_loggingr     s    G$J)+O%M [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJx		#	#	%XXlB/
 
& {{8E*9*7   H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& zz,-H s"zz(--(!%t-z$--------z---z------$---$------------- ##1Sz1#z1111#z111111x111x111#111z1111111- 
&	%s   PP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 admin operations require authentication.)
)r   GET)r   r   )z/admin/user/1/cameras.jsonr   )z/admin/user/1/images.jsonr   )r   POST)z/admin/remove_user/1r  )z/admin/change_password/1r  )z/admin/user/1/cameras/renamer  )z/admin/user/1/cameras/deleter  )z/admin/image/deleter  r   )r   r   r   r   r   r   r"   r#   Nr   r   login)z0%(py3)s in %(py7)s
{%(py7)s = %(py5)s.location
}r2   r4   r5   )z4%(py12)s in %(py16)s
{%(py16)s = %(py14)s.location
}r6   r:   r;   r<   r=   r>   )r?   rI   r@   rA   rB   rC   rD   rE   rF   rG   rH   locationrJ   rK   )rL   r   r   methodr   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   s                        r   ,test_admin_operations_require_authenticationr    s   O ,&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                 f	   |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
       }|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i      }|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}}|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}}y# 1 sw Y   xY w)z(Test admin operations with invalid data.r   r$   r%   r&   r'   r(   r   r*   r,   r-   r   r"   r#   Nr   r/   r0   z$/admin/remove_user/99999?csrf_token=r   z(/admin/change_password/99999?csrf_token=r   
newpass123z/admin/user/99999/cameras.jsonr1   r   r   r   r   rc   testpass123r   )rL   rM   rN   r-   rP   rQ   rR   rS   rT   r   r/   r   existing_usernames                r   test_admin_invalid_operationsr
    s=    G$J [[z*z*1[ N %%,,%,,,,%,,,,,,>,,,>,,,%,,,,,,,,,, JJx		#	#	%XXlB/
 
& {{A*NOH&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& {{Ej\R .=  ?H&3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&& zz:;H-C:-:----:------8---8------:------- #9-j9{{8E*;*7   H &3&3&&&&3&&&&&&8&&&8&&&&&&3&&&&&&&3 
&	%s   R&&R0) __doc__builtinsrC   _pytest.assertion.rewrite	assertionrewriterA   pytestr   r
   rq   app_modules.dbr   r   r   markr   r`   r   r   r   r   r   r   r   r   r   r   r   r   r  r
   r   r   <module>r     s   0      !#/ !L !LH &d &dR )' )'X 9! 9!x /- /-d  D :< :<z 2% 2%l C8 C8L > >B <# <#D $+ $+N %2 %2P L L: &' &'r   