
    5i0                         d Z ddlZddlmc mZ ddlZddlZddl	m
Z
  G d d      Z G d d      Z G d d	      Z G d
 d      Z G d d      Z G d d      Z G d d      Zy)z
E2E Tests for ReceptionistAI Landing/Marketing Page.

Tests page performance, responsiveness, and user experience.
Based on DEMO_RECORDING_SUMMARY.md and marketing requirements.
    N)expectc                   (    e Zd ZdZd Zd Zd Zd Zy)TestPageLoadingz$Landing page load performance tests.c                    |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  }t        j                  d      dz   d	|iz  }t        t        j                  |            d
x}x}}y
)z)Verify landing page loads without errors.
/demo.html   ==)z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sresponse)py0py2py5zPage failed to load
>assert %(py7)spy7N)gotostatus
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanation)	selfpage
widget_urlr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s	            4/mnt/e/genesis-system/tests/e2e/test_landing_page.pytest_page_loads_successfullyz,TestPageLoading.test_page_loads_successfully   s    99
|:67<#<#%<<<#<<<<<<x<<<x<<<<<<#<<<'<<<<<<<<    c                 &   t        j                          }|j                  | d       |j                  d       t        j                          |z
  }d}||k  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d|d	d
      dz   d|iz  }t        t        j                  |            dx}}y)z
        Verify page loads in under 3 seconds.

        From DEMO_RECORDING_SUMMARY.md:
        "Page loads under 3 seconds"
        r   loadg      @<z%(py0)s < %(py3)s	load_timer   py3zPage load took .2fzs (target: <3s)
>assert %(py5)sr   N)timer   wait_for_load_stater   r   r   r   r   r   r   r   r   )	r   r   r   
start_timer,   @py_assert2r   @py_format4r"   s	            r$   test_page_load_time_under_3sz,TestPageLoading.test_page_load_time_under_3s   s     YY[
		ZL
+,  (IIK*,	Py3PPPy3PPPPPPyPPPyPPP3PPP/)C PPPPPPPr&   c                    t        j                          }|j                  | d       |j                  d       |j                  d      j                  }|j                  dd       t        j                          |z
  }d}||k  }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      dz  }t        j                  d|dd      dz   d|iz  }	t        t        j                  |	            dx}}y)z.Verify page becomes interactive quickly (TTI).r   networkidle1button.widget-trigger, button[aria-label*="call"]visiblei  )statetimeoutg      @r)   r+   interactive_timer-   zTime to interactive: r/   zs (target: <4s)r0   r   N)r1   r   r2   locatorfirstwait_forr   r   r   r   r   r   r   r   r   )
r   r   r   r3   triggerr=   r4   r   r5   r"   s
             r$   test_page_interactive_quicklyz-TestPageLoading.test_page_interactive_quickly"   s    YY[
		ZL
+,  / ,,RSYYy$799;3"%d#%ddd#dddddddddddd#ddd)>?OPS>TTc'dddddddr&   c                 f  
 g 
|j                  d
fd       |j                  | d       |j                  d       
D cg c]:  }d|j                         vr&d|j                         vrd|j                         vr|< }}t	        |      }d}||k(  }|st        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  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            dx}x}}yc c}w )z
        Verify no JavaScript errors on page load.

        From DEMO_RECORDING_SUMMARY.md:
        "No console errors"
        consolec                 \    | j                   dk(  rj                  | j                        S d S )Nerror)typeappendtext)msgerrorss    r$   <lambda>z@TestPageLoading.test_no_console_errors_on_load.<locals>.<lambda>7   s$    #((gBUv}}SXX'> [_ r&   r   r8   favicon	analyticsgtagr   r	   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slencritical_errorsr   py1r.   py6zConsole errors found: 
