
    
iJ9                        d Z ddlZddlZddlZddlZddlZddlZddlmZ  e	 ee
      j                         j                  d         Zeej                  vrej                  j                  de       ddlZddlmZmZmZmZ ddlmZmZmZmZ ddlmZ  ej:                  ej<                  dd	
        ej>                  e       Z!ddddddddddddgZ"ej                  jG                  eddd      Z$de%de	fdZ& G d d      Z'd Z(d Z)d Z*d Z+d Z,d  Z-d! Z.d" Z/e d#k(  r* ej`                   e/             Z1 ejd                  e1       yy)$u   
test_heatmap.py — Integration tests for the Heatmap Audit Generator.

Tests each component (scraper, analyzer, PDF generator) with real businesses.
Run: python -m scripts.heatmap_audit.test_heatmap
    N)Path   )
scrape_allfetch_pagespeedfetch_brave_searchfetch_website_basics)analyzecalculate_scorescalculate_overall_scoregenerate_recommendations)generate_pdfz'%(asctime)s [%(levelname)s] %(message)sz%H:%M:%S)levelformatdatefmthttps://www.jimsmowing.com.auJim's Mowing	Australia)urlnamelocationzhttps://www.kennards.com.auzKennards Hirezhttps://www.bunnings.com.auBunningsdataheatmap_reportstestpassedreturnc                     | rdS dS )NPASSFAIL )r   s    ;/mnt/e/genesis-system/scripts/heatmap_audit/test_heatmap.py_result_tagr"   B   s    6''    c                   .    e Zd Zd ZddededefdZd Zy)	
TestRunnerc                 .    d| _         d| _        g | _        y )Nr   )r   failedresults)selfs    r!   __init__zTestRunner.__init__G   s    r#   r   	conditiondetailc                     t        |      }|r| xj                  dz  c_        n| xj                  dz  c_        | j                  j	                  |||f       t        d| d| |rd| nd        y )N   z  [z] u    —  )r"   r   r'   r(   appendprint)r)   r   r+   r,   tags        r!   checkzTestRunner.checkL   si    )$KK1KKK1KT9f56C54&V5!1 DEFr#   c           	          | j                   | j                  z   }t        dd        t        d| j                    d| d| j                   d       t        d        | j                  dk(  S )N
<============================================================z  RESULTS: /z	 passed, z failedr   )r   r'   r1   )r)   totals     r!   summaryzTestRunner.summaryU   s`    dkk)6(mDKK=%	$++gNO{{ar#   N)r/   )__name__
__module____qualname__r*   strboolr3   r9   r    r#   r!   r%   r%   F   s*    
G# G$ G G r#   r%   c           	        K   t        d       d}t        | |       d{   }|j                  d|dud|rt        |      nd d       |r|j                  dd	|v d
|j	                  d	d              |j                  dd|v d
|j	                  dd              |j                  dd|v d|j	                  dd       d       |j                  dd|j	                  d	d      cxk  xr dk  nc        yy7 ׭w)z,Test PageSpeed Insights API with a real URL.z!
--- Test: PageSpeed Insights ---r   NzPageSpeed returns dataGot r    fieldszMobile score presentmobile_performance_scoreScore: N/AzDesktop score presentdesktop_performance_scorezMobile FCP presentmobile_fcp_mszFCP: mszScores are valid ranged   )r1   r   r3   lenget)sessionrunnerr   results       r!   test_scraper_pagespeedrO   ]   s    	
./
)C"7C00F
LL d
fs6{!,G4 "&&0fjj!;UCDE	

 	#'61fjj!<eDEF	

 	 v%FJJ67r:	

 	$6;BsB	
!  1s   C9C7CC9c           	        K   t        d       t        | dd       d{   }|j                  d|dud|rt        |      nd d       |rv|j                  d	d
|v d|j	                  d
d              |j                  dd|v d|j	                  dg               |j                  d|j	                  d
d      dkD         yy7 w)zTest Brave Search API.z
--- Test: Brave Search ---r   r   NzBrave Search returns datar@   r   rA   zSearch result count presentsearch_result_countz	Results: zSocial profiles detectedsocial_profileszFound: zHas search results)r1   r   r3   rJ   rK   rL   rM   rN   s      r!   test_scraper_braverT      s     	
()%g~{KKF
LL#d
fs6{!,G4 )!V+

#8!<=>	

 	&'fjj!2B789	

 	 JJ,a014	
  Ls   CCB$Cc           	      B  K   t        d       t        | d       d{   }|j                  d|dud|rt        |      nd d       |r|j                  d|j	                  d	d
             |j                  dd|v d|j	                  d              |j                  d|j	                  dd
      d|j	                  dd      dd         |j                  dd|v d|j	                  d              |j                  dd|v d|j	                  dd              yy7 w)zTest direct website scraping.z
