
    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ZddlmZ ddlmZmZmZ ddlZddlmZ  ee      j-                         j.                  d   Z ee      ej4                  vr"ej4                  j7                  d ee             ddlmZmZmZm Z  dd	l!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ejT                  d
        Z+ejT                  d        Z, G d d      Z- G d d      Z. G d d      Z/ G d d      Z0 G d d      Z1 G d d      Z2 G d d      Z3ejh                  j                   G d d             Z5ejh                  j                   G d d             Z6ejh                  j                   G d d             Z7y) z&Tests for Edge Proxy WebSocket client.    )annotationsN)Path)	AsyncMock	MagicMockpatch)ConnectionClosed   )ClientConfigConnectionErrorEdgeProxyClientEdgeProxyClientError)EdgeMessageType	ErrorCodeErrorMessage	NavStatusNavStatusMessage
RobotStateWaypointparse_edge_messagec                     t        ddd      S )z#Create a test client configuration.	localhost  F)hostport	reconnect)r
        J/home/nelsen/Projects/HRI/orchestrator/src/edge_proxy/tests/test_client.pyclient_configr   $   s      r   c                    t        |       S )zCreate a test client instance.config)r   )r   s    r   clientr#   .   s     -00r   c                      e Zd ZdZd Zd Zy)TestNavStatusMessagezTest NavStatusMessage parsing.c                ,   dddddd}t        j                  |      }|j                  }t        j                  }||k(  }|st        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                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}y)z-Test parsing basic navigation status message.