>assert %(py8)spy8Nonr   r2   lowerrQ   r   r   r   r   r   r   r   r   r   )r   r   r   erR   r4   @py_assert5r    @py_format7@py_format9rK   s             @r$   test_no_console_errors_on_loadz.TestPageLoading.test_no_console_errors_on_load/   s.    	_`		ZL
+,  / 
	)1779,aggi' 
 
 ?#TqT#q(TTT#qTTTTTTsTTTsTTTTTT?TTT?TTT#TTTqTTT,B?BS*TTTTTTTT
s   ?F.N)__name__
__module____qualname____doc__r%   r6   rB   r_    r&   r$   r   r      s    .=
QeUr&   r   c                   "    e Zd ZdZd Zd Zd Zy)TestPageContentz Test page content and structure.c                    |j                  | d       |j                  d      j                  }t        |      j	                          |j                  d      }|j
                  } |       }d}||kD  }|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  }	t        j                  d	      d
z   d|	iz  }
t        t        j                  |
            dx}x}x}}y)z
        Verify all page sections render correctly.

        From DEMO_RECORDING_SUMMARY.md:
        "All sections render"
        r   zsection, .hero, [class*="hero"]z
h1, h2, h3r   >zC%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.count
}()
} > %(py7)sheadingsr   r   py4r   zNo headings found on page
>assert %(py9)spy9N)r   r>   r?   r   to_be_visiblecountr   r   r   r   r   r   r   r   r   )r   r   r   herork   r   r!   @py_assert6r\   r#   @py_format10s              r$   test_all_sections_renderz(TestPageContent.test_all_sections_renderJ   s     			ZL
+, ||=>DDt""$ <<-~~@~@!@!#@@@!@@@@@@x@@@x@@@~@@@@@@!@@@%@@@@@@@@r&   c                    |j                  | d       g d}d}|D ](  }|j                  |      j                         dkD  s&d} n |s{t        j                  d      dz   dd	t        j                         v st        j                  |      rt        j                  |      nd	iz  }t        t        j                  |            y
)z
        Verify Call-to-Action buttons are present.

        From DEMO_RECORDING_SUMMARY.md:
        "CTA buttons work"
        r   )zbutton:has-text("Try Demo")zbutton:has-text("Get Started")za:has-text("Sign Up")z
button.ctaza.cta-buttonz.widget-triggerFr   TzNo CTA buttons found on pagez
>assert %(py0)sr   	found_ctaN)r   r>   rq   r   r   r   r   r   r   r   r   )r   r   r   cta_selectorsrw   selector@py_format1s          r$   test_cta_buttons_presentz(TestPageContent.test_cta_buttons_present^   s     			ZL
+,
 	% 	H||H%++-1 		
 888888888y888y88888yr&   c                 *   |j                  | d       |j                  d      j                  }t        |      j	                          |j                          |j                  d       |j                  d      }t        |      j                          y)z0Verify CTA buttons are clickable and functional.r   r9   i  z.chat-interface, .chat-windowN)r   r>   r?   r   to_be_enabledclickwait_for_timeoutrp   )r   r   r   ctachat_interfaces        r$   test_cta_buttons_clickablez*TestPageContent.test_cta_buttons_clickabley   sw    		ZL
+, llNOUUs!!# 			d# &EF~,,.r&   N)r`   ra   rb   rc   ru   r{   r   rd   r&   r$   rf   rf   G   s    *A(96/r&   rf   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestResponsiveDesignzy
    Test responsive design across different viewports.

    From DEMO_RECORDING_SUMMARY.md:
    "Mobile responsive"
    c                 \   |j                  | d       t        |j                  d            j                          |j                  d      j                  }t        |      j                          |j                         }|d   }d}||kD  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d	      d
