o
    @•jÕ  ã                   @   s  d dl Zd dlm  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mZmZmZ d dlmZmZmZmZmZmZ d dlmZ d dlm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 )é    N)Ústatus)Ú	AsyncMock)Úactive_sessionsÚadd_active_sessionÚremove_active_sessionÚconnected_agentsÚadd_agent_connectionÚremove_agent_connection)Úactive_callsÚget_call_stateÚset_call_stateÚhandle_visitor_signalingÚhandle_agent_signalingÚterminate_video_call)Úget_database)Úcreate_sessionc                 Ã   sÄ  �t ƒ }t|dd�I d H }|d }tƒ }tƒ }t|d|ddd� td|d� dd	d
œ}t|d|dœƒI d H  t|ƒ}d}||k}	|	s‡t d|	fd||f¡dt	 
¡ v sWt t¡r\t t¡nddt	 
¡ v sht |¡rmt |¡ndt |¡t |¡dœ }
dd|
i }tt |¡ƒ‚d  } }	}|j ¡  |jjd d }dd l}| |¡}|d }d}||k}|sÒt d|fd||f¡t |¡t |¡dœ }dd|i }
tt |
¡ƒ‚d  } }}|d }||k}|�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 }|d }||k}|�sLt d|fd||f¡t |¡t |¡dœ }dd|i }
tt |
¡ƒ‚d  } }}t|ƒ tdƒ t |d ¡ d S ) NÚsite_demo_123©Úsite_idÚ	sessionIdÚIN_CHATÚagent_alpha©Ú
session_idr   Ú	websocketÚ
status_valÚassigned_agent_id©Úagent_idr   Úofferz5v=0
o=visitor 12345 2 IN IP4 127.0.0.1
s=-
t=0 0
©ÚtypeÚsdpÚvideo_call_requested©r!   r   ÚCALL_REQUESTED©ú==©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   Úsid©Úpy0Úpy1Úpy3Úpy6úassert %(py8)sÚpy8r   r!   ©z%(py1)s == %(py4)s©r,   Úpy4úassert %(py6)sr.   ©z%(py1)s == %(py3)s©r,   r-   úassert %(py5)sÚpy5r"   )r   r   r   r   r   r   r   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚ	send_textÚassert_called_onceÚ	call_argsÚjsonÚloadsr   r	   r
   Úpop)ÚclientÚdbÚsessr)   Úmock_visitor_wsÚmock_agent_wsÚ	offer_sdpÚ@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9Úsent_to_agentrD   ÚparsedÚ@py_assert0Ú@py_assert3Ú@py_format5Ú@py_format4Ú@py_format6© rY   ú;/web/html/dev/chatbot/backend/tests/test_video_signaling.pyÚ4test_visitor_initiates_call_routed_to_assigned_agent	   s<   €û
þ®

j€tr[   c                 Ã   sÐ  �t ƒ }t|dd�I d H }|d }tƒ }tƒ }t|d|ddd� td|d� t|ddƒ d	d
dœ}tdd||dœƒI d H  t|ƒ}d}||k}	|	sŽt 	d|	fd||f¡dt
 ¡ v s^t t¡rct t¡nddt
 ¡ v sot |¡rtt |¡ndt |¡t |¡dœ }
dd|
i }tt |¡ƒ‚d  } }	}|j ¡  dd l}| |jjd d ¡}|d }d}||k}|s×t 	d|fd||f¡t |¡t |¡dœ }dd|i }
tt |
¡ƒ‚d  } }}|d }||k}|�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  }|d  }||k}|�sRt 	d|fd||f¡t |¡t |¡dœ }dd|i }
tt |
¡ƒ‚d  } }}t|ƒ tdƒ t |d ¡ d S )!Nr   r   r   r   r   r   r   r%   Úanswerz3v=0
o=agent 54321 2 IN IP4 127.0.0.1
s=-
t=0 0
r    Úwebrtc_answer©r!   r   r\   ÚACCEPTEDr&   r(   r   r)   r*   r/   r0   r   r!   r1   r2   r4   r.   r5   r6   r7   r8   r"   )r   r   r   r   r   r   r   r   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rD   rE   rC   r   r	   r
   rF   )rG   rH   rI   r)   rJ   rK   Ú
