
    V5i)                         d Z ddlZddlZddlmZ  G d d      Z G d d      Z G d d	      Z G d
 d      Z G d d      Z	ej                  j                  d       G d d             Zy)z
E2E Tests for ReceptionistAI Voice Widget.

Tests the widget UI, interactions, and voice connectivity based on:
- /mnt/e/genesis-system/RECEPTIONISTAI/QUICK_START.md
- /mnt/e/genesis-system/RECEPTIONISTAI/widget/demo.html
    N)expectc                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestWidgetBasicsz$Basic widget rendering and UI tests.c                     |j                  | d      }|j                  dk(  sJ d       t        |      j                  d       y)z$Verify demo page loads successfully.
/demo.html   zDemo page failed to loadzReceptionistAI Widget DemoN)gotostatusr   to_have_title)selfpage
widget_urlresponses       ./mnt/e/genesis-system/tests/e2e/test_widget.pytest_widget_page_loadsz'TestWidgetBasics.test_widget_page_loads   sD    99
|:67#%A'AA% 	t""#?@    c                     |j                  | d       |j                  d      }t        |      j                          |j                  d      }t        |      j                          y)z&Verify widget UI elements are present.r   z#receptionist-widgetzMbutton[aria-label*="microphone"], button[aria-label*="call"], .widget-triggerN)r	   locatorr   to_be_visible)r   r   r   widget
mic_buttons        r   test_widget_ui_rendersz'TestWidgetBasics.test_widget_ui_renders   sX    		ZL
+, 45v$$& \\"qr
z((*r   c                    |j                  | d       |j                  d      j                  }t        |      j	                          |j                          |j                  d      }t        |      j                  d       y)z*Verify widget trigger button is clickable.r   1button.widget-trigger, button[aria-label*="call"]1.chat-interface, .chat-window, .message-container  timeoutN)r	   r   firstr   to_be_enabledclickr   )r   r   r   triggerchat_interfaces        r   test_widget_button_clickablez-TestWidgetBasics.test_widget_button_clickable$   sl    		ZL
+, ,,RSYYw%%' &YZ~,,T,:r   c                     |j                  | d       |j                  d      j                  j                          |j                  d      }t	        |      j                  d       y)z#Verify text input field is present.r   r   ;input[type="text"], textarea, input[placeholder*="message"]r   r   Nr	   r   r   r!   r   r   )r   r   r   
text_inputs       r   test_text_input_visiblez(TestWidgetBasics.test_text_input_visible2   sZ    		ZL
+, 	HIOOUUW \\"_`
z(((6r   c                     |j                  | d       |j                  d      j                  j                          |j                  d      }t	        |      j                  d       y)zVerify send button exists.r   r   Jbutton[aria-label*="send"], button:has-text("Send"), button[type="submit"]r   r   Nr'   )r   r   r   send_buttons       r   test_send_button_presentz)TestWidgetBasics.test_send_button_present=   sZ    		ZL
+, 	HIOOUUW ll#op{))$)7r   N)	__name__
__module____qualname____doc__r   r   r$   r)   r-    r   r   r   r      s    .A
+;	7	8r   r   c                   "    e Zd ZdZd Zd Zd Zy)TestWidgetInteractionz'Test user interactions with the widget.c                    |j                  | d       |j                  d      j                  j                          |j	                  d       |j                  d      j                  }|j                  d       |j                  d      j                  }|j                          |j	                  d       |j                  d      }|j                         d	kD  sJ d
       y)z/Test sending a text message through the widget.r   r     r&   What are your hours?r+     +.message, .chat-message, [class*="message"]r   zNo messages found after sendingNr	   r   r   r!   wait_for_timeoutfillcountr   r   r   r(   r,   messagess         r   test_text_message_flowz,TestWidgetInteraction.test_text_message_flowL   s    		ZL
+, 	HIOOUUWd# \\"_`ff
./ ll#opvv 	d# << MN~~!#F%FF#r   c                    |j                  | d       |j                  d      j                  j                          |j	                  d       g d}|D ]j  }|j                  d      j                  }|j                  |       |j                  d      j                  }|j                          |j	                  d       l |j                  d      }|j                         t        |      k\  sJ d	       y
)z+Test sending multiple messages in sequence.r   r   r6   )r7   z!How much does a leak repair cost?zDo you service Bondi?r&   r+   i  r9   zNot all messages appearedN)r	   r   r   r!   r;   r<   r=   len)r   r   r   test_messagesmsgr(   r,   r?   s           r   test_multiple_messagesz,TestWidgetInteraction.test_multiple_messagesc   s    		ZL
+, 	HIOOUUWd#
 ! 	(C&cdjjJOOC ,,'stzzK!!$'	( << MN~~3}#55R7RR5r   c                    |j                  | d       |j                  d      j                  j                          |j	                  d       |j                  d      j                  }|j                  d       |j                  d      j                  }|j                          |j	                  d       |j                  d      }|j                         d	kD  sJ y
)z7Test message with phone number (lead capture scenario).r   r   r6   r&   z'My name is Sarah, call me on 0412345678r+   r8   r9   r   Nr:   r>   s         r   test_lead_capture_messagez/TestWidgetInteraction.test_lead_capture_message~   s    		ZL
+, 	HIOOUUWd# \\"_`ff
ABll#opvvd# << MN~~!###r   N)r.   r/   r0   r1   r@   rE   rG   r2   r   r   r4   r4   I   s    1G.S6$r   r4   c                   "    e Zd ZdZd Zd Zd Zy)TestWidgetResponsivez&Test widget on different screen sizes.c                     |j                  | d       |j                  d      }t        |      j                          |j                  d      j                  }t        |      j                          y)zTest widget on mobile viewport.r   '#receptionist-widget, .widget-containerr   Nr	   r   r   r   r   )r   mobile_pager   r   r"   s        r   test_mobile_renderingz*TestWidgetResponsive.test_mobile_rendering   c    J<z23 $$%NOv$$& %%&YZ``w%%'r   c                     |j                  | d       |j                  d      }t        |      j                          |j                  d      j                  }t        |      j                          y)zTest widget on tablet viewport.r   rK   r   NrL   )r   tablet_pager   r   r"   s        r   test_tablet_renderingz*TestWidgetResponsive.test_tablet_rendering   rO   r   c                    |j                  | d       |j                  d      j                  j                          |j	                  d       |j                  d      j                  }|j                  d       |j                  d      j                  }|j                          |j	                  d       |j                  d      }|j                         d	kD  sJ y
)z%Test full interaction flow on mobile.r   r   r6   r&   zTest mobile messagez3button[aria-label*="send"], button:has-text("Send")r8   r9   r   Nr:   )r   rM   r   r(   r,   r?   s         r   test_mobile_interactionz,TestWidgetResponsive.test_mobile_interaction   s    J<z23 	OPVV\\^$$T* !(()fgmm
-.!))*_`ff$$T* &&'TU~~!###r   N)r.   r/   r0   r1   rN   rR   rT   r2   r   r   rI   rI      s    0
(
($r   rI   c                   "    e Zd ZdZd Zd Zd Zy)TestWidgetPerformancezPerformance and loading tests.c                     t        j                          }|j                  | d       t        j                          |z
  }|dk  sJ d|dd       y)z%Verify page loads in under 3 seconds.r   g      @zPage load took .2fzs (target: <3s)N)timer	   )r   r   r   
start_time	load_times        r   test_page_load_timez)TestWidgetPerformance.test_page_load_time   sL    YY[
		ZL
+,IIK*,	3P/)C PPr   c                 J   g |j                  dfd       |j                  | d       |j                  d       D cg c]!  }d|j                  j	                         vs |# }}t        |      dk(  s"J d|D cg c]  }|j                   c}        yc c}w c c}w )	z,Verify no JavaScript console errors on load.consolec                 H    | j                   dk(  rj                  |       S d S )Nerror)typeappend)rD   errorss    r   <lambda>z>TestWidgetPerformance.test_no_console_errors.<locals>.<lambda>   s     SXX=Pv}}S'9 VZ r   r   r8   faviconr   zConsole errors found: N)onr	   r;   textlowerrB   )r   r   r   ecritical_errorsrc   s        @r   test_no_console_errorsz,TestWidgetPerformance.test_no_console_errors   s    	Z[		ZL
+,d# '-P	0O1PP?#q(f,BTcCdqAFFCdBe*ff( QCds   !B$B>B c                     t        j                          }|j                  | d       |j                  d      j                  }|j	                  dd       t        j                          |z
  }|dk  sJ d|dd	       y
)z,Test how quickly widget becomes interactive.r   r   visiblei  )stater   g       @zWidget initialization took rX   zs (target: <2s)N)rY   r	   r   r   wait_for)r   r   r   rZ   r"   	init_times         r    test_widget_initialization_speedz6TestWidgetPerformance.test_widget_initialization_speed   sw    YY[
		ZL
+, ,,RSYYy$7IIK*,	3\"=i_O \\r   N)r.   r/   r0   r1   r\   rk   rq   r2   r   r   rV   rV      s    (Qg
]r   rV   c                       e Zd ZdZd Zd Zy)TestWidgetAccessibilityz(Accessibility and ARIA compliance tests.c                     |j                  | d       |j                  j                  d       |j                  j                  d       |j                  d      }t	        |      j                  d       y)z(Test widget can be opened with keyboard.r   TabEnterr   r   r   N)r	   keyboardpressr   r   r   )r   r   r   r#   s       r   test_keyboard_navigationz0TestWidgetAccessibility.test_keyboard_navigation   sd    		ZL
+, 	E" 	G$ &YZ~,,T,:r   c                     |j                  | d       |j                  d      j                  }|j                  d      }|J d       t	        |      dkD  sJ d       y)z&Verify ARIA labels for screen readers.r   z)button.widget-trigger, button[aria-label]z
aria-labelNz!Widget trigger missing aria-labelr   zaria-label is empty)r	   r   r   get_attributerB   )r   r   r   r"   
aria_labels        r   test_aria_labels_presentz0TestWidgetAccessibility.test_aria_labels_present   sf    		ZL
+, ,,JKQQ**<8
%J'JJ%:"9$99"r   N)r.   r/   r0   r1   ry   r}   r2   r   r   rs   rs      s    2;	:r   rs   z7Requires microphone permissions and Telnyx WebRTC setup)reasonc                       e Zd ZdZd Zd Zy)TestVoiceIntegrationz3Voice call integration tests (requires microphone).c                 ,    |j                  | d       y)z'Verify audio permissions are requested.r   N)r	   r   r   r   s      r   test_audio_permissions_promptz2TestVoiceIntegration.test_audio_permissions_prompt  s    		ZL
+, 	r   c                      y)z*Test connection to Telnyx WebRTC endpoint.Nr2   r   s      r   test_telnyx_webrtc_connectionz2TestVoiceIntegration.test_telnyx_webrtc_connection  s     	r   N)r.   r/   r0   r1   r   r   r2   r   r   r   r     s    =r   r   )r1   pytestrY   playwright.sync_apir   r   r4   rI   rV   rs   markskipr   r2   r   r   <module>r      s|      &98 98xH$ H$V.$ .$b"] "]J: :: RS  Tr   