z   d|iz  }	t        t        j                  |	            dx}x}}|d   }d}||kD  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d      d
z   d|iz  }	t        t        j                  |	            dx}x}}y)z#Verify mobile layout is functional.r   bodyr9   widthr   rh   )z%(py1)s > %(py4)s)rT   rm   z%Widget trigger has no width on mobilez
>assert %(py6)srU   Nheightz&Widget trigger has no height on mobile)r   r   r>   rp   r?   bounding_boxr   r   r   r   r   r   )
r   mobile_pager   rA   box@py_assert0r!   r4   @py_format5r]   s
             r$   test_mobile_layoutz'TestResponsiveDesign.test_mobile_layout   s"   J<z23 	{""6*+99; %%&YZ``w%%' ""$7|HaH|aHHH|aHHH|HHHaHHH!HHHHHHHH8}JqJ}q JJJ}qJJJ}JJJqJJJ"JJJJJJJJr&   c                     |j                  | d       t        |j                  d            j                          |j                  d      j                  }t        |      j                          y)z#Verify tablet layout is functional.r   r   r9   N)r   r   r>   rp   r?   )r   tablet_pager   rA   s       r$   test_tablet_layoutz'TestResponsiveDesign.test_tablet_layout   sZ    J<z23{""6*+99;%%&YZ``w%%'r&   c                    |j                  ddd       |j                  | d       t        |j                  d            j	                          |j                  d      j
                  }t        |      j	                          y)z!Verify desktop layout is optimal.i  i8  )r   r   r   r   r9   N)set_viewport_sizer   r   r>   rp   r?   )r   r   r   rA   s       r$   test_desktop_layoutz(TestResponsiveDesign.test_desktop_layout   sg    >?		ZL
+,t||F#$224,,RSYYw%%'r&   c                    |j                  | d       |j                  d      j                  d      }|j                  d   }d}||z   }||k  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndd	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |      d
z  }t	        j                  d| d| d      dz   d|iz  }	t        t	        j                  |	            dx}x}}y)z=Verify no horizontal scrolling on mobile (responsive design).r   r   zel => el.scrollWidthr      )<=)z%(py0)s <= (%(py2)s + %(py4)s)
body_widthviewport_width)r   r   rm   zHorizontal scroll detected: zpx > pxr   r   N)r   r>   evaluateviewport_sizer   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r!   r\   r   r"   r#   s
             r$    test_no_horizontal_scroll_mobilez5TestResponsiveDesign.test_no_horizontal_scroll_mobile   s    J<z23 !((099:PQ
$227; /0s^a/sz//sssz/sssssszssszssssss^sss^sssasss3OPZ|[`ao`ppr1ssssssssr&   N)r`   ra   rb   rc   r   r   r   r   rd   r&   r$   r   r      s    K ((	tr&   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestAccessibilityzAccessibility compliance tests.c                    |j                  | d       |j                         }t        |      }d}||kD  }|st        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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}x}}d}||k7  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
t        j                  d|       dz   d|
iz  }t        t        j                  |            dx}	}y)z2Verify page has a title for SEO and accessibility.r   r   rh   )z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)srQ   titlerS   zPage has no titlerV   rW   NUntitled)!=)z%(py0)s != %(py3)sr-   zPage has placeholder title: r0   r   )r   r   rQ   r   r   r   r   r   r   r   r   r   )r   r   r   r   r4   r\   r    r]   r^   r   r5   r"   s               r$   test_page_has_titlez%TestAccessibility.test_page_has_title   s    		ZL
+,

5z2A2zA~222zA222222s222s22222252225222z222A22222222222"Ju
"JJJu
JJJJJJuJJJuJJJ
JJJ&B5'$JJJJJJJr&   c                 \   |j                  | d       |j                  d      }|j                         }|dkD  rt        |      D ]  }|j	                  |      }|j                  d      }d}||u}	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
t        j                  d	| d
      dz   d|
