
    i>                    &   d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZmZmZ ddlZddlZddlmZ ddlmZmZ ddlmZ ej0                  d        Zej0                  d	        Zej0                  d
        Zej6                  j                  d        Zej6                  j                  d        Zej6                  j                  d        Zej6                  j                  d        Zej6                  j                  d        Z ej6                  j                  d        Z!ej6                  j                  d        Z"ej6                  j                  d        Z#ej6                  j                  d        Z$ej6                  j                  d        Z%y)z>Test dashboard confirmation integration in OrchestratorServer.    )annotationsN)	AsyncMock	MagicMockpatch)WebSocketServerProtocol)OrchestratorServerServerConfig)OrchestratorStatec                     t        dd      S )z!Create test server configuration.	localhostr   )hostport)r	        U/home/nelsen/Projects/kognitive/orchestrator/src/tests/test_dashboard_confirmation.pyserver_configr      s     [q11r   c                    t        |       S )z Create test orchestrator server.)r   )r   s    r   serverr      s     m,,r   c                 R    t        t              } d| _        t               | _        | S )z!Create mock WebSocket connection.spec)z	127.0.0.1i90  )r   r   remote_addressr   send)wss    r   mock_websocketr      s%     
/	0B,BkBGIr   c                "  K   | j                   j                  |       | j                   }||v }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nd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}}yw)	z:Test that dashboard clients are tracked when they connect.in)z:%(py0)s in %(py4)s
{%(py4)s = %(py2)s._dashboard_clients
}r   r   py0py2py4assert %(py6)spy6N)
_dashboard_clientsadd
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)r   r   @py_assert3@py_assert1@py_format5@py_format7s         r   )test_dashboard_client_added_on_connectionr3   &   s      !!.1#666>66666>6666666>666>666666V666V66666666666s   DDc                H  K   ddl m} ddl}| j                  j	                  |       dddddd	id
gd} ||j                         t
        j                  dt
        j                  d|i      }| j                  |       d{    |j                  j                          t        j                  |j                  j                  d   d         }|d   }d}||k(  }	|	slt        j                  d|	fd||f      t        j                   |      t        j                   |      dz  }
dd|
iz  }t#        t        j$                  |            dx}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}}	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}}	y7 w)zCTest that confirmation requests are broadcast to dashboard clients.r   TransitionRecordNtest_plan_123znavigate to waypoint As1NAVIGATEdestination
waypoint_A)step_idactionparams)plan_idintentstepsllm_responseplan	timestamppreviouseventnextpayloadtypeuser_confirmation==z%(py1)s == %(py4)spy1r"   r#   r$   )z%(py1)s == %(py3)srP   py3assert %(py5)spy5rE   r   z%(py1)s in %(py3)ssent_message)state_machiner6   timer%   r&   r
   
PROCESSINGAWAITING_CONFIRM_broadcast_confirmation_requestr   assert_called_oncejsonloads	call_argsr'   r(   r,   r-   r.   r)   r*   r+   )r   r   r6   rX   rC   recordrV   @py_assert0r/   @py_assert2r1   r2   @py_format4@py_format6s                 r   #test_broadcast_confirmation_requestre   .   s     / !!.1 #*  $(,7

