o
    ?hv                     @   sN  d Z ddlZddlm  mZ ddlZddlZddl	Z	ddl
Z
ddlmZ dd Zdd Zejjdd	 Zejjd
d Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjdd Zejjd d! Zejjd"d# Zejjd$d% ZdS )&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                  C   s   t t d d } d|  S )z'Generate a unique username for testing.  @B 	testuser_inttime)	timestamp r
   ,/var/www/html/tests/functional/test_admin.pyget_unique_username    s   
r   c                  C   s8   t t d d } t t d d }| d|dS )z1Generate a unique 12-digit camera ID for testing.r   i r   i'  08d04dr   )r	   random_partr
   r
   r   get_unique_camera_id&   s   r   c                 C   s  |d }|d }|  d}|j}g d}||v }|sNtd|fd||fdt v s/t|r4t|ndt|t|d }d	d
|i }	tt	|	d } }}| j
d|d |d dd}
|
j}d}||k}|std|fd||fdt v st|
rt|
ndt|t|d }d	d
|i }	tt	|	d } }}|  d}|j}d}||k}|std|fd||fdt v st|rt|ndt|t|d }d	d
|i }	tt	|	d } }}| j
dddid | j
d|d |d dd}
|
j}d}||k}|sJtd|fd||fdt v s+t|
r0t|
ndt|t|d }d	d
|i }	tt	|	d } }}|  d}|j}d}||k}|std|fd||fdt v sxt|r}t|ndt|t|d }d	d
|i }	tt	|	d } }}g }d}|j}||v }|}|sd}|j}||v }|}|s;td|fd||ft|dt v st|rt|ndt|d }	dd|	i }|| |s&td|fd||ft|dt v st|rt|ndt|d  }d!d"|i }|| t|d#i  }d$d%|i }tt	|d } } } } } } }}dS )&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_format22r
   r
   r   *test_admin_panel_access_and_authentication-   s*   




b r\   c                 C   s  |d }t  }d}| jd|d |d dd}|j}d}||k}|sVtd	|fd
||fdt v s7t|r<t|ndt|t|d }	dd|	i }
t	t
|
d } }}| d |  }|dd}W d   n1 svw   Y  | jd| ||dd}|j}d}||k}|std	|fd
||fdt v st|rt|ndt|t|d }	dd|	i }
t	t
|
d } }}| j  t }|d|f }d}||u}|std|fd||fdt v st|rt|ndt|d }dd|i }	t	t
|	d }}|d }||k}|s[td	|fd||ft|dt v sDt|rIt|ndd }dd|i }	t	t
|	d }}tj}|j}d}||}|d  }|j}d}||}|||}|sd!d"t v sttrttnd"t|d#t v st|rt|nd#t|t|t|t|t|t|t|t|d$ }t	t
|d } } } } } } } }}W d   dS 1 sw   Y  dS )%z+Test adding users via POST /admin/add_user.r   newuserpass123r    r!   r"   r#   r$   r   r&   r(   r)   r   r   r   Nr   r+   r,   /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   r/   assert %(py5)sr   z%(py1)s == %(py3)sunique_usernamepy1r/   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   r/   r   r   r1   py11py13py15py17py19)r   rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   r;   session_transactionapplicationapp_contextr   executefetchonerl   checkpwencode)rH   rI   rJ   rf   rm   r)   rL   rM   rN   rO   rP   sessr+   r   dbrb   rQ   @py_format4rS   rR   @py_assert8@py_assert10@py_assert12@py_assert14@py_assert16@py_assert18rZ   r
   r
   r   !test_admin_add_user_functionalityR   s>   


| $r   c                 C   s  |d }| j d|d |d dd}|j}d}||k}|sQtd|fd	||fd
t v s2t|r7t|nd
t|t|d }dd|i }tt	|d } }}| 
d |  }	|	
dd}
W d   n1 sqw   Y  | j d|
 dddd}|j}d}||k}|std|fd	||fdt v st|rt|ndt|t|d }dd|i }tt	|d } }}| j d|
 dddd}|j}d}||k}|std|fd	||fdt v st|rt|ndt|t|d }dd|i }tt	|d } }}| j d|
 dddd}|j}d}||k}|sjtd|fd	||fdt v sKt|rPt|ndt|t|d }dd|i }tt	|d } }}dS )z$Test user addition input validation.r   r    r!   r"   r#   r$   r   r&   r(   r)   r   r   r   Nr   r+   r,   r^   abpassword123r   TestUservaliduser123rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   r;   rt   )rH   rI   rJ   r)   rL   rM   rN   rO   rP   r{   r+   r   r
   r
   r   test_admin_add_user_validation|   s8   