iz  }t        t        j                  |            dx}	} yy)z/Verify images have alt text for screen readers.r   imgr   altN)is not)z%(py0)s is not %(py3)sr-   zImage z missing alt attributer0   r   )r   r>   rq   rangenthget_attributer   r   r   r   r   r   r   r   r   )r   r   r   imagesimage_countir   r   r4   r   r5   r"   s               r$   test_images_have_alt_textz+TestAccessibility.test_images_have_alt_text   s    		ZL
+,e$lln?;' Kjjm''. #'Js$JJJs$JJJJJJsJJJsJJJ$JJJ&3I(JJJJJJJK r&   c                    |j                  | d       |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                  |      dz  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}y)z1Verify proper heading hierarchy (h1 -> h2 -> h3).r   h1   )>=)z%(py0)s >= %(py3)sh1_countr-   z(Page should have at least one h1 headingr0   r   N)r   r>   rq   r   r   r   r   r   r   r   r   r   )r   r   r   r   r4   r   r5   r"   s           r$   test_headings_hierarchyz)TestAccessibility.test_headings_hierarchy   s    		ZL
+,<<%++- Hx1}HHHx1HHHHHHxHHHxHHH1HHHHHHHHHHr&   c                 6   |j                  | d       |j                  d      }|j                         }|dkD  r^t        |      D ]N  }|j	                  |      }|j                         }|j                  d      }g }	|}
|s|}
|
s
dddt        j                         v st        j                  |      rt        j                  |      ndiz  }|	j                  |       |sXdd	d
t        j                         v st        j                  |      rt        j                  |      nd
iz  }|	j                  |       t        j                  |	d      i z  }t        j                  d| d      dz   d|iz  }t        t        j                   |            dx}
}	Q yy)z"Verify links have accessible text.r   ar   z
aria-labelz%(py2)sr   rI   z%(py4)srm   
aria_labelr   zLink z has no accessible namer   r   N)r   r>   rq   r   r   
inner_textr   r   r   r   r   r   rH   _format_boolopr   r   r   )r   r   r   links
link_countr   linkrI   r   r   r   @py_format3r   r"   r#   s                  r$    test_links_have_accessible_namesz2TestAccessibility.test_links_have_accessible_names   s   		ZL
+,S![[]
>:& Nyy|(!//=
 NtMtzMMMMMMtMMMtMMMMtMMMMMzMMMzMMMMMMMMMU1#5L+MMMMMMMMN r&   N)r`   ra   rb   rc   r   r   r   r   rd   r&   r$   r   r      s    )KKINr&   r   c                       e Zd ZdZd Zd Zy)TestSEOBasicszBasic SEO requirements.c                 N    |j                  | d       |j                  d      }y)z'Verify meta description exists for SEO.r   zmeta[name="description"]N)r   r>   )r   r   r   	meta_descs       r$   test_meta_description_presentz+TestSEOBasics.test_meta_description_present   s$    		ZL
+,LL!;<	r&   c                 ~   |j                  | d       |j                  d      }|j                         }d}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}|j                  d      }	d}
|
|	v }|st        j                  d|fd|
|	f      t        j                  |
      dt        j                         v st        j                  |	      rt        j                  |	      nddz  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}
}y)z$Verify viewport meta tag for mobile.r   zmeta[name="viewport"]r   rh   )z%(py0)s > %(py3)srq   r-   z:Missing viewport meta tag (required for responsive design)r0   r   Ncontentzwidth=device-width)in)z%(py1)s in %(py3)s)rT   r.   z/Viewport meta should include width=device-width)r   r>   rq   r   r   r   r   r   r   r   r   r   r   )r   r   r   viewport_metarq   r4   r   r5   r"   r   r   s              r$   test_viewport_meta_tagz$TestSEOBasics.test_viewport_meta_tag  s   		ZL
+,%<=##%VuqyVVVuqVVVVVVuVVVuVVVqVVVVVVVVVV--i8#a#w.aaa#waaa#aaaaaawaaawaaaa0aaaaaaar&   N)r`   ra   rb   rc   r   r   rd   r&   r$   r   r      s    !=
br&   r   c                   "    e Zd ZdZd Zd Zd Zy)TestPerformanceMetricsz#Performance monitoring and metrics.c                    g |j                  dfd       |j                  | d       |j                  d       t              }d}||k  }|st	        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  }t	        j                  dt                     dz   d|iz  }t        t	        j                  |            dx}x}}y)z-Verify page doesn't load excessive resources.requestc                 &    j                  |       S )N)rH   )reqrequestss    r$   rL   zGTestPerformanceMetrics.test_resource_count_reasonable.<locals>.<lambda>  s    xs'; r&   r   r8   d   r)   )z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} < %(py6)srQ   r   rS   zToo many network requests: rV   rW   N)rY   r   r2   rQ   r   r   r   r   r   r   r   r   r   )	r   r   r   r4   r\   r    r]   r^   r   s	           @r$   test_resource_count_reasonablez5TestPerformanceMetrics.test_resource_count_reasonable  s    	;<		ZL
+,  / 8}QsQ}s"QQQ}sQQQQQQsQQQsQQQQQQ8QQQ8QQQ}QQQsQQQ&A#h-$QQQQQQQQr&   c                   
 g 