nav_statusmoving	waypoint1g      @g      $@)typestatusdestinationdistance_remainingeta_seconds==)zJ%(py2)s
{%(py2)s = %(py0)s.status
} == %(py6)s
{%(py6)s = %(py4)s.MOVING
}msgr   py0py2py4py6assert %(py8)spy8Nz3%(py2)s
{%(py2)s = %(py0)s.destination
} == %(py5)sr3   r4   py5assert %(py7)spy7)z:%(py2)s
{%(py2)s = %(py0)s.distance_remaining
} == %(py5)s)z3%(py2)s
{%(py2)s = %(py0)s.eta_seconds
} == %(py5)s)r   	from_dictr+   r   MOVING
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr,   r-   r.   selfdatar1   @py_assert1@py_assert5@py_assert3@py_format7@py_format9@py_assert4@py_format6@py_format8s              r   test_from_dict_basicz)TestNavStatusMessage.test_from_dict_basic7   s|    !&"%
 ((.-------------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,&&&&&&&&&&&&&&&&&&&&&&&&&&r   c                $   dddd}t        j                  |      }|j                  }t        j                  }||k(  }|st        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                  t              rt        j                  t              ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}y)z/Test parsing minimal navigation status message.r'   idle r*   r+   r,   r/   )zH%(py2)s
{%(py2)s = %(py0)s.status
} == %(py6)s
{%(py6)s = %(py4)s.IDLE
}r1   r   r2   r7   r8   Nr9   r:   r<   r=   is)z:%(py2)s
{%(py2)s = %(py0)s.distance_remaining
} is %(py5)s)z3%(py2)s
{%(py2)s = %(py0)s.eta_seconds
} is %(py5)s)r   r>   r+   r   IDLEr@   rA   rB   rC   rD   rE   rF   rG   r,   r-   r.   rH   s              r   test_from_dict_minimalz+TestNavStatusMessage.test_from_dict_minimalG   ss    !

 ((.++++++++++++++++++++++++++++++++++++$$$$$$$$$$$$$$$$$$$$$$$$$-------------------------&&&&&&&&&&&&&&&&&&&&&&&&&r   N)__name__
__module____qualname____doc__rS   r[   r   r   r   r%   r%   4   s    (' 'r   r%   c                      e Zd ZdZd Zd Zy)TestRobotStatezTest RobotState parsing.c                   ddddddd}t        j                  |      }|j                  }d}||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||u }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||u }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)z&Test parsing full robot state message.robot_stateU   	waypoint2FTg  eA)r*   battery_levelcurrent_locationis_charging	is_movinglast_updatedr/   z5%(py2)s
{%(py2)s = %(py0)s.battery_level
} == %(py5)sstater:   r<   r=   Nz8%(py2)s
{%(py2)s = %(py0)s.current_location
} == %(py5)srX   z3%(py2)s
{%(py2)s = %(py0)s.is_charging
} is %(py5)sz1%(py2)s
{%(py2)s = %(py0)s.is_moving
} is %(py5)s)z4%(py2)s
{%(py2)s = %(py0)s.last_updated
} == %(py5)sr   r>   rf   r@   rA   rB   rC   rD   rE   rF   rG   rg   rh   ri   rj   rI   rJ   rl   rK   rP   rM   rQ   rR   s           r   test_from_dict_fullz"TestRobotState.test_from_dict_fullY   s    " + (
 $$T*(((((((((((((((((((((((((4444444444444444444444444)))))))))))))))))))))))))&&&&&&&&&&&&&&&&&&&&&&&&&11111111111111111111111111r   c                   dddd}t        j                  |      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}y)z'Test parsing robot state with defaults.rc   d   unknownr*   rf   rg   r/   rk   rl   r:   r<   r=   Nrm   FrX   rn   ro   )z4%(py2)s
{%(py2)s = %(py0)s.last_updated
} is %(py5)srp   rq   s           r   test_from_dict_defaultsz&TestRobotState.test_from_dict_defaultsk   s    "  )

 $$T*)))))))))))))))))))))))))2222222222222222222222222)))))))))))))))))))))))))''''''''''''''''''''''''')))))))))))))))))))))))))r   N)r\   r]   r^   r_   rr   rw   r   r   r   ra   ra   V   s    "2$*r   ra   c                      e Zd ZdZd Zy)TestWaypointzTest Waypoint parsing.c                   dddddd}t        j                  |      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)z#Test parsing full waypoint message.entranceg      ?g      @gQ?floor1)namexyyawmap_idr/   )z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)swpr:   r<   r=   N)z)%(py2)s
{%(py2)s = %(py0)s.x
} == %(py5)s)z)%(py2)s
{%(py2)s = %(py0)s.y
} == %(py5)s)z+%(py2)s
{%(py2)s = %(py0)s.yaw
} == %(py5)s)z.%(py2)s
{%(py2)s = %(py0)s.map_id
} == %(py5)s)r   r>   r}   r@   rA   rB   rC   rD   rE   rF   rG   r~   r   r   r   )rI   rJ   r   rK   rP   rM   rQ   rR   s           r   rr   z TestWaypoint.test_from_dict_full~   s    
 %$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$r   N)r\   r]   r^   r_   rr   r   r   r   ry   ry   {   s
     %r   ry   c                      e Zd ZdZd Zy)TestErrorMessagezTest ErrorMessage parsing.c                   ddddd}t        j                  |      }|j                  }t        j                  }||k(  }|st        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                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}y)Test parsing error message.errorrt   zUnknown destinationzwaypoint_xyz not found)r*   codemessagedetailr/   )zY%(py2)s
{%(py2)s = %(py0)s.code
} == %(py6)s
{%(py6)s = %(py4)s.NAV_UNKNOWN_DESTINATION
}errr   r2   r7   r8   N)z/%(py2)s
{%(py2)s = %(py0)s.message
} == %(py5)sr:   r<   r=   )z.%(py2)s
{%(py2)s = %(py0)s.detail
} == %(py5)s)r   r>   r   r   NAV_UNKNOWN_DESTINATIONr@   rA   rB   rC   rD   rE   rF   rG   r   r   )rI   rJ   r   rK   rL   rM   rN   rO   rP   rQ   rR   s              r   test_from_dictzTestErrorMessage.test_from_dict   s.    ,.	
 $$T*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<333333333333333333333333355555555555555555555555555r   N)r\   r]   r^   r_   r   r   r   r   r   r      s
    $6r   r   c                  4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestParseEdgeMessagez!Test parse_edge_message function.c                   dddd}t        |      }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }t        t        j                  |            d
}|j                  }t        j                  }||k(  }|st        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                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d
x}x}}y
)z Test parsing nav_status message.r'   arrivedgoalrW   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer1   r   r3   py1r4   r5   Nr/   )zK%(py2)s
{%(py2)s = %(py0)s.status
} == %(py6)s
{%(py6)s = %(py4)s.ARRIVED
}r   r2   r7   r8   )r   r   r   rB   rC   r@   rD   rE   rF   rG   r+   r   ARRIVEDrA   	rI   rJ   r1   rM   @py_format5rK   rL   rN   rO   s	            r   test_parse_nav_statusz*TestParseEdgeMessage.test_parse_nav_status   s     !!

 !&000000000000000000000000000000000000....................................r   c                   dddd}t        |      }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }t        t        j                  |            d
}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d
x}x}}y
)z!Test parsing robot_state message.rc   Z   homerv   r   r   r1   r   r   Nr/   rk   r:   r<   r=   )r   r   r   rB   rC   r@   rD   rE   rF   rG   rf   rA   )	rI   rJ   r1   rM   r   rK   rP   rQ   rR   s	            r   test_parse_robot_statez+TestParseEdgeMessage.test_parse_robot_state   s     " &

 !&************************************&&&&&&&&&&&&&&&&&&&&&&&&&&r   c                ~   dddddddddgd	}t        |      }t        |t              }|sd
dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}d |D        }
t        |
      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            dx}
}|d   }|j                  }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}x}}|d   }|j                  }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}x}}y)z#Test parsing waypoint_list message.waypoint_listwp1      ?       @r}   r~   r   wp2      @      @r*   	waypointsr   r   r1   listr   N   r/   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr3   r   py3r6   r7   r8   c              3  <   K   | ]  }t        |t                y wN)r   r   ).0r   s     r   	<genexpr>z@TestParseEdgeMessage.test_parse_waypoint_list.<locals>.<genexpr>   s     ::::s   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allr3   r4   r5   r   )z,%(py3)s
{%(py3)s = %(py1)s.name
} == %(py6)sr   r   r6      )r   r   r   rB   rC   r@   rD   rE   rF   rG   r   rA   r   r}   )rI   rJ   r1   rM   r   @py_assert2rL   rP   rN   rO   rK   @py_assert0s               r   test_parse_waypoint_listz-TestParseEdgeMessage.test_parse_waypoint_list   s    $Ss3Ss3
 !&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$::::::::::::::::::::::##########################################r   c                   dddd}t        |      }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }t        t        j                  |            d
}|j                  }t        j                  }||k(  }|st        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                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d
x}x}}y
)r   r   r   zInternal errorr*   r   r   r   r   r1   r   r   Nr/   )zP%(py2)s
{%(py2)s = %(py0)s.code
} == %(py6)s
{%(py6)s = %(py4)s.INTERNAL_ERROR
}r   r2   r7   r8   )r   r   r   rB   rC   r@   rD   rE   rF   rG   r   r   INTERNAL_ERRORrA   r   s	            r   test_parse_errorz%TestParseEdgeMessage.test_parse_error   s     '

 !&,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,333333333333333333333333333333333333r   c                l   ddi}t        |      }d}||u }|st        j                  d|fd||f      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)
z/Test parsing unknown message type returns None.r*   unknown_typeNrX   )z%(py0)s is %(py3)sr1   r3   r   assert %(py5)sr;   )	r   r@   rA   rB   rC   rD   rE   rF   rG   )rI   rJ   r1   r   rK   @py_format4rQ   s          r   test_parse_unknown_typez,TestParseEdgeMessage.test_parse_unknown_type   s[     N
 !&r   c                    ddi}t        j                  t        d      5  t        |       ddd       y# 1 sw Y   yxY w)z4Test parsing message without type raises ValueError.r+   rU   zMissing 'type' fieldmatchN)pytestraises