r   c                 C   s  |d }t  }d}| jd|d |d dd}|j}d}||k}|sVtd	|fd
||fdt v s7t|r<t|ndt|t|d }	dd|	i }
t	t
|
d } }}| j 6 t }t|dt d}|d||f}|j}t }|d|t|df |  W d   n1 sw   Y  | d |  }|dd}W d   n1 sw   Y  | d| d| }|j}d}||k}|s	td	|fd
||fdt v st|rt|ndt|t|d }	dd|	i }
t	t
|
d } }}| j  t }|d|f }d}||u }|s\td|fd||fdt v sAt|rFt|ndt|d }dd |i }	t	t
|	d }}|d!|f }t|}d"}||k}|std	|fd#||fd$t v sttrttnd$d%t v st|rt|nd%t|t|d& }d'd(|i }t	t
|d } }}W d   dS 1 sw   Y  dS ))z:Test removing users via POST /admin/remove_user/<user_id>.r   removetest123r    r!   r"   r#   r$   r   r&   r(   r)   r   r   r   Nri   z9INSERT INTO users (username, password_hash) VALUES (?, ?)FINSERT INTO cameras (user_id, camera_id, camera_name) VALUES (?, ?, ?)zTest Camera for Removalr   r+   r,   /admin/remove_user/?csrf_token=r   z SELECT * FROM users WHERE id = ?isz%(py0)s is %(py3)srb   rc   rd   r   z'SELECT * FROM cameras WHERE user_id = ?r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slencamerasr   rh   r/   py6assert %(py8)spy8)r   rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   ru   rv   r   rl   hashpwrz   gensaltdecoderw   	lastrowidr   r   commitr;   rt   rx   fetchallr   )rH   rI   rJ   rf   rm   r)   rL   rM   rN   rO   rP   r|   pwd_hashcursortest_user_idunique_camera_idr{   r+   r   rb   rQ   r}   r   @py_assert5@py_format7@py_format9r
   r
   r   $test_admin_remove_user_functionality   s\   



~$r   c                 C   s  |d }|d }d}| j d|d |d dd}|j}d	}||k}|sWtd
|fd||fdt v s8t|r=t|ndt|t|d }	dd|	i }
tt	|
d } }}| 
d |  }|
dd}W d   n1 sww   Y  | j d|d  d| d|id}|j}d	}||k}|std
|fd||fdt v st|rt|ndt|t|d }	dd|	i }
tt	|
d } }}| j  t }|d|d f }|du r	 W d   dS tj}|j}d}||}|d }|j}d}||}|||}|sjddt v s"ttr'ttndt|dt v s9t|r>t|ndt|t|t|t|t|t|t|t|d }tt	|d } } } } } } } }}W d   n	1 sw   Y  | j dddid | j d|d |dd}|j}d	}||k}|std
|fd||fdt v st|rt|ndt|t|d }	dd|	i }
tt	|
d } }}dS ) 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+   r,   /admin/change_password/idr   new_passwordr   z,SELECT password_hash FROM users WHERE id = ?ri   rj   rk   rl   rn   r*   )rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   r;   rt   ru   rv   r   rw   rx   rl   ry   rz   )rH   rI   rJ   target_userr   r)   rL   rM   rN   rO   rP   r{   r+   r   r|   rb   rR   r~   r   r   r   r   r   rZ   r
   r
   r   (test_admin_change_password_functionality   sH   


 
r   c                 C   s  |d }| j d|d |d dd}|j}d}||k}|sQtd|fd	||fd
t v s2t|r7t|nd
t|t|d }dd|i }tt	|d } }}| 
d}	|	j}d}||k}|std|fd	||fdt v s|t|	rt|	ndt|t|d }dd|i }tt	|d } }}t|	j}
d}||
v }|std|fd||
ft|dt v st|
rt|
ndd }dd|i }tt	|d }}|
d }t|t}|s7ddt v sttrttnddt v st|rt|nddt v s"ttr'ttndt|d }tt	|d}t|}d}||k}|std|fd||fd t v s]ttrbttnd dt v spt|rut|ndt|t|d! }d"d#|i }tt	|d } }}d$}|D ]}|
d|d kr]d%}|d& }d%}||u }|std'|fd(||ft|t|d) }d*d+|i }tt	|d } }}d,}||v }|std|fd||ft|d-t v st|rt|nd-d }dd|i }tt	|d }}d.}||v }|sWtd|fd||ft|d-t v s@t|rEt|nd-d }dd|i }tt	|d }} nq|sd/d0d1t v sqt|rvt|nd1i }tt	|dS )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.jsonr-   r   usersr   z%(py1)s in %(py3)sr%   rg   rd   r   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancelistr   rh   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rh   r   assert %(py6)sr   camera_countrb   r   zassert %(py0)sr   admin_found)rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   r;   jsonloadsr%   r   r   r   )rH   rI   rJ   r)   rL   rM   rN   rO   rP   r   r%   rS   rQ   r}   r   @py_format5r   r   r   r   rb   @py_format1r
   r
   r   test_admin_users_json_api  s.   