D ))+"--//F 
0
0
888 **,::n11;;A>qABL6#66#66666#6666666#66666666'4''''4'''''''''4'''4'''''''&;,&&&&;,&&&;&&&&&&,&&&,&&&&&&& 9s   B J"JHJ"c                   K   ddl m} ddl}dg d} ||j                         t        j                  dt        j
                  d|i      }| j                  |       d{    y7 w)	zMTest that confirmation request is logged when no dashboard clients connected.r   r5   N	test_planr?   rA   rB   rC   rD   )rW   r6   rX   r
   rY   rZ   r[   )r   r6   rX   rC   r`   s        r   .test_dashboard_confirmation_request_no_clientsri   V   s_      / #R0D))+"--//F 
0
0
888s   AA'A% A'c                8  K   | j                   j                  d       | j                   j                  dddi       | j                   j                  ddddii       | j                   }|j                  }t        j                  }||k(  }|s
t        j                  d|fd	||f      d
t        j                         v st        j                  |       rt        j                  |       nd
t        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}dg d}t        j                  d|d      }| j                  |       d{   }	|	d   }
d}|
|k(  }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}|	d   }
d}|
|k(  }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}| j                   }|j                  }t        j                   }||k(  }|s
t        j                  d|fd||f      d
t        j                         v st        j                  |       rt        j                  |       nd
t        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}y7 Hw)z:Test that dashboard user_confirmed message advances state.wake_word_detectedfinal_transcripttexttestrB   rC   r?   rL   zv%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.state_machine
}.state
} == %(py8)s
{%(py8)s = %(py6)s.AWAITING_CONFIRM
}r   r
   r    r!   r"   r$   py8assert %(py10)spy10Nrg   rh   user_confirmed)rJ   rC   rJ   state_updaterN   rO   r#   r$   rG   )zw%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.state_machine
}.state
} == %(py8)s
{%(py8)s = %(py6)s.EXECUTING_ACTIONS
})rW   handle_eventstater
   rZ   r'   r(   r)   r*   r+   r,   r-   r.   r]   dumps_handle_dashboard_messageEXECUTING_ACTIONS)r   r0   r/   @py_assert7@py_assert5@py_format9@py_format11rC   messageresponsera   rb   r1   r2   s                 r   %test_dashboard_message_user_confirmedr   j   s     %%&:;
%%&866:JK
%%nv	6?R6ST K%%K):)K)KK%)KKKKK%)KKKKKKK6KKK6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0Djj"2DABG55g>>HF-~-~----~------~-------G0 00 00000 0000000 00000000L%%L):)L)LL%)LLLLL%)LLLLLLL6LLL6LLLLLL%LLLLLL):LLL):LLL)LLLLLLLL	 ?s   GPPIPc                .  K   | j                   j                  d       | j                   j                  dddi       | j                   j                  ddddii       | j                   }|j                  }t        j                  }||k(  }|s
t        j                  d|fd	||f      d
t        j                         v st        j                  |       rt        j                  |       nd
t        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}t        j                  ddd      }| j                  |       d{   }|d   }	d}|	|k(  }
|
slt        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}|d   }	d}|	|k(  }
|
slt        j                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}| j                   }|j                  }t        j                   }||k(  }|s
t        j                  d|fd||f      d
t        j                         v st        j                  |       rt        j                  |       nd
t        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}y7 Hw)z9Test that dashboard user_rejected message advances state.rk   rl   rm   rn   rB   rC   r?   rL   ro   r   r
   rp   rr   rs   Nuser_rejectedzuser declined)rJ   reasonrJ   ru   rN   rO   r#   r$   rG   )zj%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.state_machine
}.state
} == %(py8)s
{%(py8)s = %(py6)s.IDLE
})rW   rv   rw   r
   rZ   r'   r(   r)   r*   r+   r,   r-   r.   r]   rx   ry   IDLE)r   r0   r/   r{   r|   r}   r~   r   r   ra   rb   r1   r2   s                r   $test_dashboard_message_user_rejectedr      s     %%&:;
%%&866:JK
%%nv	6?R6ST K%%K):)K)KK%)KKKKK%)KKKKKKK6KKK6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 jj/_MNG55g>>HF-~-~----~------~-------G///////////////////?%%?):)?)??%)?????%)???????6???6??????%??????):???):???)????????	 ?s   GP
PIPc                  K   t        j                  ddi      }| j                  |       d{   }|d   }d}||k(  }|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}}y7 +w)z.Test that dashboard ping message returns pong.rJ   pingNpongrL   rN   rO   r#   r$   rw   r   rU   r   rQ   rS   rT   )r]   rx   ry   r'   r(   r,   r-   r.   r)   r*   r+   )
r   r   r   ra   r/   rb   r1   r2   rc   rd   s
             r   test_dashboard_message_pingr      s      jj&&)*G55g>>HF%v%v%%%%v%%%%%%v%%%%%%%7h7h7hh ?s   ,EED+Ec                D  K   | j                  d       d{   }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t	        t        j
                  |            dx}x}}|d   }d
}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t	        t        j
                  |            dx}x}}y7 w)z%Test that invalid JSON returns error.znot jsonNrJ   errorrL   rN   rO   r#   r$   invalid_json)ry   r'   r(   r,   r-   r.   )r   r   ra   r/   rb   r1   r2   s          r   #test_dashboard_message_invalid_jsonr      s      55jAAHF&w&w&&&&w&&&&&&w&&&&&&&G................... Bs   D DDD c                r  K   t        j                  ddi      }| j                  |       d{   }|d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd	|iz  }t        t        j                  |            dx}x}}|d   }d
}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd	|iz  }t        t        j                  |            dx}x}}y7 w)z-Test that unknown message type returns error.rJ   unknown_typeNr   rL   rN   rO   r#   r$   unknown_message)r]   rx   ry   r'   r(   r,   r-   r.   )r   r   r   ra   r/   rb   r1   r2   s           r   #test_dashboard_message_unknown_typer      s      jj&.12G55g>>HF&w&w&&&&w&&&&&&w&&&&&&&G1 11 11111 1111111 11111111 ?s   ,D7D4DD7c                  K   | j                   j                  |       t        d      |j                  _        ddlm} ddl}dg d} ||j                         t        j                  dt        j                  d|i	      }| j                  |       d{    | j                   }||v}|st        j                  d
|fd||f      dt        j                         v st        j                   |      rt        j"                  |      nd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}}y7 w)z5Test that disconnected dashboard clients are removed.zConnection closedr   r5   Nrn   rh   rB   rC   rD   )not in)z>%(py0)s not in %(py4)s
{%(py4)s = %(py2)s._dashboard_clients
}r   r   r   r#   r$   )r%   r&   	Exceptionr   side_effectrW   r6   rX   r
   rY   rZ   r[   r'   r(   r)   r*   r+   r,   r-   r.   )
r   r   r6   rX   rC   r`   r/   r0   r1   r2   s
             r    test_disconnected_client_removedr      s     !!.1 '00C&DN# /+D))+"--//F 