ValueErrorr   )rI   rJ   s     r   test_parse_missing_typez,TestParseEdgeMessage.test_parse_missing_type   s8    &!]]:-CD 	%t$	% 	% 	%s   5>N)
r\   r]   r^   r_   r   r   r   r   r   r   r   r   r   r   r      s#    +
/
'$"
4%r   r   c                      e Zd ZdZd Zd Zy)TestNavigateCommandzTest NavigateCommand.c                   t        dd      }|j                         }|d   }t        j                  }||k(  }|st	        j
                  d|fd||f      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}}|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)z.Test converting NavigateCommand to dictionary.r   fast)r,   speedr*   r/   )z0%(py1)s == %(py5)s
{%(py5)s = %(py3)s.NAVIGATE
}r   )r   r   r;   r<   r=   Nr,   z%(py1)s == %(py4)sr   r5   assert %(py6)sr6   r   )NavigateCommandto_dictr   NAVIGATEr@   rA   rE   rB   rC   rD   rF   rG   )rI   cmdrJ   r   rP   r   rQ   rR   rM   r   rN   s              r   test_to_dictz TestNavigateCommand.test_to_dict   s    &?{{}777777777777777777777777777,,,,,,,,,,,,,,,,&&&&&&&&&&&&&&&&&r   c                <   t        d      }|j                         }|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
)z3Test converting NavigateCommand with default speed.r   )r,   r   normalr/   r   r   r   r6   N)r   r   r@   rA   rE   rF   rG   )rI   r   rJ   r   rM   r   r   rN   s           r   test_to_dict_defaultsz)TestNavigateCommand.test_to_dict_defaults   sJ    &1{{}(((((((((((((((((r   N)r\   r]   r^   r_   r   r   r   r   r   r   r      s    ')r   r   c                  "    e Zd ZdZd Zd Zd Zy)TestEdgeProxyClientInitz$Test EdgeProxyClient initialization.c                N   t               }|j                  }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }|j                  }d	}||k(  }|st        j                  d|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }t        t        j                  |            dx}x}}y)z/Test client initialization with default config.r   r/   zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.config
}.host
} == %(py7)sr#   r3   r4   r5   r=   assert %(py9)spy9Nr   zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.config
}.port
} == %(py7)sFrX   z4%(py2)s
{%(py2)s = %(py0)s.is_connected
} is %(py5)sr:   r<   r=   )r   r"   r   r@   rA   rB   rC   rD   rE   rF   rG   r   is_connected)
rI   r#   rK   rM   @py_assert6rL   rR   @py_format10rP   rQ   s
             r   test_init_default_configz0TestEdgeProxyClientInit.test_init_default_config  s	    "000000000000000000000000000000))))))))))))))))))))))))))))))+++++++++++++++++++++++++r   c                   t        dd      }t        |      }|j                  }|j                  }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}x}}|j                  }|j                  }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}x}}y)z.Test client initialization with custom config.zrobot.locali(#  )r   r   r!   r/   r   r#   r   r   r   Nr   )r
   r   r"   r   r@   rA   rB   rC   rD   rE   rF   rG   r   )	rI   r"   r#   rK   rM   r   rL   rR   r   s	            r   test_init_custom_configz/TestEdgeProxyClientInit.test_init_custom_config
  s    =t< /222222222222222222222222222222))))))))))))))))))))))))))))))r   c                (   ddl }|j                  d      }t        |      }|j                  }||k(  }|st	        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  }t        t	        j                  |            dx}}y)z.Test client initialization with custom logger.r   Ntest)loggerr/   )z.%(py2)s
{%(py2)s = %(py0)s.logger
} == %(py4)sr#   r   r   r   r6   )logging	getLoggerr   r   r@   rA   rB   rC   rD   rE   rF   rG   )rI   r   r   r#   rK   rM   r   rN   s           r   test_init_with_loggerz-TestEdgeProxyClientInit.test_init_with_logger  s|    ""6* /&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&r   N)r\   r]   r^   r_   r   r   r   r   r   r   r   r      s    .,*'r   r   c                  (    e Zd ZdZd Zd Zd Zd Zy)TestEdgeProxyClientConnectionz)Test EdgeProxyClient connection handling.c                  K   t        d      5 }t               }d|_        ||_        |j	                          d{    |j
                  }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d}|j                          ddd       y7 # 1 sw Y   yxY ww)zTest successful connection.websockets.connectFN0assert %(py2)s
{%(py2)s = %(py0)s.is_connected
}r#   r3   r4   )r   r   closedreturn_valueconnectr   rB   rC   r@   rD   rE   rF   rG   assert_called_once)rI   r#   mock_connectmock_wsrK   @py_format3s         r   test_connect_successz2TestEdgeProxyClientConnection.test_connect_success   s     '( 	.LkG"GN(/L%.."""&&&&&&&&&&&&&&&&&&++-	. 	.
 #	. 	.s-   C/,C#C!BC#	C/!C##C,(C/c                   K   t        dt        d            5  t        j                  t              5  |j                          d{    ddd       ddd       y7 # 1 sw Y   xY w# 1 sw Y   yxY ww)z*Test connection failure without reconnect.r   zConnection refused)side_effectN)r   OSErrorr   r   r   r   rI   r#   s     r   !test_connect_failure_no_reconnectz?TestEdgeProxyClientConnection.test_connect_failure_no_reconnect,  se     'W=Q5RS 	'/ 'nn&&&'	' 	'&' '	' 	'sE   A7A+AAAA+	A7AA(	$A++A40A7c                  K   t        d      5 }t               }d|_        ||_        |j	                          d{    |j
                  }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d}|j                          d{    |j
                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            dx}x}}|j                  j!                          ddd       y7 7 # 1 sw Y   yxY ww)zTest disconnection.r   FNr   r#   r   rX   r   r:   r<   r=   )r   r   r   r   r   r   rB   rC   r@   rD   rE   rF   rG   