xl~~Hr   c                 C   s  |d }|d }t  }| jd|d |d dd}|j}d}||k}|sXtd	|fd
||fdt v s9t|r>t|ndt|t|d }	dd|	i }
t	t
|
d } }}| j P t }|d|d f }|sddl}||d d| d}|d|d ||d f}|j}n|d }|d|t|df |  W d   n1 sw   Y  | j   t }|d|d f }|r|d n|d }W d   n1 sw   Y  | d| d}|j}d}||k}|s3td	|fd
||fdt v st|rt|ndt|t|d }	dd|	i }
t	t
|
d } }}t|j}d}||v }|sztd|fd||ft|dt v sct|rht|ndd  }d!d"|i }	t	t
|	d }}|d }t|t}|sd#d$t v sttrttnd$dt v st|rt|ndd%t v sttrttnd%t|d& }t	t
|d}d}|D ]}t|d'|kr|} nqd}||u}|s&td(|fd)||fd*t v st|rt|nd*t|d+ }d!d"|i }	t	t
|	d }}|d, }d}||k}|sZtd	|fd-||ft|t|d. }d/d0|i }t	t
|d } }}dS )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   ri   FINSERT INTO users (username, password_hash, is_admin) VALUES (?, ?, ?)r   r   r   zAdmin Test Camera/admin/user//cameras.jsonr-   r   r   r   r   r%   rg   rd   r   r   r   r   r   	camera_idr_   ra   
our_camerarc   camera_name)z%(py1)s == %(py4)sr   r   r   )r   rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   ru   rv   r   rw   rx   rl   r   rz   r   r   r   r   r   r;   r   r   r%   r   r   str)rH   rI   rJ   rK   r   r)   rL   rM   rN   rO   rP   r|   
user_checkrl   rj   r   actual_user_id
user_in_dbr   r%   rS   rQ   r}   r   r   r   camerar   r
   r
   r    test_admin_user_cameras_json_api<  sZ   
 
~~pr   c                 C   s  |d }|d }t  }| jd|d |d dd}|j}d}	||	k}
|
sXtd	|
fd
||	fdt v s9t|r>t|ndt|t|	d }dd|i }t	t
|d } }
}	| j P t }|d|d f }|sddl}||d d| d}|d|d ||d f}|j}n|d }|d|t|df |  W d   n1 sw   Y  ddlm} ||||d }| j   t }|d|d f }|r|d n|d }W d   n1 sw   Y  | d| d}|j}d}	||	k}
|
sAtd	|
fd
||	fdt v s"t|r't|ndt|t|	d }dd|i }t	t
|d } }
}	t|j}dS )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   ri   r   r   r   r   zImages Test Cameracreate_test_image_filejpgr   /images.jsonr-   r   )r   rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   ru   rv   r   rw   rx   rl   r   rz   r   r   r   r   r   tests.functional.test_imagesr   r;   r   r   r%   )rH   rI   temp_staticsample_image_datarJ   rK   r   r)   rL   rM   rN   rO   rP   r|   r   rl   rj   r   r   r   rel_pathr   r   r%   r
   r
   r   test_admin_user_images_json_apiz  sH   
 