answer_sdprM   rN   rO   rP   rQ   rD   rS   rT   rU   rV   rW   rX   rY   rY   rZ   Ú)test_agent_accepts_call_routed_to_visitor4   s>   €û
ý®
j‚tra   c                 Ã   sž  �t ƒ }t|dd�I d H }|d }tƒ }tƒ }t|d|ddd� td|d� dd	d
œ}t|d|dœƒI d H  |j ¡  dd l}| 	|jj
d d ¡}|d }	d}
|	|
k}|syt 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
œ}tdd||dœƒI d H  |j ¡  | 	|jj
d 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  }	 }}
t|ƒ tdƒ d S )Nr   r   r   r   r   r   r   z9candidate:1 1 UDP 2122260223 192.168.1.100 54321 typ hostÚ0)Ú	candidateÚsdpMidÚwebrtc_ice_candidate)r!   rc   r   r!   r&   r1   r2   r4   r.   rc   rd   z9candidate:2 1 UDP 2122260223 192.168.1.200 65432 typ host)r!   r   rc   )r   r   r   r   r   r   rA   rB   rD   rE   rC   r9   r:   r>   r?   r@   r   r   r	   )rG   rH   rI   r)   rJ   rK   Úcandidate_visitorrD   Úparsed_agentrT   rU   rM   rV   rP   Úcandidate_agentÚparsed_visitorrY   rY   rZ   Ú(test_bidirectional_ice_candidate_routing]   sH   €û
þ
jn
ý
lprj   c                 Ã   s  �t ƒ }t|dd�I d H }|d }tƒ }t|d|ddd� t|ddƒ tdd|d	d
œƒI d H  t|ƒ}d}||k}|s€t d|fd||f¡dt	 
¡ v sPt t¡rUt t¡nddt	 
¡ v sat |¡rft |¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d  } }}|j ¡  dd l}
|
 |jj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  } }}t|ƒ d S )Nr   r   r   r   r   ©r   r   r%   Úvideo_call_rejectedzAgent is currently busy)r!   r   ÚreasonÚIDLEr&   r(   r   r)   r*   r/   r0   r   r!   r1   r2   r4   r.   rm   )r   r   r   r   r   r   r   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rD   rE   rC   r   )rG   rH   rI   r)   rJ   rM   rN   rO   rP   rQ   rD   rS   rT   rU   rV   rY   rY   rZ   Útest_agent_rejects_callŠ   s&   €ý®
jjro   c           
      Ã   s  �t ƒ }t|dd�I d H }|d }tƒ }t|d|ddd� tdd|d	d
dœdœƒI d H  |j ¡  t|ƒ}d}||k}|s‚t 	d|fd||f¡dt
 ¡ v sRt t¡rWt t¡nddt
 ¡ v sct |¡rht |¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d  } }}t|ƒ d S )Nr   r   r   r   r   rk   Úagent_roguer]   r\   Úfaker    r^   rn   r&   r(   r   r)   r*   r/   r0   )r   r   r   r   r   rA   Úassert_not_calledr   r9   r:   r;   r<   r=   r>   r?   r@   r   )
rG   rH   rI   r)   rJ   rM   rN   rO   rP   rQ   rY   rY   rZ   Ú#test_unassigned_agent_cannot_signal£   s   €ý
®rs   c                 Ã   sò   �t ƒ }t|dd�I d H }|d }tƒ }t|d|dd� t|dddd	œd
œƒI d H  |j ¡  dd l}| |jj	d d ¡}|d }d}||k}	|	smt
 d|	fd||f¡t
 |¡t
 |¡dœ }
dd|
i }tt
 |¡ƒ‚d  } }	}t|ƒ d S )Nr   r   r   ÚRINGING)r   r#   r   rq   r    r$   r   r!   rl   r&   r1   r2   r4   r.   )r   r   r   r   r   rA   rB   rD   rE   rC   r9   r:   r>   r?   r@   r   )rG   rH   rI   r)   rJ   rD   rS   rT   rU   rM   rV   rP   rY   rY   rZ   Ú.test_visitor_call_request_fails_if_not_in_chat¹   s   €þ
jru   c                 Ã   sÚ  �t ƒ }t|dd�I d H }|d }tƒ }tƒ }t|d|ddd� td|ƒ t|ddƒ | jd|d	d
œd�}|j}tj	}||k}	|	s†t
 d|	fd||f¡dt ¡ v sVt
 |¡r[t
 |¡ndt
 |¡dt ¡ v skt
 t¡rpt
 t¡ndt
 |¡dœ }
dd|
i }tt
 |¡ƒ‚d  } }	}t|ƒ}d}||k}|sÝt
 d|fd||f¡dt ¡ v s­t
 t¡r²t
 t¡nddt ¡ v s¾t
 |¡rÃt
 |¡ndt
 |¡t
 |¡dœ }
dd|
i }tt
 |¡ƒ‚d  } }}t|ƒ tdƒ d S )Nr   r   r   r   r   rk   Ú	CONNECTEDz/api/v1/handoff/endÚagent)r   ÚendedBy)rD   r&   )zT%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py6)s
{%(py6)s = %(py4)s.HTTP_200_OK
}Úresr   )r+   Úpy2r3   r.   r/   r0   rn   r(   r   r)   r*   )r   r   r   r   r   r   ÚpostÚstatus_coder   ÚHTTP_200_OKr9   r:   r;   r<   r=   r>   r?   r@   r   r   r	   )rG   rH   rI   r)   rJ   rK   ry   Ú@py_assert1rN   rU   rP   rQ   rM   rO   rY   rY   rZ   Ú*test_chat_end_terminates_active_video_callÐ   s   €
®®r   )&Úbuiltinsr;   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter9   ÚpytestÚfastapir   Úunittest.mockr   Úapp.services.presencer   r   r   r   r   r	   Úapp.services.video_signalingr
   r   r   r   r   r   Úapp.databaser   Ú#app.repositories.session_repositoryr   ÚmarkÚanyior[   ra   rj   ro   rs   ru   r   rY   rY   rY   rZ   Ú<module>   s*   "   
*
(
,