disconnectrA   closer   )
rI   r#   r   r   rK   r   rP   rM   rQ   rR   s
             r   test_disconnectz-TestEdgeProxyClientConnection.test_disconnect2  s     '( 	/LkG"GN(/L%.."""&&&&&&&&&&&&&&&&&&##%%%/////////////////////////MM,,.	/ 	/
 # &	/ 	/s@   G,GG
B GGC%G	G
GGGGc                  K   t        d      5 }t               }d|_        ||_        |j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}|j                          d
{    |j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}|j                          d
{    |j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}d
d
d
       y
7 7 # 1 sw Y   y
xY ww)z1Test is_connected property reflects actual state.r   TFrX   r   r#   r:   r<   r=   N)r   r   r   r   r   r@   rA   rB   rC   rD   rE   rF   rG   r   r  )	rI   r#   r   r   rK   rP   rM   rQ   rR   s	            r   test_is_connected_propertyz8TestEdgeProxyClientConnection.test_is_connected_propertyA  sO    '( 	0LkG!GN(/L%/////////////////////////..""".........................##%%%/////////////////////////	0 	0 # &	0 	0sC   KC3J:J5CJ: J8!CJ:,	K5J:8J::K?KN)r\   r]   r^   r_   r   r  r  r	  r   r   r   r   r     s    3
.'/0r   r   c                  (    e Zd ZdZd Zd Zd Zd Zy)TestEdgeProxyClientCommandsz%Test EdgeProxyClient command sending.c                J  K   t        d      5 }t               }d|_        ||_        |j	                          d{    |j                  dd       d{    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   }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}}ddd       y7 7 # 1 sw Y   yxY ww)zTest sending navigate command.r   FNr)   r   r   r*   navigater/   r   r   r   r6   r,   r   )r   r   r   r   r   send_navigatejsonloadssend	call_argsr@   rA   rE   rF   rG   
rI   r#   r   r   	sent_datar   rM   r   r   rN   s
             r   test_send_navigatez.TestEdgeProxyClientCommands.test_send_navigateU  s$    '( 	0LkG"GN(/L%.."""&&{F;;; 

7<<#9#9!#<Q#?@I2222222222222222::::::::::::::::////////////////	0 	0
 #;	0 	0s?   H#,HHHHF3H	H#HHH H#c                B  K   t        d      5 }t               }d|_        ||_        |j	                          d{    |j                          d{    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dd       y7 7 # 1 sw Y   yxY ww)z'Test sending cancel navigation command.r   FNr   r*   cancel_navigationr/   r   r   r   r6   )r   r   r   r   r   send_cancel_navigationr  r  r  r  r@   rA   rE   rF   rG   r  s
             r   test_send_cancel_navigationz7TestEdgeProxyClientCommands.test_send_cancel_navigatione  s     '( 		<LkG"GN(/L%.."""//111

7<<#9#9!#<Q#?@I;;;;;;;;;;;;;;;;		< 		<
 #1		< 		<?   D,DDDDB3D	DDDDDc                B  K   t        d      5 }t               }d|_        ||_        |j	                          d{    |j                          d{    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dd       y7 7 # 1 sw Y   yxY ww)zTest sending get_state command.r   FNr   r*   	get_stater/   r   r   r   r6   )r   r   r   r   r   send_get_stater  r  r  r  r@   rA   rE   rF   rG   r  s
             r   test_send_get_statez/TestEdgeProxyClientCommands.test_send_get_stater  s     '( 		4LkG"GN(/L%.."""'')))

7<<#9#9!#<Q#?@I3333333333333333		4 		4
 #)		4 		4r  c                   K   t        j                  t        d      5  |j                  d       d{    ddd       y7 # 1 sw Y   yxY ww)z;Test that sending when disconnected raises ConnectionError.zNot connectedr   r)   N)r   r   r   r  r  s     r   "test_send_when_disconnected_raisesz>TestEdgeProxyClientCommands.test_send_when_disconnected_raises  sE     ]]?/B 	4&&{333	4 	43	4 	4s+   AAAA	AAAAN)r\   r]   r^   r_   r  r  r  r   r   r   r   r  r  Q  s    /0 <44r   r  c                  4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestEdgeProxyClientHandlersz$Test EdgeProxyClient event handlers.c                ^  K   g |j                   fd       }t        d      5 }t               }d|_        ||_        |j                          d{    t        j                  dddd      }|j                  |       d{    ddd       t              }d	}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t!        t        j"                  |
            dx}x}}d   }|j$                  }t&        j(                  }||k(  }|st        j                  d