r   c                 C   s  |d }|d }t  }d}| jd|d |d dd}|j}d	}||k}	|	sZtd
|	fd||fdt v s;t|r@t|ndt|t|d }
dd|
i }t	t
|d } }	}| j P t }|d|d f }|sddl}||d d| d}|d|d ||d f}|j}n|d }|d|t|df |  W d   n1 sw   Y  | d |  }|dd}W d   n1 sw   Y  | j   t }|d|d f }|r|d n|d }W d   n	1 sw   Y  | jd| d| ||ddd }|j}d!}||k}	|	s]td
|	fd||fd"t v s>t|rCt|nd"t|t|d }
dd|
i }t	t
|d } }	}t|j}|d# }d$}	||	u }|std%|fd&||	ft|t|	d' }d(d)|i }t	t
|d } }}	| j  t }|d*t|f }d}||u}|std+|fd,||fd-t v st|rt|nd-t|d. }d/d0|i }
t	t
|
d }}|d1 }||k}|s/td
|fd2||ft|d3t v st|rt|nd3d4 }d/d0|i }
t	t
|
d }}W d   dS 1 s?w   Y  dS )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   ri   r   r   r   r   zOriginal Camera Namer   r+   r,   r   z/cameras/rename?csrf_token=)r   r   application/jsonr   content_typer-   r   successTr   r   r   r   r   z3SELECT camera_name FROM cameras WHERE camera_id = ?r_   ra   r   rc   rd   r   r   re   new_camera_namerg   r   rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   ru   rv   r   rw   rx   rl   r   rz   r   r   r   r   r   r;   rt   r   r   r%   )rH   rI   rJ   rK   r   r   r)   rL   rM   rN   rO   rP   r|   r   rl   rj   r   r   r{   r+   r   r   r%   rS   rQ   r   r   r   r}   r
   r
   r   test_admin_rename_user_camera  sp   
 


l~$r   c                 C   s  |d }|d }t  }| jd|d |d dd}|j}d}||k}|sXtd	|fd
||fdt v s9t|r>t|ndt|t|d }	dd|	i }
t	t
|
d } }}| j P t }|d|d f }|sddl}||d d| d}|d|d ||d f}|j}n|d }|d|t|df |  W d   n1 sw   Y  | d |  }|dd}W d   n1 sw   Y  | j   t }|d|d f }|r|d n|d }W d   n	1 sw   Y  | jd| d| d|idd}|j}d }||k}|sZtd	|fd
||fd!t v s;t|r@t|nd!t|t|d }	dd|	i }
t	t
|
d } }}t|j}|d" }d#}||u }|std$|fd%||ft|t|d& }d'd(|i }t	t
|d } }}| j V t }|d)t|f }d}||u }|std$|fd*||fd+t v st|rt|nd+t|d, }d-d.|i }	t	t
|	d }}W d   dS 1 sw   Y  dS )/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   ri   r   r   r   r   zCamera to Deleter   r+   r,   r   z/cameras/delete?csrf_token=r   r   r   r-   r   r   Tr   r   r   r   r   z)SELECT * FROM cameras WHERE camera_id = ?r   r   rc   rd   r   r   )rH   rI   rJ   rK   r   r)   rL   rM   rN   rO   rP   r|   r   rl   rj   r   r   r{   r+   r   r   r%   rS   rQ   r   r   r   r}   r
   r
   r   test_admin_delete_user_camera  sh   
 