|j                  d
fd       |j                  | d       |j                  d       
D cg c]  }d|j                         vr| }}t	        |      }d}||k(  }|st        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  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            dx}x}}yc c}w )z'Verify all resources load successfully.r   c                 \    | j                   dk\  rj                  | j                        S d S )Ni  )r   rH   url)respfailed_resourcess    r$   rL   zATestPerformanceMetrics.test_no_failed_resources.<locals>.<lambda>!  s(    dkk]`N`)9)@)@)J fj r&   r   r8   rM   r   r	   rP   rQ   critical_failuresrS   zFailed resources: rV   rW   NrX   )r   r   r   r   r   r4   r\   r    r]   r^   r   s             @r$   test_no_failed_resourcesz/TestPerformanceMetrics.test_no_failed_resources  s   
jk		ZL
+,  / ,
		+ 
 

 $%TT%*TTT%TTTTTTsTTTsTTTTTT$TTT$TTT%TTTTTT.@AR@S,TTTTTTTT
s   F
c                     g |j                  dfd       |j                  | d       |j                  d       rt        d        yy)z5Warn if resources are too large (performance impact).r   c                    | j                   ryt        | j                         xs d      dkD  rYj                  | j                  | j                   r/| j                         rt        | j                               d      S dd      S d S )Nr&   i  r   )r   size)okrQ   r   rH   r   )r   large_resourcess    r$   rL   zETestPerformanceMetrics.test_large_resources_warning.<locals>.<lambda>2  sz     gg#diik0S1G; *9)?)?88(,DIIKC		$A
 * EFA
 *  BF r&   r   r8   z#Warning: Large resources detected: N)rY   r   r2   print)r   r   r   r   s      @r$   test_large_resources_warningz3TestPerformanceMetrics.test_large_resources_warning.  s[    
 F 	G
 			ZL
+,  / 77HIJ r&   N)r`   ra   rb   rc   r   r   r   rd   r&   r$   r   r     s    -	RU"Kr&   r   c                   Z    e Zd ZdZd Zej                  j                  d      d        Zy)TestHeroSectionzr
    Test hero section with demo video/audio.

    Based on DEMO_RECORDING_SUMMARY.md hero page requirements.
    c                     |j                  | d       |j                  d      j                  }|j                         dkD  rt	        |      j                          yy)z!Verify hero section is prominent.r   z$section.hero, .hero, [class*="hero"]r   N)r   r>   r?   rq   r   rp   )r   r   r   rr   s       r$   test_hero_section_visiblez)TestHeroSection.test_hero_section_visibleF  sQ    		ZL
+, ||BCII ::<!4L&&( r&   z(Demo audio/video may not be deployed yet)reasonc                    |j                  | d       |j                  d      }|j                         dkD  r&t        |      j	                          |j                  d      }|j                  } |       }d}||kD  }|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  }	t        j                  d	      d
z   d|	iz  }
t        t        j                  |
            dx}x}x}}yy)z
        Verify demo audio is embedded in hero.

        From DEMO_RECORDING_SUMMARY.md:
        Hero page should have audio overlay with AIVA voice demo.
        r   audior   zaudio sourcerh   rj   sourcesrl   zAudio element has no sourcesrn   ro   N)r   r>   rq   r   to_be_attachedr   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r!   rs   r\   r#   rt   s              r$   test_audio_element_presentz*TestHeroSection.test_audio_element_presentQ  s     			ZL
+,W%;;=15M((* ll>2G==F=?FQF?Q&FFF?QFFFFFF7FFF7FFF=FFF?FFFQFFF(FFFFFFFF r&   N)	r`   ra   rb   rc   r   pytestmarkskipr   rd   r&   r$   r   r   ?  s6    	) [[GHG IGr&   r   )rc   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r   r1   playwright.sync_apir   r   rf   r   r   r   r   r   rd   r&   r$   <module>r      sr       &8U 8Uv@/ @/F4t 4tn1N 1Nhb b4-K -K`$G $Gr&   