o
    [�jD  ã                   @   s–   d Z ddlZddlm  mZ ddlZddlZddl	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZmZmZmZmZ ddlmZmZ d	d
„ ZdS )zMDiagnostic test: trace active_sessions through Start New Chat -> Accept flow.é    N)Ústatus)Úget_database)Úcreate_session)Úget_or_create_conversation)Úactive_sessionsÚadd_active_sessionÚremove_active_sessionÚnotify_visitor_socketÚupdate_active_session_status)Ú	AsyncMockÚpatchc                  C   s�  dt  ¡ jdd… › d�}| jd|ddœd�}| ¡ d	 }d
d|› �i}| jdd	|i|d�}| ¡ d }|  d|› �¡��€}tdƒ t |¡}td|tv › �ƒ td|rY| d¡nd› �ƒ td|ri| d¡du nd› �ƒ td|ryt	| d¡ƒn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}||k}	|	sét
 d|	fd ||f¡t
 |¡t
 |¡d!œ }d"d#|i }tt
 |¡ƒ‚d } }	}|d }d}||u}	|	�st
 d|	fd$||f¡t
 |¡t
 |¡d!œ }d"d#|i }tt
 |¡ƒ‚d } }	}| jd%d|id�}|j}
tj}|
|k}|�s„t
 d|fd&|
|f¡d't ¡ v �sRt
 |¡�rWt
 |¡nd't
 |
¡dt ¡ v �sit
 t¡�rnt
 t¡ndt
 |¡d(œ }d)d*|i }tt
 |¡ƒ‚d }
 }}td+ƒ t |¡}td|�r�| d¡nd› �ƒ td|�r®| d¡du nd› �ƒ |d }d,}||k}	|	�sãt
 d|	fd ||f¡t
 |¡t
 |¡d!œ }d"d#|i }tt
 |¡ƒ‚d } }	}|d }d}||u}	|	�st
 d|	fd$||f¡t
 |¡t
 |¡d!œ }d"d#|i }tt
 |¡ƒ‚d } }	}| ¡ }td-|› �ƒ |d. }d/}||k}	|	�sZt
 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 } }	}| jd0|d1d2œd�}|j}
tj}|
|k}|�söt
 d|fd&|
|f¡d3t ¡ v �sÄt
 |¡�rÉt
 |¡nd3t
 |
¡dt ¡ v �sÛt
 t¡�ràt
 t¡ndt
 |¡d(œ }d)d*|i }tt
 |¡ƒ‚d }
 }}td4ƒ t |¡}td|tv › �ƒ td|�r| d¡nd› �ƒ td|�r)| d¡du nd› �ƒ d}	||	u}
|
�snt
 d|
fd||	f¡dt ¡ v �sNt
 |¡�rSt
 |¡ndt
 |	¡dœ }t
 d5¡d6 d|i }tt
 |¡ƒ‚d }
}	|d }d7}||k}	|	�s¢t
 d|	fd ||f¡t
 |¡t
 |¡d!œ }d"d#|i }tt
 |¡ƒ‚d } }	}|d }d}||u}	|	�sÝt
 d|	fd$||f¡t
 |¡t
 |¡d!œ }t
 d8¡d9 d#|i }tt
 |¡ƒ‚d } }	}| ¡ }td-|› �ƒ |d. }d/}||k}	|	�st
 d|	fd ||f¡t
 |¡t
 |¡d!œ }d"d#|i }tt
 |¡ƒ‚d } }	}|d }d7}||k}	|	�sTt
 d|	fd ||f¡t
 |¡t
 |¡d!œ }d"d#|i }tt
 |¡ƒ‚d } }	}|  d:|› d;�¡}td<ƒ td=|j› �ƒ td>| ¡ › �ƒ |j}
tj}|
|k}|�sÎt
 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@ }t |¡}td|tv › �ƒ td|�rô| d¡nd› �ƒ td|�r| d¡du nd› �ƒ td|�rt	| d¡ƒnd› �ƒ d}	||	u}
|
�s[t
 d|
fd||	f¡dt ¡ v �s;t
 |¡�r@t
 |¡ndt
 |	¡dœ }t
 dA¡d6 d|i }tt
 |¡ƒ‚d }
}	|d }d}||k}	|	�s�t
 d|	fd ||f¡t
 |¡t
 |¡d!œ }d"d#|i }tt
 |¡ƒ‚d } }	}| d¡}tdB|› �ƒ d}	||	u}
|
�sát
 d|