--- Test: Website Basics ---r   NzWebsite scrape returns datar@   r   rA   zSite is reachableis_reachableFzSSL detectedhas_sslzSSL: zTitle tag found	has_titlezTitle: 	title_tagr/   2   zMeta description checkhas_meta_descriptionz
Has meta: zH1 count trackedh1_countzH1s: )r1   r   r3   rJ   rK   rS   s      r!   test_scraper_websiter]      s>    	
*+'1PQQF
LL%d
fs6{!,G4 JJ~u-	
 	FJJy)*+	

 	JJ{E*fjjb1#2678	

 	$"f,$:;<=	

 	& FJJz1-./	
)  Rs   DDD Dc           	      @  K   t        d       t        D ]  }t        j                         }t        |d   |d   |d   |        d{   }t        j                         |z
  }|j	                  d|d    |du|dd	       |sq|j	                  d
|d    dt        |j                  d                   |j	                  d
|d    dt        |j                  d                   |j	                  d
|d    dt        |j                  d                    y7 ԭw)z(Test scrape_all for all test businesses.z+
--- Test: Full Scrape (all businesses) ---r   r   r   r   business_namer   rL   NzScrape .1fs  z has pagespeed data	pagespeedz has brave databravez has website datawebsite)r1   TEST_BUSINESSEStimer   r3   r>   rK   )rL   rM   bizstartrN   elapseds         r!   test_full_scraperl      s'    	
89 		!E
f+_	
 
 ))+%c&k]#$sm1	
 LLS[M!45VZZ,- LLS[M1VZZ() LLS[M!23VZZ	*+3
s   ADD<DBDc                    t        d       | D ]j  }|j                  dd      }t        |      \  }}|j                  d| dt	        |      t        |       d       |j                  di       j                  dd	      }|j                  d
| dd|cxk  xr dk  nc d|        |j                  d
| dt        |      dkD  t        |       d       g d}|D ]@  }|j                  d
| d| ||v d|j                  |i       j                  dd              B t        d| d       |D ]6  }|j                  |i       j                  dd      }	t        d| d|	 d       8 t        d| d       m y)z Test analyzer with scraped data.z
--- Test: Analyzer ---r`   UnknownzAnalyze u    — scores generatedz categoriesoverallscorerH   rc   z overall score validr   rI   rC   z has recommendationsz recommendations)website_speedmobile_experienceonline_presence
seo_basicsai_readinessz has rD   z    Scores for :z      z: z/100z      OVERALL: N)r1   rK   r	   r3   r>   rJ   )
scraped_data_listrM   scrapedr   scoresrecommendationsro   expected_catscatrb   s
             r!   test_analyzerr}      s   	
$%$ %/{{?I6")'"2tf12L6{m;'	
 **Y+//<*+CgY	
 	*+ 1$?#$$45	
 p  	CLLTF%u%v&**S"-11'5ABC	 	vQ'(  	+C

3#''3AF3%r!D)*	+ 	y-.K%/r#   c                 &   t        d       t        j                  t        d       | D ]/  }|j	                  dd      }t        |      \  }}|j                         j                  dd      j                  dd	      }t        j                  j                  t        | d
      }	 t        ||||d|j	                  dd            }|j                  d| t        j                  j                  |      d|        t        j                  j                  |      r>t        j                  j                  |      }	|j                  d| d|	dkD  d|	dd       2 y# t        $ r*}
|j                  d| dt        |
             Y d}
~
bd}
~
ww xY w)z'Test PDF generation for all businesses.z
--- Test: PDF Generator ---Texist_okr`   rn   'r/    _z_ai_score.pdfz+61 7 3130 4377r   )r`   ry   rz   output_path	phone_ctawebsite_urlzPDF generated for zPath: rc   z PDF size validi   zSize: ,z byteszPDF generation for FN)r1   osmakedirs
OUTPUT_DIRrK   r	   lowerreplacepathjoinr   r3   existsgetsize	Exceptionr=   )rw   rM   rx   r   ry   rz   	safe_namepdf_pathresult_pathsizees              r!   test_pdf_generatorr     sm   	
)*KK
T*$  F{{?I6")'"2JJL((b199#sC	77<<
yk,GH	F&" /$+#KKr2K LL$TF+{+& ww~~k*ww{3o.4KT!HF+3 F>  	FLL.tf5uc!fEE	Fs   %B4E	F&FFc                 ~   t        d       ddi i i d}t        |      \  }}| j                  dd|v d|j                  di       j                  dd	              d
di ddddddddddd}t        |      \  }}| j                  d|j                  di       j                  dd      dk  d|j                  di       j                  dd	              | j                  d|j                  di       j                  dd      dk\  d|j                  di       j                  dd	              ddddddddddd d!d"d#d$dg d%d"d"dd&i d'd"d(d"d)d"d*d"d+d,d-d"d.d/d0d1d2d"d3d"d4d5d6dd7d"d8d"d9d"d:d;d<gd=d d}t        |      \  }}	| j                  d>|j                  di       j                  dd      d?k\  d|j                  di       j                  dd	              | j                  d@|j                  di       j                  dd      dk  d|j                  di       j                  dd	              yA)Bz"Test analyzer with edge case data.z"
--- Test: Analyzer Edge Cases ---z
Empty Corpr/   )r`   r   rd   re   rf   z Empty data produces valid scoresro   z	Overall: rp   rD   zDead Site Ltdz-https://definitely-not-a-real-site-abc123.com   r   F)rQ   social_profile_counthas_google_businesshas_directory_listingsreview_mentions)rV   rW   status_codezUnreachable site scores lowrI   rZ   z&Unreachable site has high AI readinessru   P   zAI Readiness: zPerfect Inczhttps://perfect.com_   c   b   i   i  i  i  g{Gz?T)rB   rE   mobile_seo_scoremobile_accessibility_scoremobile_best_practices_scorerF   mobile_lcp_msmobile_speed_index_msmobile_tti_ms
mobile_clshas_mobile_viewporti  )Facebook	InstagramLinkedInYouTubeTwitter)rQ   r   rR   r   r   r   rV   rW   r   rX   rY   u    Perfect Inc — The Best Companyr[   meta_descriptionz;We are the best company with amazing services for everyone.r\   r.   has_schema_markuphas_og_tagstotal_images
   images_without_althas_chat_widgethas_booking_systemhas_phone_visiblepage_social_linksfacebook	instagram
word_countzPerfect site scores highF   z!Perfect site has low AI readinessN)r1   r	   r3   rK   )
rM   emptyry   recsunreachablescores2recs2perfectscores3recs3s
             r!   test_analyzer_edge_casesr   <  s+   	
/0 &E 5>LFD
LL*V
FJJy"-11'5ABC )>)*A).%%&( %*eANK [)NGU
LL%Ir"&&w4r9
GKK	2.227EBCD
 LL0NB'++GQ72=
^R8<<WeLMN '$(*)+ #*,+. !%)!#'
 $($%Z#'&* 

D
t
 "4
 	

 ;
 #D
  ]
 
  
 4
 B
 !!
 t
 !$
  
   *k!:!
" $#
1+GX W%NGU
LL"Ir"&&w2b8
GKK	2.227EBCD
 LL+NB'++GS9B>
^R8<<WeLMNr#   c                  R  K   t        d       t        d       t        d       t        d       t               } t        j                         }t        j                  dd      }t        j
                  |      4 d {   }t        ||        d {    t        ||        d {    t        ||        d {    g }t        D ]3  }t        |d   |d	   |d
   |       d {   }|j                  |       5 d d d       d {    t        |        t        |        t        ||        t        j                         |z
  }t        d|dd       | j                         }t         j"                  j%                  t&        d      }	t!        j(                  t&        d       t+        |	d      5 }
t-        j.                  t        j0                  d      | j2                  | j4                  z   | j2                  | j4                  t7        |d      | j8                  D cg c]  \  }}}|||d c}}}d|
d       d d d        t        d|	        t        dt&                |rdS dS 7 7 7 7 7 7 s# 1 d {  7  sw Y   xY wc c}}}w # 1 sw Y   ^xY ww)Nr6   u(     HEATMAP AUDIT GENERATOR — TEST SUITEz+  Testing with 3 real Australian businessesF   )ssllimit)	connectorr   r   r   r_   z
Total test time: ra   rb   ztest_results.jsonTr   wz%Y-%m-%dT%H:%M:%Sr.   )r   r   r,   )	timestamptotal_testsr   r'   elapsed_secondstestsr   )indentz
Test results saved to: zTest PDFs saved to: r   )r1   r%   rh   aiohttpTCPConnectorClientSessionrO   rT   r]   rg   r   r0   r}   r   r   r9   r   r   r   r   r   openjsondumpstrftimer   r'   roundr(   )rM   total_startr   rL   rw   ri   r   total_elapsed
all_passedresults_pathfr   r   r,   s                 r!   mainr     sj    	(O	
45	
78	(O\F))+K $$b9I$$y9 + +W %Wf555 &111"7F333 " 	+C#J!&kZ	 D $$T*	++ +& #V, V$ (&1IIK+-M	c2!
45!J 77<<
,?@LKK
T*	lC	  A		':;!==6==8mmmm$]A6 -3NN (D&& 6B

 Q
	 
%l^
45	 
-.1!!e+ 	613
+ + + +T s   A<J'>I,?J'I>I/I>&I2'I>:I5;*I>%I8&I>=J'I;	B)J'2A-JJ0J>/J'/I>2I>5I>8I>;J'>JJJJ'JJ$ J'__main__)3__doc__asyncior   sysrh   r   loggingpathlibr   r=   __file__resolveparentsPROJECT_ROOTr   insertr   scripts.heatmap_audit.scraperr   r   r   r   scripts.heatmap_audit.analyzerr	   r
   r   r   #scripts.heatmap_audit.pdf_generatorr   basicConfigINFO	getLoggerr:   loggerrg   r   r   r>   r"   r%   rO   rT   r]   rl   r}   r   r   r   run	exit_codeexitr    r#   r!   <module>r      s    	 
     4>))+33A67sxxHHOOA|$    =   
,,4
 
		8	$
 / - -$ WW\\,0A6J
( ( (   . 
F
:$
N F)/X&FR`F="@ zDF#ICHHY r#   