0
0
888 "(!:!::>!:::::>!:::::::>:::>::::::::::::!:::::::: 9s   BFF
C6Fc                D  K   ddl m} t        t              }t	               |_        | j                  j                  |       dg d}| j                   j                  d       | j                   j                  dddi       | j                   j                  d	d
|i       t        j                  d       d{    g }| j                  }||k(  }|}|sd}|}|s8t        j                  d|fd||f      dt        j                         v st        j                   |       rt        j"                  |       ndt        j"                  |      d
t        j                         v st        j                   |      rt        j"                  |      nd
dz  }	dd|	iz  }
|j%                  |
       |s+ddt        j"                        iz  }|j%                  |       t        j&                  |d      i z  }dd|iz  }t)        t        j*                  |            dx}x}x}x}}y7 fw)z?Test that confirmation listener is registered on state machine.r   r5   r   rn   rh   rk   rl   rm   rB   rC   g?NTrL   )z5%(py4)s
{%(py4)s = %(py2)s._pending_plan
} == %(py6)sr   )r!   r"   r$   z%(py8)srq   z%(py11)spy11   zassert %(py14)spy14)rW   r6   r   r   r   r   r%   r&   rv   asynciosleep_pending_planr'   r(   r)   r*   r+   r,   append_format_boolopr-   r.   )r   r6   mock_wsrC   r0   r/   r|   ra   @py_assert10r2   r}   @py_format12@py_format13@py_format15s                 r   %test_confirmation_listener_registeredr      s]    
 / 45G;GL
!!'* +D
%%&:;
%%&866:JK
%%nvtnE --
 06/4'/4/4///4//////6///6/////////4///4///////4/////////////	 s   B5H 7H8E&H )&__doc__
__future__r   builtinsr)   _pytest.assertion.rewrite	assertionrewriter'   r   r]   unittest.mockr   r   r   pytest
websocketswebsockets.serverr   r   r   r	   rW   r
   fixturer   r   markr3   re   ri   r   r   r   r   r   r   r   r   r   r   <module>r      s   D "     5 5   5 3 + 2 2
 - -
   7 7 $' $'N 9 9& M M* @ @(   / / 2 2 ; ;6 0 0r   