fd||	f¡dCt ¡ v �sÁt
 |¡�rÆt
 |¡ndCt
 |	¡dœ }t
 dD¡d6 d|i }tt
 |¡ƒ‚d }
}	| ¡ }tdE|› �ƒ |d. }d/}||k}	|	�s t
 d|	fd ||f¡t
 |¡t
 |¡d!œ }d"d#|i }tt
 |¡ƒ‚d } }	}|d }d}||k}	|	�sVt
 d|	fd ||f¡t
 |¡t
 |¡d!œ }d"d#|i }tt
 |¡ƒ‚d } }	}tdFƒ t |¡}tdG|�ro| d¡nd› �ƒ tdH|�r€| d¡du nd› �ƒ | jd%d|id�}tdI|j› �ƒ tdJ| ¡ › �ƒ |jtjk�rGt |¡}tdK|�rµ| d¡nd› �ƒ tdL|�rÆ| d¡du nd› �ƒ | ¡ }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 } }	}tdMƒ nf|jtjk�rxtdN| ¡ › �ƒ tdOƒ dP}|�sut
 dQ¡dR dSt
 |¡i }tt
 |¡ƒ‚d}n=tdT|j› dU| ¡ › �ƒ dP}|�s£t
 dV|j› �¡dR dSt
 |¡i }tt
 |¡ƒ‚d}W d  ƒ dS W d  ƒ dS W d  ƒ dS 1 �sÁw   Y  dS )Wz¤
    Full end-to-end: init -> ws connect -> accept -> end -> start-new-chat -> accept again.
    Traces whether the websocket reference is valid at every step.
    zdiag-Né   z.comz/api/v1/tenant/registerzDiagnostic Test Store)ÚdomainÚname)ÚjsonÚsiteIdÚOriginzhttp://z/api/v1/session/init)r   ÚheadersÚ	sessionIdz/ws/session/z
[DIAG-1] After WS connect:z  in active_sessions: z
  status: r   zN/Az  websocket is None: Ú	websocketz  websocket type: )úis not)z%(py0)s is not %(py3)sÚmem)Úpy0Úpy3zassert %(py5)sÚpy5ÚRINGING)ú==)z%(py1)s == %(py4)s)Úpy1Úpy4zassert %(py6)sÚpy6)z%(py1)s is not %(py4)sz/api/v1/handoff/accept)zT%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py6)s
{%(py6)s = %(py4)s.HTTP_200_OK
}Úaccept1)r   Úpy2r   r   zassert %(py8)sÚpy8z
[DIAG-2] After first accept:ÚIN_CHATz  visitor received event: ÚtypeÚstatus_changedz/api/v1/handoff/endÚagent)r   ÚendedByÚend_respz
[DIAG-3] After end chat:z7active_sessions entry should still exist after end chatz
>assert %(py5)sÚENDEDz,websocket should be preserved after end chatz
>assert %(py6)sz/api/v1/session/z/new-conversationz
[DIAG-4] After Start New Chat:z  response status: z  response body: Únew_conv_respÚconversationIdz9active_sessions entry should exist after new-conversationz  websocket ref: Úws_after_new_convz3CRITICAL: websocket is None after new-conversation!z"  visitor received RINGING event: z-
[DIAG-5] About to accept new conversation...z  pre-accept status: z   pre-accept websocket is None: z  accept response status: z  accept response body: z  post-accept status: z!  post-accept websocket is None: zP
[DIAG-RESULT] SUCCESS - visitor received IN_CHAT after new-conversation accept!z7
[DIAG-RESULT] FAILURE - accept returned 409 CONFLICT: z-  This means claim_session_atomically failed!Fz5Accept returned 409 - claim_session_atomically failedz
>assert %(py1)sr   z,
[DIAG-RESULT] UNEXPECTED - accept returned z: zUnexpected accept status: )ÚuuidÚuuid4ÚhexÚpostr   Úwebsocket_connectÚprintr   Úgetr$   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚstatus_coder   ÚHTTP_200_OKÚreceive_jsonÚ_format_assertmsgÚHTTP_409_CONFLICT) Úclientr   Úreg_respÚsite_idr   Ú	init_respÚ
session_idÚwsr   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6Ú@py_assert0Ú@py_assert3Ú@py_format5Ú@py_format7r    Ú@py_assert5Ú@py_format9Úev1r(   Úev2r*   Únew_conv_dataÚnew_conv_idr,   Úev3Úmem_before_accept2Úaccept2Úev4Ú@py_format2© rZ   ú9/web/html/dev/chatbot/backend/tests/test_diag_new_conv.pyÚ,test_new_conversation_accept_websocket_trace   sº   
þ
  xjl¸
"llll¸
"ˆlvll¸
""ˆl
ˆll
"
"ll
:B�\¤`$ r\   )Ú__doc__Úbuiltinsr6   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter4   r-   ÚpytestÚfastapir   Úapp.databaser   Ú#app.repositories.session_repositoryr   Ú(app.repositories.conversation_repositoryr   Úapp.services.presencer   r   r   r	   r
   Úunittest.mockr   r   r\   rZ   rZ   rZ   r[   Ú<module>   s    "