l$r   c                 C   sV  |d }|d }t  }| jd|d |d dd}|j}d}	||	k}
|
sXtd	|
fd
||	fdt v s9t|r>t|ndt|t|	d }dd|i }t	t
|d } }
}	| j P t }|d|d f }|sddl}||d d| d}|d|d ||d f}|j}n|d }|d|t|df |  W d   n1 sw   Y  ddlm} ||||d }| d |  }|dd}W d   n1 sw   Y  | j ! t }|d|d f }|r|d n|d }W d   n	1 sw   Y  | jd| ||ddd }|j}d!}	||	k}
|
sgtd	|
fd
||	fd"t v sHt|rMt|nd"t|t|	d }dd|i }t	t
|d } }
}	t|j}|d# }d$}
||
u }|std%|fd&||
ft|t|
d' }d(d)|i }t	t
|d } }}
dS )*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   ri   r   r   r   r   zImage Delete Test Camerar   r   r   r+   r,   z/admin/image/delete?csrf_token=)reluser_idr   r   r-   r   r   Tr   r   r   r   r   )r   rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   ru   rv   r   rw   rx   rl   r   rz   r   r   r   r   r   r   r   r;   rt   r   r   r%   )rH   rI   r   r   rJ   rK   r   r)   rL   rM   rN   rO   rP   r|   r   rl   rj   r   r   r   r   r{   r+   r   r   r%   rS   rQ   r   r   r
   r
   r   test_admin_delete_user_image:  s\   
 


pr   c                 C   s  |d }| j d|d |d dd}|j}d}||k}|sQtd|fd	||fd
t v s2t|r7t|nd
t|t|d }dd|i }tt	|d } }}ddd|d  dd|d  dg}	|	D ]L}
| 
|
}|j}d}||k}|std|fd	||fdt v st|rt|ndt|t|d }dd|i }tt	|d } }}qk| 
d |  }|
dd}W d   n1 sw   Y  ddddfd|d  i fd|d  ddifg}|D ]X\}
}| j |
 d| |d}|j}d}||k}|sEtd|fd	||fdt v s&t|r+t|ndt|t|d }dd|i }tt	|d } }}qdS ) 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+   r,   /admin/add_usertestr   r   r   newpassr   r   )rH   rI   rK   r)   rL   rM   rN   rO   rP   admin_endpointsendpointr   r{   r+   admin_post_operationsr%   r
   r
   r   #test_admin_authorization_boundaries}  s4   



r   c                 C   s  |d }t  }d}| jd|d |d dd}|j}d}||k}|sVtd	|fd
||fdt v s7t|r<t|ndt|t|d }	dd|	i }
t	t
|
d } }}| d |  }|dd}W d   n1 svw   Y  | jd| ||dd}|j}d}||k}|std	|fd
||fdt v st|rt|ndt|t|d }	dd|	i }
t	t
|
d } }}| d}|jdkr(t|j}ttf}t||}|s"ddt v sttrttnddt v s	t|rt|ndt|t|d }	t	t
|	d }}dS |j}ddg}||v }|sltd|fd||fdt v sMt|rRt|ndt|t|d }	dd|	i }
t	t
|
d } }}dS )z%Test audit logging for admin actions.r   auditlogtest123r    r!   r"   r#   r$   r   r&   r(   r)   r   r   r   Nr   r+   r,   r^   r   z/admin/logs.jsonr-   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}r   r%   )r   rh   r/   r     i  r   r   )r   rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   r;   rt   r   r   r%   dictr   r   )rH   rI   rJ   rf   rm   r)   rL   rM   rN   rO   rP   r{   r+   r   r%   rQ   r
   r
   r   test_admin_audit_logging  s.   



r   c                 C   s(  g d}|D ]
\}}|dkr|  |}n| j|i d}|j}g d}||v }|s]td|fd||fdt v s>t|rCt|ndt|t|d }d	d
|i }	t	t
|	d } }}|jdkrg }d}
|j}|
|v }|}|sd}|j}||v }|}|std|fd|
|ft|
dt v st|rt|ndt|d }	dd|	i }|| |std|fd||ft|dt v st|rt|ndt|d }dd|i }|| t|di  }dd|i }t	t
|d } } }
 } } } }}qdS )z-Test 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
}r.   r0   r1   )z4%(py12)s in %(py16)s
{%(py16)s = %(py14)s.location
}r2   r6   r7   r8   r9   r:   )r;   rE   r<   r=   r>   r?   r@   rA   rB   rC   rD   locationrF   rG   )rH   r   r   methodr   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r
   r
   r   ,test_admin_operations_require_authentication  s   R r   c                 C   s  |d }| j d|d |d dd}|j}d}||k}|sQtd|fd	||fd
t v s2t|r7t|nd
t|t|d }dd|i }tt	|d } }}| 
d |  }	|	
dd}
W d   n1 sqw   Y  |  d|
 }|j}d}||k}|std|fd	||fdt v st|rt|ndt|t|d }dd|i }tt	|d } }}| j d|
 ddid}|j}d}||k}|std|fd	||fdt v st|rt|ndt|t|d }dd|i }tt	|d } }}| 
d}|j}ddg}||v }|s^td|fd||fdt v s?t|rDt|ndt|t|d }dd|i }tt	|d } }}|d d }| j d|
 |ddd}|j}d}||k}|std|fd	||fdt v st|rt|ndt|t|d }dd|i }tt	|d } }}dS )z(Test admin operations with invalid data.r   r    r!   r"   r#   r$   r   r&   r(   r)   r   r   r   Nr   r+   r,   z$/admin/remove_user/99999?csrf_token=r   z(/admin/change_password/99999?csrf_token=r   
newpass123z/admin/user/99999/cameras.jsonr-   r   r   r   r   r^   testpass123r   )rH   rI   rJ   r)   rL   rM   rN   rO   rP   r{   r+   r   existing_usernamer
   r
   r   test_admin_invalid_operations  s2   



r   ) __doc__builtinsr?   _pytest.assertion.rewrite	assertionrewriter=   pytestr   r   rl   app_modules.dbr   r   r   markr   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   <module>   sL    "
$
)
,
<
2
"
=
6
F
A
B
'
(
