
    h,                     6   S r SSKrSSKJs  Jr  SSKrSSKJ	r	J
r
Jr  SSKrSSKrSSKJr  \R                   " SS9S 5       r " S S	5      r " S
 S5      r " S S5      r " S S5      r " S S5      r " S S5      r\S:X  a  \R2                  " \SS/5        gg)z
Tests for q_business_chat_cli.py

This test suite covers:
- Message sending functionality
- Session management
- Error handling
- Response parsing
    N)Mockpatch	MagicMock)StringIOT)autousec               #   ^   #    [        S5       n U v   SSS5        g! , (       d  f       g= f7f)zMock boto3 client for all testszboto3.clientN)r   )mock_clients    S/root/racknerd_01/codex-conversation/amazon-q-terraform/test_q_business_chat_cli.py
mock_boto3r      s"      
~	+ 
		s   -	-
*-c                   0    \ rS rSrSrS rS rS rS rSr	g)	TestSendMessageToQ   z)Test suite for send_message_to_q functionc                    SSK n[        5       nSSSS0S./S.nXCR                  l        X1l        X2l        UR                  S	S5      nXT:H  of(       d  [        R                  " S
U4SXT45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eSnUS   n	SoU
:H  o(       do  [        R                  " S
U4SX45      [        R                  " U	5      [        R                  " U
5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n	=pUR                  R                  5         UR                  R                  S   nSoU;  o(       d  [        R                  " SU4SX45      [        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS=pUS   oR                   nU	U:H  o(       d  [        R                  " S
U4SU	U45      [        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S .-  nS!S"U0-  n[        [        R                  " U5      5      eS=n	=nnUS#   oR"                  nU	U:H  o(       d  [        R                  " S
U4S$U	U45      [        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S .-  nS!S"U0-  n[        [        R                  " U5      5      eS=n	=nng)%z5Test sending a message without an existing session IDr   Nconv-123ASSISTANT_MESSAGEtextzHello! How can I help you?typepayloadconversationIdmessagesHello==z%(py0)s == %(py2)sresponsemock_responsepy0py2assert %(py4)spy4r   z%(py1)s == %(py4)spy1r#   assert %(py6)spy6   not inz%(py1)s not in %(py3)s	call_argsr&   py3assert %(py5)spy5applicationId)z6%(py1)s == %(py5)s
{%(py5)s = %(py3)s.APPLICATION_ID
}q_business_chat_cli)r&   r/   r1   assert %(py7)spy7userId)z/%(py1)s == %(py5)s
{%(py5)s = %(py3)s.USER_ID
})r3   r   	chat_syncreturn_valueqbusiness_clientsend_message_to_q
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationassert_called_oncer-   APPLICATION_IDUSER_ID)selfr   r3   mock_qbusinessr   r   @py_assert1@py_format3@py_format5@py_assert0@py_assert3@py_assert2@py_format7r-   @py_format4@py_format6@py_assert4@py_format8s                     r
   $test_send_message_without_session_id7TestSendMessageToQ.test_send_message_without_session_id   s    	# ( 0 &(DE
 1>  -"0 0>, '88$G (((((x((((((x((((x((((((=((((=(((((((()7Z7Z77777)777)777Z7777777  335",,66q9	0y00000000000000y0000y0000000)O-O-OO)-OOOOOO)-OOOO)OOOOOO-@OOOO-@OOO-OOOOOOOO"A&A&AA"&AAAAAA"&AAAA"AAAAAA&9AAAA&9AAA&AAAAAAAA    c                    SSK n[        5       nSSSS0S./S.nXCR                  l        X2l        UR                  S	S5      nXT:H  of(       d  [        R                  " S
U4SXT45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eSnUR                  R                  S   n	U	S   n
SoU:H  o(       do  [        R                  " S
U4SX45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n
=pg)z2Test sending a message with an existing session IDr   Nr   r   r   zFollow-up responser   r   zFollow-up questionr   r   r   r   r   r"   r#   r)   r   r$   r%   r'   r(   )r3   r   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   r-   )rF   r   r3   rG   r   r   rH   rI   rJ   r-   rK   rL   rM   rN   s                 r
   !test_send_message_with_session_id4TestSendMessageToQ.test_send_message_with_session_id?   s/   " ( 0 &(<=
 1>  -/=, '889MzZ (((((x((((((x((((x((((((=((((=(((((((",,66q9	)*8j8j88888*888*888j8888888rU   c                 4   SSK n[        5       n[        S5      UR                  l        X2l        [        5       n[        SU5         UR                  SS5      nSSS5        SnWUL ow(       d  [        R                  " SU4SXV45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S	.-  nS
SU0-  n	[        [        R                   " U	5      5      eS=pvSoR"                  o" 5       oU;   of(       d  [        R                  " SU4SX45      [        R                  " U
5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                   " U5      5      eS=n
=n=pg! , (       d  f       GN= f)z'Test error handling when API call failsr   Nz	API Errorz
sys.stdoutTestisz%(py0)s is %(py3)sr   r    r/   r0   r1   z*Error communicating with Amazon Q Businessin)zG%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.getvalue
}()
}captured_output)r&   r/   r1   r5   assert %(py9)spy9)r3   r   	Exceptionr7   side_effectr9   r   r   r:   r;   r<   r=   r>   r?   r@   rA   rB   getvalue)rF   r   r3   rG   ra   r   rM   rH   rO   rP   rK   rQ   @py_assert6rR   @py_format10s                  r
   test_send_message_with_error/TestSendMessageToQ.test_send_message_with_errorY   sA   " /8/E  ,/=, #*<1*<<VTJH 2  x4xxx4;Y?W?WY?W?YY?YYYYYY;YYY;YYYYYYYYYYYYY?WYYY?YYYYYYYY 21s   H
Hc                    SSK n[        5       nS/ S.UR                  l        X2l        SnUR                  US5        UR                  R                  S   nUS   n[        U5      nSoU:H  o(       Gd  [        R                  " SU	4S	Xx45      S
[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS
S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS=n=pUS   S   nSoU:H  ow(       do  [        R                  " SU4SX45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n
[        [        R                  " U
5      5      eS=n=p}US   S   nSoU:H  ow(       do  [        R                  " SU4SX45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n
[        [        R                  " U
5      5      eS=n=p}US   S   S   oU:H  ow(       d  [        R                  " SU4SX45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS=pg)z0Test that message payload is correctly formattedr   Nr   r   zWhat is the weather?r)   r   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr    r&   r/   r(   assert %(py8)spy8r   USER_MESSAGEr$   r%   r'   r(   sourceCLI_CHATr   r   )z%(py1)s == %(py3)stest_messager.   r0   r1   )r3   r   r7   r8   r9   r:   r-   rl   r;   r<   r=   r>   r?   r@   rA   rB   )rF   r   r3   rG   rs   r-   r   rM   @py_assert5rQ   rN   @py_format9rK   rL   rJ   rO   rP   s                    r
   test_message_payload_format.TestSendMessageToQ.test_message_payload_formatl   s   " CM[]0^  -/=, .--lDA #,,66q9	Z(8}!!!!!!!}!!!!!!s!!!!s!!!!!!8!!!!8!!!}!!!!!!!!!!{6"4n4n44444"444"444n4444444{8$2
2
22222$222$222
2222222{9%f-======-===-=================rU    N)
__name__
__module____qualname____firstlineno____doc__rS   rW   ri   rv   __static_attributes__rx   rU   r
   r   r      s    3 BD94Z&>rU   r   c                   *    \ rS rSrSrS rS rS rSrg)TestResponseParsing   z%Test suite for response parsing logicc                    SSSS0S.SSS0S./S.n[        S	 UR                  S
/ 5       5       S5      nSo2ULoD(       d  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=pCUS   S   nSoU:H  o3(       do  [        R                  " SU4SXx45      [        R                  " U5      [        R                  " U5      S.-  n	SSU	0-  n
[        [        R                  " U
5      5      eS=n=p8g)z/Test extracting assistant message from responser   rp   r   Questionr   r   Answerr   c              3   T   #    U  H  nUR                  S 5      S:X  d  M  Uv   M      g7fr   r   Nget.0msgs     r
   	<genexpr>ETestResponseParsing.test_extract_assistant_message.<locals>.<genexpr>   +      D)E#GGFO/BB #)E   (	(r   Nis notz%(py0)s is not %(py3)s	q_messager^   r0   r1   r   r   r$   r%   r'   r(   
nextr   r;   r<   r=   r>   r?   r@   rA   rB   )rF   r   r   rM   rH   rO   rP   rK   rL   rJ   rN   s              r
   test_extract_assistant_message2TestResponseParsing.test_extract_assistant_message   s    ) + &
3
 0 &1	
  Dj")E DEIK	 !%$$$$$$y$$$$$$y$$$$y$$$$$$$$$$#F+7x7x77777+777+777x7777777rU   c                    S/ S.n[        S UR                  S/ 5       5       S5      nSo2UL oD(       d  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS=pCg)z/Test handling when assistant message is missingr   r   c              3   T   #    U  H  nUR                  S 5      S:X  d  M  Uv   M      g7fr   r   r   s     r
   r   HTestResponseParsing.test_extract_message_when_missing.<locals>.<genexpr>   r   r   r   Nr[   r]   r   r^   r0   r1   r   )rF   r   r   rM   rH   rO   rP   s          r
   !test_extract_message_when_missing5TestResponseParsing.test_extract_message_when_missing   s     )

  Dj")E DEIK	 ! D     y      y    y   D       rU   c                    SSSS0S./SSS.S	S
S./S.nSo"U;   o3(       d  [         R                  " SU4SX!45      [         R                  " U5      S[        R                  " 5       ;   d  [         R
                  " U5      (       a  [         R                  " U5      OSS.-  nSSU0-  n[        [         R                  " U5      5      eS=p#US   n[        U5      nSoU:H  o(       d  [         R                  " SU	4SXx45      S[        R                  " 5       ;   d  [         R
                  " [        5      (       a  [         R                  " [        5      OS[         R                  " U5      [         R                  " U5      [         R                  " U5      S.-  n
SSU
0-  n[        [         R                  " U5      5      eS=n=n=pUS   S   S   nSorU:H  o3(       do  [         R                  " SU4SX'45      [         R                  " U5      [         R                  " U5      S.-  nSS U0-  n[        [         R                  " U5      5      eS=n=p7US   S!   S"   nS
orU:H  o3(       do  [         R                  " SU4SX'45      [         R                  " U5      [         R                  " U5      S.-  nSS U0-  n[        [         R                  " U5      5      eS=n=p7g)#z Test parsing source attributionsr   r   r   zBased on the documentation...r   z
User Guidezhttps://example.com/guide)titleurlFAQzhttps://example.com/faq)r   r   sourceAttributionsr   r_   z%(py1)s in %(py3)sr   r.   r0   r1   N   r   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)srl   r    r!   r#   r5   rb   rc   r   r   r$   r%   r'   r(   r)   r   )	r;   r<   r@   r=   r>   r?   rA   rB   rl   )rF   r   rK   rM   rO   rP   rH   rL   rg   rt   rR   rh   rJ   rN   s                 r
    test_source_attributions_parsing4TestResponseParsing.test_source_attributions_parsing   s    ) 0 &(GH *6
 #4	#
( $/x/////#///#//////x////x///////017s127a7a777772777777s7777s77717772777a7777777,-a09I\I\IIIII9III9III\IIIIIII,-a07T;TT;TTTTTT7TTT7TTT;TTTTTTTTrU   rx   N)	ry   rz   r{   r|   r}   r   r   r   r~   rx   rU   r
   r   r      s    /8.
!UrU   r   c                   $    \ rS rSrSrS rS rSrg)TestConfiguration   z'Test suite for configuration validationc                    SSK nUR                  nSo2ULoD(       d  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=pCUR                  nSo2ULoD(       d  [        R                  " SU4S	X#45      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=pCUR                  nSo2ULoD(       d  [        R                  " SU4S
X#45      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=pCg)z.Test that default configuration values are setr   Nr   )z:%(py2)s
{%(py2)s = %(py0)s.APPLICATION_ID
} is not %(py5)sr3   )r    r!   r1   r4   r5   )z2%(py2)s
{%(py2)s = %(py0)s.REGION
} is not %(py5)s)z3%(py2)s
{%(py2)s = %(py0)s.USER_ID
} is not %(py5)s)r3   rD   r;   r<   r=   r>   r?   r@   rA   rB   REGIONrE   )rF   r3   rH   rQ   rL   rP   rR   s          r
   test_default_configuration,TestConfiguration.test_default_configuration   sd   ""11=======1======"===="===1=========="))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55555"**6$6$66666*666666"6666"666*666$6666666rU   c                     SSK nUR                  n[        U[        5      o3(       Gd+  SS[        R
                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R
                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  n[        [        R                  " U5      5      eSn[        U5      nSoeU:  ow(       Gd  [        R                  " SU4S	XV45      S
[        R
                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS
S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS=n=pvg)zTest region configurationr   Nz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceregionstr)r    r&   r!   r#   )>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)srl   rm   rn   ro   )r3   r   r   r   r=   r>   r;   r?   r@   rA   rB   rl   r<   )
rF   r3   r   rL   rJ   rM   rt   rQ   rN   ru   s
             r
   test_region_configuration+TestConfiguration.test_region_configuration   s6   " %++&#&&&&&&&&&z&&&&z&&&&&&&&&&&&&&&&&&#&&&&#&&&&&&&&&&6{QQ{ss66{QrU   rx   N)ry   rz   r{   r|   r}   r   r   r~   rx   rU   r
   r   r      s    17rU   r   c                       \ rS rSrSrS rSrg)TestSessionManagement   z$Test suite for session ID managementc                    SSK n[        5       nS/ S.S/ S./nXCR                  l        X2l        UR                  SS5      nUR                  S5      nUR                  SU5      nUR                  R                  S   nUS   n	SoU
:H  o(       do  [        R                  " S	U4S
X45      [        R                  " U	5      [        R                  " U
5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n	=pg)z-Test that session ID persists across messagesr   Nzconv-abcr   zFirst messager   zSecond messager)   r   r$   r%   r'   r(   )r3   r   r7   re   r9   r:   r   r-   r;   r<   r@   rA   rB   )rF   r   r3   rG   	responses	response1
session_id	response2second_call_argsrK   rL   rM   rJ   rN   s                 r
   test_session_id_persistence1TestSessionManagement.test_session_id_persistence   s    " )r:)r:
	 09  ,/=, (99/4P	]]#34
 (99:JJW	 *33==a@ 01?Z?Z?????1???1???Z???????rU   rx   N)ry   rz   r{   r|   r}   r   r~   rx   rU   r
   r   r      s    .@rU   r   c                   *    \ rS rSrSrS rS rS rSrg)TestErrorScenarios   z&Test suite for various error scenariosc                 B   SSK n[        5       n0 UR                  l        X2l        UR                  SS5      n0 oTU:H  of(       d  [        R                  " SU4SXE45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS=peS
oU;  oU(       d  [        R                  " SU4SX45      [        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSS	U0-  n[        [        R                  " U5      5      eS=pg)zTest handling of empty responser   NrZ   r   z%(py0)s == %(py3)sr   r^   r0   r1   r   r*   r,   r.   r3   r   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   
rF   r   r3   rG   r   rM   rH   rO   rP   rK   s
             r
   test_empty_response&TestErrorScenarios.test_empty_response   s    "02  -/=,&88F2~xxx2/x//////////////x////x///////rU   c                 J   SSK n[        5       nSSS0/0UR                  l        X2l        UR                  SS5      nSoTULof(       d  [        R                  " SU4SXE45      S	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	[        R                  " U5      S
.-  nSSU0-  n[        [        R                  " U5      5      eS=peSoU;   oU(       d  [        R                  " SU4SX45      [        R                  " U	5      S	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	S.-  nSSU0-  n[        [        R                  " U5      5      eS=pg)z#Test handling of malformed responser   Nr   r   r   rZ   r   r   r   r^   r0   r1   r_   r   r.   r   r   s
             r
   test_malformed_response*TestErrorScenarios.test_malformed_response  s   "/1
  - 0>,&88F  $#t#####x######x####x###t#######%X%%%%%z%%%z%%%%%%X%%%%X%%%%%%%rU   c                    SSK n[        5       n[        S5      UR                  l        X2l        UR                  SS5      nSoTUL of(       d  [        R                  " SU4SXE45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS=peg)z Test handling of network timeoutr   NzRequest timeoutrZ   r[   r]   r   r^   r0   r1   )r3   r   rd   r7   re   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   )	rF   r   r3   rG   r   rM   rH   rO   rP   s	            r
   test_network_timeout'TestErrorScenarios.test_network_timeout  s    "/89J/K  ,/=,&88F4xxx4rU   rx   N)	ry   rz   r{   r|   r}   r   r   r   r~   rx   rU   r
   r   r      s    00&*
 rU   r   c                       \ rS rSrSrS rSrg)TestIntegrationi(  z3Integration tests simulating full conversation flowc                    SSK n[        5       nSSSS0S./S.SSSS	0S./S.SSSS
0S./S./nXCR                  l        X2l        SnUR                  SU5      nUR                  S5      nSouU:H  o(       d  [        R                  " SU4SXW45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  n	SSU	0-  n
[        [        R                  " U
5      5      eS=pUR                  SU5      nUR                  nSo" U5      nSoU:H  o(       d  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=n=n=pUR                  SU5      nUR                  nSo" U5      nSoU:H  o(       d  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=n=n=pUR                  oR                  nSnUU:H  o(       d  [        R                  " SU4SUU45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSS U0-  n[        [        R                  " U5      5      eS=n=n=nng)!z#Test a multi-turn conversation flowr   Nzconv-xyzr   r   z
Response 1r   r   z
Response 2z
Response 3z
Question 1r   r   r   r   r^   r0   r1   z
Question 2)zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)sr   )r    r!   r#   r(   rc   zassert %(py11)spy11z
Question 3	response3   )zQ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.chat_sync
}.call_count
} == %(py7)srG   r   rb   rc   )r3   r   r7   re   r9   r:   r   r;   r<   r=   r>   r?   r@   rA   rB   
call_count)rF   r   r3   rG   mock_responsesr   r   rM   rH   rO   rP   r   rL   rt   @py_assert8@py_assert7rh   @py_format12r   rg   rR   s                        r
   test_multi_turn_conversation,TestIntegration.test_multi_turn_conversation+  s   "
 #-&9v|F\]^
 #-&9v|F\]^
 #-&9v|F\]^
 0>  ,/=, 
 (99,
S	]]#34
''Z'''''z''''''z''''z'''Z''''''' (99,
S	}}<-<}-.<*<*<<<<<.<<<<<<y<<<<y<<<}<<<-<<<.<<<*<<<<<<< (99,
S	}}<-<}-.<*<*<<<<<.<<<<<<y<<<<y<<<}<<<-<<<.<<<*<<<<<<< ''7227a72a777772a777777~7777~777'7772777a7777777rU   rx   N)ry   rz   r{   r|   r}   r   r~   rx   rU   r
   r   r   (  s
    =)8rU   r   __main__z-vz
--tb=short)r}   builtinsr=   _pytest.assertion.rewrite	assertionrewriter;   pytestunittest.mockr   r   r   jsonsysior   fixturer   r   r   r   r   r   r   ry   main__file__rx   rU   r
   <module>r      s      0 0  
   f> f>R?U ?UD *@ @8/  / d,8 ,8^ z
KK4./ rU   