o
    %h�ja  ã                   @   sæ   d dl Zd dlm  mZ d dlmZ d dlZd dl	m
Z
 d dlmZ d dlmZmZmZ d dlmZmZmZmZ ejjdd„ ƒZejjd	d
„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zejjdd„ ƒZejjdd„ ƒZ dd„ Z!dS )é    N)Ú	timedelta)Ústatus)Úget_database)Úcreate_agentÚget_agent_by_emailÚget_agent_by_id)Úhash_passwordÚverify_passwordÚcreate_access_tokenÚdecode_access_tokenc                  Ã   sÈ  �t ƒ } t| ddddd�I d H }|d }|j}d}||ƒ}|s;dt |¡t |¡t |¡t |¡d	œ }tt |¡ƒ‚d  } } }}|d
 }d}||k}|srt d|fd||f¡t |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d  } }}|d }d}||k}|s§t d|fd||f¡t |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d  } }}d}
|d }t|
|ƒ}d}||u }|süt d|fd||f¡dt	 
¡ v sÕt t¡rÚt t¡ndt |
¡t |¡t |¡t |¡dœ }dd|i }tt |¡ƒ‚d  }
 } } }}d}
|d }t|
|ƒ}d}||u }|�sXt d|fd||f¡dt	 
¡ v �s1t t¡�r6t t¡ndt |
¡t |¡t |¡t |¡dœ }dd|i }tt |¡ƒ‚d  }
 } } }}d S )Nzagent.test@example.comzSecretPassword123!z