|fd||f      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 I7 # 1 sw Y   xY ww)zTest nav_status event handler.c                (    j                  |        y r   append)r1   received_messagess    r   handle_nav_statuszNTestEdgeProxyClientHandlers.test_nav_status_handler.<locals>.handle_nav_status  s    $$S)r   r   FNr'   r   r   rW   r   r/   r   r   r'  r   r7   r8   r   )zK%(py3)s
{%(py3)s = %(py1)s.status
} == %(py7)s
{%(py7)s = %(py5)s.ARRIVED
}r   r   r   r;   r=   r   r   )on_nav_statusr   r   r   r   r   r  dumps_handle_messager   r@   rA   rB   rC   rD   rE   rF   rG   r+   r   r   )rI   r#   r(  r   r   r   r   rL   rP   rN   rO   r   r   rR   r   r'  s                  @r   test_nav_status_handlerz3TestEdgeProxyClientHandlers.test_nav_status_handler  st    				* 
	* '( 	2LkG"GN(/L%..""" jj$#%" G ((111	2" 	+*********************************???????????????????????????????? # 2	2 	2A   "J-,J J1J JJ HJ-J J  J*%J-c                  K   g |j                   fd       }t        d      5 }t               }d|_        ||_        |j                          d{    t        j                  dddd      }|j                  |       d{    ddd       t              }d	}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t!        t        j"                  |
            dx}x}}d   }|j$                  }d}||k(  }|st        j                  d
|fd||f      t        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t!        t        j"                  |
            dx}x}x}}y7 7 # 1 sw Y   xY ww)zTest robot_state event handler.c                (    j                  |        y r   r%  )rl   received_statess    r   handle_robot_statezPTestEdgeProxyClientHandlers.test_robot_state_handler.<locals>.handle_robot_state  s    ""5)r   r   FNrc   K   	waypoint3rv   r   r/   r   r   r1  r   r7   r8   r   )z5%(py3)s
{%(py3)s = %(py1)s.battery_level
} == %(py6)sr   )on_robot_stater   r   r   r   r   r  r+  r,  r   r@   rA   rB   rC   rD   rE   rF   rG   rf   )rI   r#   r2  r   r   r   r   rL   rP   rN   rO   r   r1  s               @r   test_robot_state_handlerz4TestEdgeProxyClientHandlers.test_robot_state_handler  sP    				* 
	* '( 	2LkG"GN(/L%.."""jj%!#$/" G ((111	2 	)(((((((((((((((((((((((((((((((((555555555555555555555 # 2	2 	2sA   "I,I	I1I	II	F;II	I		IIc           	     R  K   g |j                   fd       }t        d      5 }t               }d|_        ||_        |j                          d{    t        j                  ddddd	d
ddd	gd      }|j                  |       d{    ddd       t              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t!        t        j"                  |
            dx}x}}d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            dx}x}x}}y7 C7 # 1 sw Y   xY ww)z!Test waypoint_list event handler.c                (    j                  |        y r   r%  )r   received_listss    r   handle_waypoint_listzTTestEdgeProxyClientHandlers.test_waypoint_list_handler.<locals>.handle_waypoint_list  s    !!),r   r   FNr   r   r   r   r   r   r   r   r   r   r/   r   r   r9  r   r7   r8   r   r   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   r   r   )on_waypoint_listr   r   r   r   r   r  r+  r,  r   r@   rA   rB   rC   rD   rE   rF   rG   )rI   r#   r:  r   r   r   r   rL   rP   rN   rO   rK   rM   r   rR   r   r9  s                   @r   test_waypoint_list_handlerz6TestEdgeProxyClientHandlers.test_waypoint_list_handler  s~    		 	 	- 