Test AgentÚAGENT©ÚemailÚpasswordÚnameÚroleÚagentIdÚagent_zLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})Úpy1Úpy3Úpy5Úpy7r   ©ú==©z%(py1)s == %(py4)s©r   Úpy4úassert %(py6)sÚpy6ÚpasswordHash©ú!=©z%(py1)s != %(py4)sT)Úis)z9%(py6)s
{%(py6)s = %(py0)s(%(py2)s, %(py4)s)
} is %(py9)sr	   )Úpy0Úpy2r   r   Úpy9zassert %(py11)sÚpy11ÚWrongPasswordF)r   r   Ú
startswithÚ
@pytest_arÚ	_safereprÚAssertionErrorÚ_format_explanationÚ_call_reprcomparer	   Ú@py_builtinsÚlocalsÚ_should_repr_global_name)ÚdbÚagentÚ@py_assert0Ú@py_assert2Ú@py_assert4Ú@py_assert6Ú@py_format8Ú@py_assert3Ú@py_format5Ú@py_format7Ú@py_assert1Ú@py_assert5Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12© rB   ú0/web/html/dev/chatbot/backend/tests/test_auth.pyÚ(test_agent_creation_and_password_hashing   s   €ûfjj²¼rD   c                 Ã   s†  �t ƒ }t|ddddd�I d H  | jddddœd�}|j}tj}||k}|skt d	|fd
||f¡dt 	¡ v s;t 
|¡r@t |¡ndt |¡dt 	¡ v sPt 
t¡rUt t¡nd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 }	d}|	|k}
|
sàt d	|
fd|	|f¡t |	¡t |¡dœ }dd|i }tt |¡ƒ‚d  }	 }
}|d d }	d}|	|k}
|
�st d	|
fd|	|f¡t |	¡t |¡dœ }dd|i }tt |¡ƒ‚d  }	 }
}|d d }	d}|	|k}
|
�sPt d	|
fd|	|f¡t |	¡t |¡dœ }dd|i }tt |¡ƒ‚d  }	 }
}d }	|d }|	|v}
|
�s†t d!|
fd"|	|f¡t |	¡t |¡dœ }dd|i }tt |¡ƒ‚d  }	 }
}t|d ƒ}d }
||
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 d( }|	|k}
|
�st d	|
fd|	|f¡t |	¡t |¡dœ }dd|i }tt |¡ƒ‚d  }	 }
}|d }	d}|	|k}
|
�s;t d	|
fd|	|f¡t |	¡t |¡dœ }dd|i }tt |¡ƒ‚d  }	 }
}d S ))Núlogin.agent@example.comzValidPassword123!zLogin AgentÚADMINr   ú/api/v1/auth/login©r   r   ©Újsonr   ©zT%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py6)s
{%(py6)s = %(py4)s.HTTP_200_OK
}Ú	login_resr   ©r$   r%   r   r   úassert %(py8)sÚpy8ÚaccessToken)Úin)z%(py1)s in %(py3)sÚdata)r   r   zassert %(py5)sr   Ú	tokenTypeÚbearerr   r   r   r   r3   r   r   r   )únot in)z%(py1)s not in %(py4)s)úis not)z%(py0)s is not %(py3)sÚpayload)r$   r   Úsubr   )r   r   ÚpostÚstatus_coder   ÚHTTP_200_OKr*   r.   r/   r0   r1   r+   r,   r-   rJ   r   )Úclientr2   rL   r<   r=   r9   r;   Ú@py_format9rR   r4   r5   Ú@py_format4Ú@py_format6r:   rW   rB   rB   rC   Útest_successful_agent_login   s0   €û
þ®xjppl~tpr`   c           
      C   sH  | j ddddœd� | j dddd	œd�}|j}tj}||k}|set d
|fd||f¡dt ¡ v s5t |¡r:t 	|¡ndt 	|¡dt ¡ v sJt t¡rOt 	t¡ndt 	|¡dœ }dd|i }t
t |¡ƒ‚d  } }}| ¡ d }d}||k}|sœt d
|fd||f¡t 	|¡t 	|¡dœ }	dd|	i }t
t |¡ƒ‚d  } }}d S )Nz/api/v1/tenant/registerzshop.comÚStore)Údomainr   rI   rG   rE   zWrongPassword!rH   r   ©z^%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py6)s
{%(py6)s = %(py4)s.HTTP_401_UNAUTHORIZED
}rL   r   rM   rN   rO   ÚdetailúInvalid email or passwordr   r   r   r   ©rY   rZ   r   ÚHTTP_401_UNAUTHORIZEDr*   r.   r/   r0   r1   r+   r,   r-   rJ   ©
r\   rL   r<   r=   r9   r;   r]   r4   r5   r:   rB   rB   rC   Ú'test_login_invalid_password_returns_401<   s   
þ®rri   c           
      C   s4  | j ddddœd�}|j}tj}||k}|s[t d|fd||f¡dt ¡ v s+t |¡r0t 	|¡ndt 	|¡d	t ¡ v s@t t¡rEt 	t¡nd	t 	|¡d
œ }dd|i }t
t |¡ƒ‚d  } }}| ¡ d }d}||k}|s’t d|fd||f¡t 	|¡t 	|¡dœ }	dd|	i }t
t |¡ƒ‚d  } }}d S )NrG   znonexistent.agent@example.comzPassword123!rH   rI   r   rc   rL   r   rM   rN   rO   rd   re   r   r   r   r   rf   rh   rB   rB   rC   Ú$test_login_unknown_email_returns_401G   s   
þ®rrj   c                 C   s¼   |   d¡}|j}tj}||k}|sVt d|fd||f¡dt ¡ v s&t |¡r+t 	|¡ndt 	|¡dt ¡ v s;t t¡r@t 	t¡ndt 	|¡dœ }dd|i }t
t |¡ƒ‚d  } }}d S )	Nú/api/v1/auth/mer   rc   Úresr   rM   rN   rO   ©ÚgetrZ   r   rg   r*   r.   r/   r0   r1   r+   r,   r-   )r\   rl   r<   r=   r9   r;   r]   rB   rB   rC   Ú-test_protected_endpoint_rejects_missing_tokenP   s   
²ro   c                 C   sÈ   ddi}| j d|d�}|j}tj}||k}|s\t d|fd||f¡dt ¡ v s,t |¡r1t 	|¡ndt 	|¡dt ¡ v sAt t¡rFt 	t¡ndt 	|¡d	œ }d
d|i }t
t |¡ƒ‚d  } }}d S )NÚAuthorizationzBearer invalid_garbage_tokenrk   ©Úheadersr   rc   rl   r   rM   rN   rO   rm   )r\   rr   rl   r<   r=   r9   r;   r]   rB   rB   rC   Ú-test_protected_endpoint_rejects_invalid_tokenT   s   ²rs   c           	      C   sæ   t dddœtdd�d�}dd|› �i}| jd	|d
�}|j}tj}||k}|skt d|fd||f¡dt 	¡ v s;t 
|¡r@t |¡ndt |¡dt 	¡ v sPt 
t¡rUt t¡ndt |¡dœ }dd|i }tt |¡ƒ‚d  } }}d S )NÚagent_test_999r   ©rX   r   iöÿÿÿ)Úseconds)rR   Úexpires_deltarp   úBearer rk   rq   r   rc   rl   r   rM   rN   rO   )r
   r   rn   rZ   r   rg   r*   r.   r/   r0   r1   r+   r,   r-   )	r\   Úexpired_tokenrr   rl   r<   r=   r9   r;   r]   rB   rB   rC   Ú-test_protected_endpoint_rejects_expired_tokenY   s   þ²rz   c                 Ã   sL  �t ƒ }t|ddddd�I d H }t|d ddœƒ}dd	|› �i}| jd
|d�}|j}tj}||k}|sxt d|fd||f¡dt	 
¡ v sHt |¡rMt |¡ndt |¡dt	 
¡ v s]t t¡rbt t¡ndt |¡dœ }	dd|	i }
tt |
¡ƒ‚d  } }}| ¡ }|d }|d }||k}|s³t d|fd||f¡t |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d  } }}|d }d}||k}|sèt d|fd||f¡t |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d  } }}|d }d}||k}|�st d|fd||f¡t |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d  } }}d S )Nzme.agent@example.comzMyPassword123!zMe Agentr   r   r   ru   rp   rx   rk   rq   r   rK   rl   r   rM   rN   rO   r   r   r   r   r   r   ©r   r   r
   rn   rZ   r   r[   r*   r.   r/   r0   r1   r+   r,   r-   rJ   )r\   r2   r3   Útokenrr   rl   r<   r=   r9   r;   r]   Úprofiler4   r5   r:   rB   rB   rC   Ú+test_protected_endpoint_accepts_valid_tokenb   s"   €û®njpr~   c                 Ã   sø  �t ƒ }t|dddd�I d H }t|dddd�I d H }t|d dd	œƒ}d
d|› �i}| jd|d�}|j}tj}||k}	|	s‚t d|	fd||f¡dt	 
¡ v sRt |¡rWt |¡ndt |¡dt	 
¡ v sgt t¡rlt t¡ndt |¡dœ }
dd|
i }tt |¡ƒ‚d  } }	}| ¡ d }|d }	||	k}|s»t d|fd||	f¡t |¡t |	¡dœ }dd|i }
tt |
¡ƒ‚d  } }}	| ¡ d }|d }	||	k}|sôt d|fd||	f¡t |¡t |	¡dœ }dd|i }
tt |
¡ƒ‚d  } }}	d S )Nzagent.a@example.comzPass123!zAgent A)r   r   r   zagent.b@example.comzAgent Br   r   ru   rp   rx   rk   rq   r   rK   rl   r   rM   rN   rO   r   r   r   r   r    r"   r{   )r\   r2   Úagent_aÚagent_bÚtoken_arr   rl   r<   r=   r9   r;   r]   r4   r5   r:   rB   rB   rC   Ú0test_authenticated_identity_comes_from_jwt_tokenw   s   €®rvr‚   c                 C   st   ddl m} | jddd� | jddd� | jddd� tjtdd	�� |d
d� W d   ƒ d S 1 s3w   Y  d S )Nr   )ÚSettingsÚPYTEST_CURRENT_TESTF)ÚraisingÚENVÚ
JWT_SECRETz3JWT_SECRET environment variable is missing or empty)ÚmatchÚ )Ú
jwt_secret)Ú
app.configrƒ   ÚdelenvÚpytestÚraisesÚ
ValueError)Úmonkeypatchrƒ   rB   rB   rC   Ú(test_jwt_secret_configuration_validation‡   s   "ÿr‘   )"Úbuiltinsr/   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter*   Údatetimer   r�   Úfastapir   Úapp.databaser   Ú!app.repositories.agent_repositoryr   r   r   Úapp.utils.securityr   r	   r
   r   ÚmarkÚanyiorD   r`   ri   rj   ro   rs   rz   r~   r‚   r‘   rB   rB   rB   rC   Ú<module>   s(   & 

		