!	- '( 	2LkG"GN(/L%.."""jj'"37"37" G ((111	2" 	('''''''''''''''''''''''''''''''''****************************** # 2	2 	2sA   "J',JJ:JJJHJ'JJJ$J'c                ^  K   g |j                   fd       }t        d      5 }t               }d|_        ||_        |j                          d{    t        j                  dddd      }|j                  |       d{    ddd       t              }d	}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t!        t        j"                  |
            dx}x}}d   }|j$                  }t&        j(                  }||k(  }|st        j                  d
|fd||f      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 I7 # 1 sw Y   xY ww)zTest error event handler.c                (    j                  |        y r   r%  )r   received_errorss    r   handle_errorzDTestEdgeProxyClientHandlers.test_error_handler.<locals>.handle_error  s    ""3'r   r   FNr   e   zNo path foundr   r   r/   r   r   r?  r   r7   r8   r   )zM%(py3)s
{%(py3)s = %(py1)s.code
} == %(py7)s
{%(py7)s = %(py5)s.NAV_NO_PATH
}r   r)  r   r   )on_errorr   r   r   r   r   r  r+  r,  r   r@   rA   rB   rC   rD   rE   rF   rG   r   r   NAV_NO_PATH)rI   r#   r@  r   r   r   r   rL   rP   rN   rO   r   r   rR   r   r?  s                  @r   test_error_handlerz.TestEdgeProxyClientHandlers.test_error_handler  so    		( 
	( '( 	2LkG"GN(/L%.."""jj*" G ((111	2 	)(((((((((((((((((((((((((((((((((???????????????????????????????? # 2	2 	2r.  c                b  	K   g 	|j                   	fd       }t        d      5 }t               }d|_        ||_        |j                          d{    |j                          d{    ddd       ddg}	|k(  }|st        j                  d|fd	|f      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 7 # 1 sw Y   xY ww)z%Test connection state change handler.c                (    j                  |        y r   r%  )	connectedchangess    r   handle_connection_changez\TestEdgeProxyClientHandlers.test_connection_change_handler.<locals>.handle_connection_change  s    NN9%r   r   FNTr/   )z%(py0)s == %(py3)srH  r   r   r;   )on_connection_changer   r   r   r   r   r  r@   rA   rB   rC   rD   rE   rF   rG   )
rI   r#   rI  r   r   r   rK   r   rQ   rH  s
            @r   test_connection_change_handlerz:TestEdgeProxyClientHandlers.test_connection_change_handler  s     		$	$	& 
%	& '( 	&LkG"GN(/L%.."""##%%%	& 	(''''''''''''''''''''' #%	& 	&sA   "D/,D#DD#)D!*D#.B1D/D#!D##D,(D/c                l  K   g |j                   fd       }t        d      5 }t               }d|_        ||_        |j                          d{    t        j                  dddd      }|j                  |       d{    ddd       t              }d	}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t!        t        j"                  |
            dx}x}}y7 P7 !# 1 sw Y   !xY ww)zTest async event handler.c                n   K   t        j                  d       d {    j                  |        y 7 w)Nr   )asynciosleepr&  )r1   receiveds    r   r(  zITestEdgeProxyClientHandlers.test_async_handler.<locals>.handle_nav_status  s*     --"""OOC  #s   535r   FNr'   r(   r   rW   r   r/   r   r   rP  r   r7   r8   )r*  r   r   r   r   r   r  r+  r,  r   r@   rA   rB   rC   rD   rE   rF   rG   )rI   r#   r(  r   r   r   r   rL   rP   rN   rO   rP  s              @r   test_async_handlerz.TestEdgeProxyClientHandlers.test_async_handler  s    				! 
	! '( 	2LkG"GN(/L%.."""jj$"%" G ((111	2 	"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # 2	2 	2sA   "F4,F'F!1F'F$F'DF4!F'$F''F1,F4N)
r\   r]   r^   r_   r-  r6  r<  rD  rK  rQ  r   r   r   r"  r"    s%    .@864+8@4($"r   r"  )8r_   
__future__r   builtinsrB   _pytest.assertion.rewrite	assertionrewriter@   rN  r  syspathlibr   unittest.mockr   r   r   r   websockets.exceptionsr   __file__resolveparentsROOTstrpathinsertsrc.edge_proxy.clientr
   r   r   r   src.edge_proxy.messagesr   r   r   r   r   r   r   r   fixturer   r#   r%   ra   ry   r   r   r   r   markr   r  r"  r   r   r   <module>rf     sl   , "     
  5 5  2H~''*t9CHHHHOOAs4y! 	 	 	   1 1
' 'D"* "*J% %*6 6$F% F%R) )(' ': 10 10 10h 04 04 04f Y" Y" Y"r   